最可靠方法是查询v$database视图,select log_mode from v$database返回archivelog或noarchivelog才是真实状态;archive log list可能缓存旧信息,且需以sysdba连接才准确。
确认当前数据库是否处于归档模式
直接查 v$database 视图最可靠,别信 archive log list 的缓存输出。有些 dba 会看到命令返回 “database log mode: no archive mode”,但实际是上次启动时的状态,没刷新。
- 执行
SELECT log_mode FROM V$DATABASE;—— 返回ARCHIVELOG或NOARCHIVELOG才是真实状态 -
archive log list在 SQL*Plus 里运行前,先确保已连接到SYSDBA:用sqlplus / as sysdba,否则可能报权限错或显示过期信息 - 如果数据库刚启动过但还没切归档,
V$DATABASE和archive log list会一致;但若中途改过参数又没重启,二者可能不一致
切换到 ARCHIVELOG 模式前必须停库重启
Oracle 不允许在线开启归档模式,这是硬限制。很多人卡在 “为什么 ALTER DATABASE ARCHIVELOG 报 ORA-01126” 就是因为没走完整流程。
- 必须先关闭数据库:
SHUTDOWN IMMEDIATE(不能用SHUTDOWN NORMAL,它可能卡住) - 以
MOUNT状态启动:STARTUP MOUNT—— 注意不是OPEN - 此时才能执行:
ALTER DATABASE ARCHIVELOG; - 最后
ALTER DATABASE OPEN;启动服务 - 漏掉
MOUNT直接OPEN后执行,会报ORA-01126: database must be mounted in exclusive mode and not open
归档路径设置:LOG_ARCHIVE_DEST_1 是默认且必需的
只设 LOG_ARCHIVE_DEST(旧参数)在 10g+ 已被废弃,现在必须用 LOG_ARCHIVE_DEST_1,否则归档进程(ARCn)启动失败,日志里反复刷 ORA-16014: log 1 sequence# 123 not archived, no available destinations。
- 推荐写法:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/oradata/PROD/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=PROD'; -
VALID_FOR必须指定,否则 RAC 或 Data Guard 场景下可能归档失败;单机也建议写全,避免未来扩容踩坑 - 路径目录需提前创建并赋予 Oracle 用户读写权限,否则 ARCn 进程静默失败,
ARCHIVE LOG LIST显示 “Automatic archival: Enabled”,但实际无文件生成 - 别用
LOG_ARCHIVE_FORMAT自定义格式除非必要——默认%t_%s_%r.dbf足够清晰,改错会导致归档中断
验证归档是否真正生效
光看 archive log list 显示 “Automatic archival: Enabled” 不代表成功。得看到归档日志物理生成,且 V$ARCHIVED_LOG 有新记录。
- 手动切一次日志:
ALTER SYSTEM SWITCH LOGFILE;(注意不是ARCHIVE LOG CURRENT,后者只归档当前日志,不触发新日志生成) - 检查目录:
ls -lt /u01/oradata/PROD/arch/是否出现新.dbf文件 - 查视图:
SELECT NAME, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY FIRST_TIME DESC FETCH FIRST 3 ROWS ONLY; - 常见假成功:ARCn 进程存在但状态为
WAITING(查V$PROCESS),说明路径不可写或磁盘满;这时V$ARCHIVED_LOG无新增,但archive log list仍显示启用
归档路径权限、磁盘空间、LOG_ARCHIVE_DEST_1 的语法细节,这三个地方出问题的概率加起来超过八成。别急着改其他参数,先盯死这三项。










