最可靠方法是查询V$DATABASE视图:SELECT LOG_MODE FROM V$DATABASE;返回ARCHIVELOG或NOARCHIVELOG,RAC环境需各节点单独查,且归档模式切换必须停库至MOUNT状态执行ALTER DATABASE ARCHIVELOG。
如何确认当前数据库是否处于归档模式
直接查 v$database 视图最可靠,别信 archive log list 的缓存输出——它可能没刷新。尤其在 rac 环境下,每个实例要单独查。
-
SELECT LOG_MODE FROM V$DATABASE;—— 返回ARCHIVELOG或NOARCHIVELOG - 如果返回
NOARCHIVELOG但你刚执行过ARCHIVE LOG START,别慌,那命令已失效(12c+ 被废弃),实际模式没变 - RAC 中某节点显示
ARCHIVELOG,其他节点却是NOARCHIVELOG?说明参数未同步或实例未重启,不能算真正切换成功
从 NOARCHIVELOG 切到 ARCHIVELOG 的硬性前提
必须停库、挂载、再开启归档,没有在线切换这回事。想“不中断业务”?做不到——除非你用 Data Guard 切换主备角色来间接实现。
- 确保
DB_RECOVERY_FILE_DEST或LOG_ARCHIVE_DEST_1已设且路径可写(否则ALTER DATABASE ARCHIVELOG报ORA-00258) - 关闭数据库:
SHUTDOWN IMMEDIATE,不能是SHUTDOWN NORMAL(会等会话自然退出,归档切换不认这个) - 启动到
MOUNT状态后执行:ALTER DATABASE ARCHIVELOG;,再ALTER DATABASE OPEN; - 切完立刻跑一次
ARCHIVE LOG CURRENT;,然后检查V$ARCHIVED_LOG是否有新记录,验证归档进程是否真在写
ARCHIVELOG 模式下禁用归档的后果与替代方案
没有“临时关归档”的安全操作。强行 ALTER DATABASE NOARCHIVELOG 只能在 MOUNT 状态下执行,且会清空所有归档日志链,备份策略立即失效。
- 执行前必须确认:全库冷备已完成,且后续接受无法做增量备份 + 丢失自上次备份以来所有事务的风险
- 常见误操作:
ALTER SYSTEM ARCHIVE LOG STOP;—— 这只是停归档进程,模式仍是ARCHIVELOG,日志组满时数据库照样挂起(报ORA-00257) - 如果只是想减少归档量,优先调
LOG_ARCHIVE_MIN_SUCCEED_DEST或改用STANDBY目标而非LOCAL,别碰模式切换
归档路径配置错误导致的典型故障现象
归档失败不会马上报错,而是悄悄卡住日志切换,直到 LOG_BUFFER 溢出,最终表现为会话 hang 在 DML 上,V$INSTANCE 的 STATUS 仍是 OPEN,但什么都干不了。
- 检查
V$ARCHIVE_DEST_STATUS,重点关注STATUS列是否为VALID,ERROR列是否有内容(如ORA-19504表示写入失败) -
LOG_ARCHIVE_DEST_1值里含MANDATORY但目标不可达?整个归档会阻塞,换成OPTIONAL可保主库运行,但得承担丢失该路归档的风险 - Linux 下路径权限不对、磁盘满、SELinux 限制都可能让归档静默失败,别只盯 Oracle 日志,还得看系统
dmesg和df -h
归档模式不是开关,是备份能力的基石;切换动作本身简单,但上下游依赖(备份脚本、RMAN 配置、DG 同步状态)一旦漏掉一个,后面恢复时就只剩沉默和后悔。










