4. 数据库归档模式配置

归档模式是Oracle备份恢复体系的“总开关”。它决定了联机重做日志在被LGWR写满并发生日志切换后,是直接允许被覆盖,还是必须先由归档进程(ARCn)复制成归档日志文件保存下来。理解这一点,才能理解为什么生产库几乎必须运行在ARCHIVELOG模式,以及归档路径、FRA和归档日志管理为什么是DBA日常运维的核心工作。

一、ARCHIVELOG与NOARCHIVELOG的本质区别

在NOARCHIVELOG模式下,数据库发生日志切换时,旧的联机重做日志组被标记为可重用,其中的重做记录随之丢失。这意味着数据库只能恢复到最近一次一致性的全库备份点,备份之后的所有事务无法前滚。因此NOARCHIVELOG只适合测试库、只读报表库或可以随时重建的环境。

在ARCHIVELOG模式下,日志切换触发ARCn把即将被覆盖的联机重做日志内容写出为归档日志文件。只要归档日志链完整,配合全库备份和当前控制文件,就可以做到不完全恢复、时间点恢复(PITR)、基于SCN的恢复,以及Data Guard的日志传输。代价是额外的I/O、归档空间占用和归档失败风险。

切换归档模式需要数据库处于MOUNT状态,且必须先正常关闭再启动到MOUNT:

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
SQL> ARCHIVE LOG LIST;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     1024
Next log sequence to archive   1026
Current log sequence           1026

其中“Automatic archival Enabled”表示ARCn自动归档已开启,这是生产环境的必备状态。若显示Disabled,需要执行 ALTER SYSTEM ARCHIVE LOG START; 或设置 LOG_ARCHIVE_START=TRUE(旧版本)。

ARCHIVELOG 与 NOARCHIVELOG 日志生命周期对比 NOARCHIVELOG 模式 联机日志组1 CURRENT 联机日志组2 ACTIVE 联机日志组3 INACTIVE 日志切换后直接覆盖 重做记录永久丢失 恢复能力:仅能恢复到最近一次一致性全库备份点,备份后事务无法前滚 ARCHIVELOG 模式 联机日志组1 CURRENT 联机日志组2 ACTIVE 联机日志组3 INACTIVE ARCn 归档写出 归档日志文件 FRA / 归档路径 可支持 PITR、Data Guard 恢复能力:全库备份 + 完整归档链 → 可恢复到任意时间点/SCN 前提:归档空间充足、归档链完整、ARCn 正常运行

二、归档路径规划

归档路径决定了归档日志写到哪里。Oracle支持两种方式:一是使用 LOG_ARCHIVE_DEST_n 显式指定本地或远程目录;二是使用 DB_RECOVERY_FILE_DEST(即FRA),由Oracle自动管理目录结构。生产环境通常采用“FRA为主 + 远程备库/备份目录为辅”的组合。

规划归档路径时,需要关注几个关键参数:

  • LOG_ARCHIVE_DEST_1:主归档目标,通常指向FRA或独立归档盘。
  • LOG_ARCHIVE_DEST_2:备用目标,可指向Data Guard备库或远程备份存储。
  • LOG_ARCHIVE_FORMAT:归档文件命名格式,建议包含线程号、序列号和RESETLOGS ID,例如 %t_%s_%r.arc。
  • LOG_ARCHIVE_MAX_PROCESSES:ARCn进程数,默认4,高并发写入场景可适当增加。

一个典型的生产配置示例:

ALTER SYSTEM SET LOG_ARCHIVE_DEST_1=
  'LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=
  'SERVICE=standby1 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=6 SCOPE=BOTH;

注意:LOG_ARCHIVE_FORMAT 是静态参数,修改后需要重启实例。归档路径应避免与数据文件、联机日志放在同一物理磁盘,防止I/O争用和单盘故障导致数据与归档同时丢失。

三、归档日志管理

归档日志会持续增长,管理不当会迅速耗尽磁盘。日常管理包括查看归档状态、监控空间、删除过期归档和验证归档完整性。

查看归档日志信息常用视图:

-- 查看归档目的地状态
SELECT dest_id, status, destination, error FROM V$ARCHIVE_DEST;

-- 查看归档日志历史
SELECT sequence#, first_time, next_time, applied, deleted
FROM V$ARCHIVED_LOG ORDER BY sequence#;

-- 查看FRA空间使用
SELECT name, space_limit/1024/1024 AS limit_mb,
       space_used/1024/1024 AS used_mb,
       space_reclaimable/1024/1024 AS reclaim_mb
FROM V$RECOVERY_FILE_DEST;

删除归档日志必须谨慎。如果归档已备份到磁带或远程存储,并且不再需要用于恢复,可以使用RMAN删除:

RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

切勿直接用操作系统命令 rm 删除归档文件,否则控制文件中仍保留记录,导致RMAN认为归档存在但实际缺失,恢复时才会暴露问题。正确做法是先CROSSCHECK,再DELETE。

生产注意:归档日志删除前必须确认已完成备份,并且没有Data Guard备库仍在等待该归档。删除正在被备库请求的归档会导致备库日志传输中断。

四、FRA配置与生产注意事项

FRA(Fast Recovery Area)是Oracle推荐的集中恢复区域,用于存放归档日志、控制文件自动备份、数据文件副本、闪回日志等。FRA由 DB_RECOVERY_FILE_DEST 和 DB_RECOVERY_FILE_DEST_SIZE 两个参数控制。

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=200G SCOPE=BOTH;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/u01/fra' SCOPE=BOTH;

FRA空间规划需要估算:全库备份大小 + 归档日志日增量 × 保留天数 + 闪回日志 + 控制文件自动备份。例如数据库500GB,每日归档增量20GB,保留7天,则FRA至少需要 500 + 20×7 = 640GB,再留30%余量,建议设置为850GB以上。

FRA空间不足时,Oracle会先删除已备份到磁带且不再需要的归档日志来腾出空间;如果仍不足,数据库可能挂起(ARCHIVER HANG)。因此必须设置合理的 DB_RECOVERY_FILE_DEST_SIZE,并监控 V$RECOVERY_AREA_USAGE。

生产建议:FRA应放在独立的高性能存储上,与数据文件分离;同时配置归档日志的远程备份目标,避免FRA单点故障。对于RAC环境,FRA必须位于共享存储,确保所有实例都能访问。

最后,归档模式配置完成后,务必执行一次完整的验证:手动切换日志触发归档,检查归档文件是否生成、RMAN是否能识别、备库是否能接收。只有归档链完整且可恢复,ARCHIVELOG模式才真正发挥了它的价值。