Oracle數據庫的日志體系是其高可用性和可恢復性的核心支撐,主要包括以下四類:
V$LOG視圖可查看重做日志組信息(組號、序列號、大小等)。V$ARCHIVED_LOG視圖可監控歸檔日志的狀態(如是否已備份)。Oracle日志文件的默認路徑由ORACLE_BASE(數據庫基礎目錄)決定,具體如下:
$ORACLE_BASE/diag/rdbms/<dbname>/<instancename>/trace/alert_<instancename>.log(記錄數據庫啟動、關閉及錯誤信息)。$ORACLE_BASE/redo0目錄下(默認路徑可通過SHOW PARAMETER LOG_ARCHIVE_DEST確認)。$ORACLE_BASE/diag/rdbms/<dbname>/<instancename>/trace/目錄下(如<instancename>_ora_<pid>.trc,記錄進程異常信息)。alert_racnode1.log)。歸檔日志是介質恢復的關鍵,需確保其正確配置:
-- 查看當前日志模式(需確認是否為NOARCHIVELOG)
SELECT log_mode FROM v$database;
-- 切換到歸檔模式(需重啟數據庫生效)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 查看歸檔目的地及狀態(確保DESTINATION有效且STATUS為VALID)
SELECT dest_name, status, destination FROM v$archive_dest;
-- 查看未歸檔的重做日志(避免日志丟失)
SELECT group#, sequence#, archived, status FROM v$log WHERE archived = 'NO';
-- 強制歸檔當前重做日志(確保所有日志都被歸檔)
ALTER SYSTEM ARCHIVE LOG CURRENT;
-- 刪除已備份1次且過期的歸檔日志(需提前備份)
DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK;
-- 或使用RMAN清理(推薦)
RMAN> DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7' BACKED UP 1 TIMES TO DEVICE TYPE DISK;
使用RMAN(Recovery Manager)定期備份歸檔日志,確保數據可恢復:
rman target /
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;
Ubuntu系統自帶logrotate工具,可實現Oracle日志的自動輪轉、壓縮和刪除,避免日志文件占用過多磁盤空間。
sudo apt-get install logrotate
編輯/etc/logrotate.d/oracle文件(若不存在則新建),添加以下內容:
$ORACLE_BASE/diag/rdbms/*/*/trace/*.log {
daily # 每天輪轉
rotate 30 # 保留30個舊日志
compress # 壓縮舊日志(節省空間)
delaycompress # 延遲壓縮(避免壓縮正在寫入的日志)
missingok # 忽略缺失的日志文件
notifempty # 不為空才輪轉
create 0640 oracle oinstall # 創建新日志的權限和所有者
sharedscripts # 所有日志輪轉完成后執行腳本
postrotate
# 通知Oracle重新打開日志文件(避免日志中斷)
su - oracle -c "lsnrctl reload"
endscript
}
sudo logrotate -f /etc/logrotate.d/oracle # 強制立即輪轉
# 實時查看Alert日志(數據庫告警信息)
tail -f $ORACLE_BASE/diag/rdbms/<dbname>/<instancename>/trace/alert_<instancename>.log
# 實時查看重做日志切換情況
SELECT TO_CHAR(FIRST_TIME, 'YYYY-MM-DD HH24:MI:SS') AS first_time,
TO_CHAR(NEXT_TIME, 'YYYY-MM-DD HH24:MI:SS') AS next_time,
SEQUENCE#, STATUS
FROM V$LOG_HISTORY
ORDER BY FIRST_TIME DESC;
sudo apt-get install logwatch
sudo logwatch --service=oracle --output mail # 發送報告到郵件
-- 啟動LogMiner
EXEC DBMS_LOGMNR.START_LOGMNR(STARTTIME => SYSDATE-1, ENDTIME => SYSDATE);
-- 查詢解析結果
SELECT scn, timestamp, sql_redo FROM V$LOGMNR_CONTENTS WHERE seg_owner = 'SCHEMA_NAME';
-- 結束LogMiner
EXEC DBMS_LOGMNR.END_LOGMNR;
df -h命令監控$ORACLE_BASE目錄的磁盤使用率,設置閾值告警(如80%)。logrotate的rotate參數(如每天輪轉,保留7天)。