Oracle在Ubuntu上的日志文件主要分為兩類,路徑由ORACLE_BASE
(數據庫基礎目錄,默認如/u01/app/oracle
)和數據庫名稱(db_name
)、實例名稱(instance_name
,通常與數據庫名一致)決定:
ORACLE_BASE/diag/rdbms/db_name/instance_name/trace/alert_instance_name.log
(例如/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
)。trace
目錄),文件名通常為ora_進程ID.trc
(例如ora_1234.trc
)。ORACLE_BASE/oradata/db_name/
目錄下,文件名為redo01.log
、redo02.log
等(循環使用)。SHOW PARAMETER LOG_ARCHIVE_DEST
命令查看(默認在ORACLE_BASE/archivelog/
目錄下)。tail -f
命令跟蹤最新日志條目,例如:tail -f /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
tail
、less
或more
命令查看(如less
分頁查看):less /u01/app/oracle/diag/rdbms/orcl/orcl/trace/ora_1234.trc
tkprof
工具將Trace文件轉換為易讀的報告(需指定原始Trace文件和輸出文件):tkprof /u01/app/oracle/diag/rdbms/orcl/orcl/trace/ora_1234.trc output_analysis.txt
SELECT * FROM v$diag_info WHERE name = 'Default Trace File';
SELECT * FROM v$log;
SELECT dest_name, status, destination FROM v$archive_dest;
為避免日志文件過大占用磁盤空間,需通過Ubuntu的logrotate
工具實現自動輪轉。以下是針對Oracle Alert日志的配置示例:
sudo apt-get update && sudo apt-get install logrotate
sudo nano /etc/logrotate.d/oracle
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log {
daily # 每天輪轉
missingok # 若日志不存在也不報錯
rotate 7 # 保留最近7個日志文件
compress # 壓縮舊日志(使用gzip)
notifempty # 日志為空時不輪轉
create 640 oracle oinstall # 新日志的權限和所有者
postrotate # 輪轉后執行的命令(通知Oracle重新打開日志)
/bin/kill -HUP `cat /u01/app/oracle/diag/rdbms/orcl/orcl/pid`
endscript
}
sudo logrotate -f /etc/logrotate.d/oracle
/var/lib/logrotate/status
文件,確認輪轉記錄。-- 檢查當前歸檔模式
SELECT log_mode FROM v$database;
-- 開啟歸檔模式(需關閉數據庫后執行)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
SELECT dest_name, status, destination, space_used/1024/1024 "Used(MB)", space_limit/1024/1024 "Limit(MB)"
FROM v$archive_dest;
RMAN> DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK;
-- 生成AWR報告(需sysdba權限)
EXEC dbms_workload_repository.create_awr_report(
l_dbid => (SELECT dbid FROM v$database),
l_inst_num => (SELECT instance_number FROM v$instance),
l_bid => (SELECT min(snap_id) FROM dba_hist_snapshot WHERE dbid = (SELECT dbid FROM v$database) AND instance_number = (SELECT instance_number FROM v$instance)),
l_eid => (SELECT max(snap_id) FROM dba_hist_snapshot WHERE dbid = (SELECT dbid FROM v$database) AND instance_number = (SELECT instance_number FROM v$instance))
);
-- 輸出報告到文件(需配合UTL_FILE包或外部工具)
640
),所有者為oracle:oinstall
(避免未授權訪問):sudo chown oracle:oinstall /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
sudo chmod 640 /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log