第一阶段:检查当前状态
无论哪个版本,首先登录数据库查看是否为归档模式。
-- 以 sysdba 身份登录
sqlplus / as sysdba
-- 查看归档模式
archive log list;
-- 或者
select name, log_mode from v$database;
如果 log_mode 为 NOARCHIVELOG,则需要开启归档。
第二阶段:配置归档路径(版本差异重点)
在数据库未启动(mount状态)之前,需要先设置归档存放的位置。不同版本的推荐配置方式有所不同:
1. Oracle 10g 及之前版本(传统方式)
通常使用 log_archive_dest 和 log_archive_format 参数
-- 修改归档路径(10g及之前)
alter system setlog_archive_dest_1='location=/u01/app/oracle/archivelog'scope=spfile;
-- 修改归档格式(10g及之前常用格式)
alter system setlog_archive_format='arch_%t_%s_%r.arc'scope=spfile;
2. Oracle 11g 及之后版本(推荐使用快速恢复区)
Oracle 11g及更高版本(12c, 18c, 19c, 21c)建议使用 快速恢复区(Fast Recovery Area, FRA) 进行自动管理。
-- 设置快速恢复区路径(Linux目录需提前创建好,并赋予Oracle属主权限)
alter system setdb_recovery_file_dest='/u01/app/oracle/fast_recovery_area'scope=both;
-- 设置快速恢复区大小(根据磁盘空间调整)
alter system setdb_recovery_file_dest_size=50g scope=both;
-- 设置归档格式(11g+通常保持默认即可)
alter system setlog_archive_format='%t_%s_%r.dbf'scope=spfile;
注意:
第三阶段:开启归档模式(操作一致)
这一步在所有版本中几乎完全一样。
--1. 关闭数据库(必须用 immediate 或 transactional)
shutdown immediate;
--2. 启动数据库到 mount 状态(加载控制文件但不打开数据文件)
startup mount;
--3. 开启归档模式
alter database archivelog;
--4. 将数据库打开
alter database open;
第四阶段:验证并启用自动归档(重要)
验证:
archive log list;
此时应显示 Database log mode: Archive Mode 和 Automatic archival: Enabled。
强制检查自动归档(尤其是10g及以前,有时需手动触发):
-- 执行日志切换,触发归档
alter system switch logfile;
-- 查看归档进程状态(针对9i/10g,检查ARC0进程)
-- 在Linux命令行执行:
ps-ef | grep ora_arc
第五阶段:处理历史归档日志(跨版本通用注意事项)
开启归档后,如果不做清理,磁盘迟早会满,导致数据库 hang 住。不同版本的管理略有不同:
不同版本的注意事项汇总
Linux 系统权限:
无论哪个版本,归档目录的所有者必须是 oracle 用户,组为 oinstall 或 dba。
创建目录:mkdir -p /u01/app/oracle/archivelog
更改权限:chown -R oracle:oinstall /u01/app/oracle/archivelog
Oracle 9i/10g 的特殊问题:
这些版本在Linux上可能默认只有两个归档进程(ARC0, ARC1)。如果系统并发很高,可能需要增加归档进程数:alter system set log_archive_max_processes=4 scope=both;。
这些版本对 log_archive_format 的参数非常敏感,如果格式设置不当,可能导致无法生成归档,数据库在切换日志时会报错。
Oracle 11gR2 的特殊问题:
Oracle 19c 及以上:
快速排错命令(Linux环境)
如果开启归档失败,或者在切换日志时数据库卡住,可以检查:
# 查看 Oracle 告警日志(这是解决归档问题的第一手资料,路径随版本和ORACLE_BASE变化)
tail -200f$ORACLE_BASE/diag/rdbms/$(echo $ORACLE_SID | tr '[:upper:]' '[:lower:]')/$ORACLE_SID/trace/alert_$ORACLE_SID.log
# 检查磁盘空间
df -h /u01/app/oracle/archivelog
# 查看归档进程是否存活
ps-ef | grep arc