Oracle数据库的日志体系是其高可用性和可恢复性的核心支撑,主要包括以下几类:
归档日志模式决定了重做日志是否会被保存为归档副本,直接影响数据恢复能力:
SELECT log_mode FROM v$database;
ARCHIVELOG表示开启归档模式,NOARCHIVELOG表示未开启。# 1. 关闭数据库
sqlplus / as sysdba
SQL> SHUTDOWN IMMEDIATE;
# 2. 启动至挂载状态
SQL> STARTUP MOUNT;
# 3. 开启归档模式
SQL> ALTER DATABASE ARCHIVELOG;
# 4. 打开数据库
SQL> ALTER DATABASE OPEN;
# 1. 关闭数据库
sqlplus / as sysdba
SQL> SHUTDOWN IMMEDIATE;
# 2. 启动至挂载状态
SQL> STARTUP MOUNT;
# 3. 关闭归档模式
SQL> ALTER DATABASE NOARCHIVELOG;
# 4. 打开数据库
SQL> ALTER DATABASE OPEN;
$ORACLE_BASE/flash_recovery_area(快速恢复区)。log_archive_dest_n参数设置多个归档位置(建议至少2个,提高冗余性):-- 添加第一个归档路径(强制日志写入磁盘)
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl';
-- 添加第二个归档路径(可选,用于异地备份)
ALTER SYSTEM SET log_archive_dest_2='LOCATION=/mnt/backup/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl';
-- 查看归档目的地状态
SELECT dest_name, status, destination FROM v$archive_dest;
-- 查看归档日志文件列表
SELECT * FROM v$archived_log ORDER BY completion_time DESC;
ALTER SYSTEM ARCHIVE LOG ALL;
-- 删除所有已备份1次的归档日志
DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK;
-- 删除指定时间前的归档日志(如2025-09-01前)
DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-90';
Ubuntu自带的logrotate工具可自动轮转Oracle日志文件(如alert日志、跟踪文件),避免日志文件过大占用磁盘空间。
sudo apt-get update
sudo apt-get install logrotate
/etc/logrotate.d/下新建oracle文件:sudo nano /etc/logrotate.d/oracle
/u01/app/oracle/diag/rdbms/*/*/trace/*.log {
daily # 每天轮转
rotate 30 # 保留30个旧日志
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(避免压缩正在写入的日志)
missingok # 忽略缺失的日志文件
notifempty # 不轮转空日志文件
copytruncate # 复制日志后清空原文件(避免重启Oracle)
}
sudo logrotate -f /etc/logrotate.d/oracle # 强制立即轮转
# 使用tail实时查看(适用于监控实时错误)
tail -f /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
# 使用less查看历史内容
less /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
跟踪文件位于$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/目录下,命名格式为ora_<pid>.trc(后台进程)或<username>_<sid>_<serial#>.trc(用户进程)。
# 实时查看特定跟踪文件
tail -f /u01/app/oracle/diag/rdbms/orcl/orcl/trace/ora_12345.trc
# 使用tkprof格式化跟踪文件(生成易读的报告)
tkprof /u01/app/oracle/diag/rdbms/orcl/orcl/trace/ora_12345.trc /tmp/ora_12345_analysis.txt
LogMiner可提取重做日志中的SQL语句、事务信息,用于数据恢复或审计。
-- 1. 配置UTL_FILE_DIR(允许LogMiner读取文件)
ALTER SYSTEM SET UTL_FILE_DIR='/u01/app/oracle/logminer' SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
-- 2. 创建LogMiner字典文件(存储数据库对象信息)
EXEC DBMS_LOGMNR_D.BUILD(options=>DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);
-- 3. 添加要分析的归档日志
EXEC DBMS_LOGMNR.ADD_LOGFILE(logfilename=>'/u01/app/oracle/archivelog/1_12345.arc', options=>DBMS_LOGMNR.NEW);
-- 4. 开始分析(可添加过滤条件,如时间范围、SCN)
EXEC DBMS_LOGMNR.START_LOGMNR(starttime=>TO_DATE('2025-09-20 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),
endtime=>TO_DATE('2025-09-20 23:59:59', 'YYYY-MM-DD HH24:MI:SS'),
options=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
-- 5. 查询分析结果
SELECT scn, timestamp, sql_redo FROM v$logmnr_contents WHERE seg_owner='SCOTT' ORDER BY scn;
-- 6. 结束分析
EXEC DBMS_LOGMNR.END_LOGMNR;
df -h命令监控$ORACLE_BASE/flash_recovery_area的使用情况,设置告警阈值(如80%)。