Oracle数据库在Linux系统中的日志主要分为以下几类,其默认路径遵循Oracle的诊断框架(ADR,Automatic Diagnostic Repository):
$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/alert_<sid>.log
(如/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
)。$ORACLE_HOME/dbs
或数据目录的redo
子目录)和归档Redo日志(若启用归档模式,路径由LOG_ARCHIVE_DEST_n
参数指定)。$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace
(如alert_<sid>.log
即为Trace文件的一种)。$ORACLE_HOME/admin/<db_name>/diag/tnslsnr/<hostname>/listener/trace/listener.log
。归档日志是Redo日志的备份,用于介质故障恢复,启用归档模式是生产环境的必备操作:
-- 关闭数据库 SHUTDOWN IMMEDIATE; -- 启动到挂载状态 STARTUP MOUNT; -- 启用归档模式 ALTER DATABASE ARCHIVELOG; -- 打开数据库 ALTER DATABASE OPEN;
LOG_ARCHIVE_DEST_n
参数指定归档日志的存储位置(推荐使用快速恢复区DB_RECOVERY_FILE_DEST
简化管理):-- 设置快速恢复区(默认路径为$ORACLE_BASE/flash_recovery_area) ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/u01/app/oracle/flash_recovery_area' SCOPE=SPFILE; -- 设置归档路径为快速恢复区(无需指定具体目录) ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST' SCOPE=SPFILE; -- 重启数据库使参数生效 SHUTDOWN IMMEDIATE; STARTUP;
ARCHIVE LOG LIST; -- 查看归档模式状态、归档路径、当前日志序列号
-- 备份所有归档日志 RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT; -- 删除已备份的归档日志 -- 删除过期的归档日志(保留7天) RMAN> DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7';
tail
命令实时监控Alert日志的关键事件(如错误、警告):tail -f /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
grep
命令筛选出Oracle错误代码(以“ORA-”开头),快速定位问题:grep "ORA-" /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
awk
命令统计每个错误代码的出现次数,优先处理高频错误:grep "ORA-" /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log | awk '{print $NF}' | sort | uniq -c | sort -nr
adrci
命令行工具,可更高效地管理日志:# 查看Alert日志的最新内容(实时更新) adrci> show alert -tail 50 # 搜索特定错误的Trace文件 adrci> set home diag/rdbms/orcl/orcl adrci> search -p "ORA-00600" trace
使用Linux的logrotate
工具定期压缩、删除旧日志,避免日志文件无限增长:
/etc/logrotate.d/
目录下创建oracle
文件:sudo vi /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 root oinstall # 新日志文件的权限和所有者 sharedscripts # 所有日志轮转完成后执行postrotate脚本 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
文件,确认轮转是否成功:cat /var/lib/logrotate/status | grep oracle
chown oracle:oinstall /u01/app/oracle/diag/rdbms/orcl/orcl/trace/*.log chmod 640 /u01/app/oracle/diag/rdbms/orcl/orcl/trace/*.log
rsyslog
或ELK Stack
(Elasticsearch+Logstash+Kibana)工具,将日志发送至中央服务器进行分析。RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT; -- 备份并删除已备份的归档日志
cp
命令复制至备份目录:cp /u01/app/oracle/diag/rdbms/orcl/orcl/trace/*.trc /backup/oracle_trace/