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天)。