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/