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