Oracle数据库的归档模式(ARCHIVELOG)与非归档模式(NOARCHIVELOG)是备份恢复策略的基础分水岭。非归档模式下,联机重做日志在切换后会被直接覆盖,不产生归档日志文件,这意味着数据库只能保证恢复到最近一次备份的时间点,备份之后的任何数据变更都无法通过日志重放找回来。很多测试环境、小型应用为了性能和运维简单会采用非归档模式,但一旦出现误删数据文件、磁盘损坏等问题,如果没有正确做过备份,数据丢失的风险极高。本文围绕非归档模式下如何做备份、如何恢复展开,给出完整的操作步骤和风险提示。

一、非归档模式的特点与归档状态确认
非归档模式的核心特征是:LGWR进程写入联机重做日志,日志写满后切换到下一组,循环覆写,旧日志内容直接丢失。因此非归档模式只能进行介质恢复到备份时间点,无法做基于时间的_point-in-time_恢复到任意时刻。换句话讲,非归档模式下数据库的一致性只能保证到冷备份那一刻。
在做任何操作之前,先确认数据库当前的归档状态。使用SQL*Plus连接数据库后执行:
-- 以sysdba身份登录 sqlplus / as sysdba -- 查看归档模式 SQL> archive log list; 数据库日志模式 非存档模式 自动存档 禁用 存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 25 当前日志序列 27 -- 或者通过v$database视图查询 SQL> select log_mode from v$database; LOG_MODE ------------ NOARCHIVELOG
输出中显示NOARCHIVELOG即表示处于非归档模式。另外还应记录一些关键信息,包括数据文件位置、控制文件位置和字符集,这些信息在恢复时会用到:
-- 查看数据文件位置 SQL> select name, status from v$datafile; -- 查看控制文件位置 SQL> select name from v$controlfile; -- 查看参数文件位置(spfile或pfile) SQL> show parameter spfile; SQL> show parameter pfile;
建议把这些查询结果保存到操作系统的文本文件中,作为备份清单。恢复时如果记不清文件路径,这份清单能省去大量排查时间。
二、冷备份:非归档模式下最可靠的备份方式
冷备份(Cold Backup)也叫一致性备份,指的是数据库以shutdown normal、shutdown immediate或shutdown transactional方式干净关闭后,在实例离线状态下对所有物理文件进行的拷贝。非归档模式下只能做一致性备份,这是由数据库一致性原理决定的:干净关闭后,所有脏块已经写入数据文件,SCN一致,恢复时直接启动即可,不需要应用任何日志。
完整的冷备份操作步骤如下:
-- 1. 干净关闭数据库 SQL> shutdown immediate; 数据库已经关闭。 数据库已经卸载。 ORACLE 例程已经关闭。 -- 2. 在操作系统层面确认实例已停止 -- Windows下查看服务,Linux下执行ps -ef | grep ora_ -- 3. 拷贝以下文件到备份目录(以Linux为例) -- cp /u01/app/oracle/oradata/orcl/*.dbf /backup/orcl/ -- cp /u01/app/oracle/oradata/orcl/*.ctl /backup/orcl/ -- cp /u01/app/oracle/oradata/orcl/*.log /backup/orcl/ -- spfile如果存在,一并备份 -- cp /u01/app/oracle/product/19c/dbs/spfileorcl.ora /backup/orcl/ -- 同时备份参数文件和密码文件 -- cp $ORACLE_HOME/dbs/orapworcl /backup/orcl/ -- 4. 备份完成后重新启动数据库 SQL> startup;
需要备份的文件清单包括:所有数据文件(.dbf)、所有控制文件(.ctl)、所有联机重做日志文件(.log)、初始化参数文件(spfile或pfile)、密码文件(orapw开头)。特别提醒一点,临时表空间的数据文件可以不备份,恢复后临时文件会自动重建或需要手工添加。
冷备份的优点是概念简单、恢复速度快、风险最低;缺点是备份期间数据库完全不可用,因此只适合可以接受停机窗口的场景,比如夜间批处理完成后的测试库或小规模业务库。备份介质建议同时保留两份,一份本地一份异地,防止备份盘与数据库盘同时损坏。
三、冷备份的恢复操作
非归档模式下恢复非常直接:把备份文件原样拷贝回原来的目录路径(或修改参数文件指向新路径),然后startup即可。因为备份是一致性状态,恢复不需要recover命令,也不需要应用日志。
标准恢复流程演示:
-- 1. 如果实例还在运行,先关闭 SQL> shutdown abort; SQL> startup mount; SQL> shutdown immediate; -- 2. 操作系统层面把备份文件拷贝回原路径 -- cp /backup/orcl/*.dbf /u01/app/oracle/oradata/orcl/ -- cp /backup/orcl/*.ctl /u01/app/oracle/oradata/orcl/ -- cp /backup/orcl/*.log /u01/app/oracle/oradata/orcl/ -- 3. 直接启动数据库 SQL> startup; ORACLE 例程已经启动。 数据库装载完毕。 数据库已经打开。
如果恢复时文件必须放到新目录,比如原磁盘损坏换成了新盘,则可以先把控制文件放好,启动到mount状态后用alter database rename file逐个修改数据文件和日志文件路径:
SQL> startup mount; SQL> alter database rename file '/u01/app/oracle/oradata/orcl/system01.dbf' 2 to '/u02/oradata/orcl/system01.dbf'; -- 对每个数据文件和日志文件重复上述操作 SQL> alter database open;
这里有一个常见的坑:rename file必须使用绝对路径,而且目标文件必须真实存在于操作系统上,路径写错会直接报错。另一个坑是如果参数文件也丢了,需要手工重建pfile,指定control_files参数指向实际的控制文件位置,再用startup pfile='/路径/init.ora' mount的方式启动。
四、非归档模式下的特殊情况:没有备份怎么办
生产中最让人紧张的场景是:数据库处于非归档模式,从来没做过冷备份,数据文件损坏或被误删。此时能用的手段非常有限,但并非完全没救。
如果只是部分非关键数据文件损坏,且这些表空间可以整体丢弃,可以尝试脱机删除该数据文件后强行打开数据库:
SQL> startup mount; SQL> alter database datafile '/u01/app/oracle/oradata/orcl/test01.dbf' offline drop; SQL> alter database open; -- 之后可以删除对应的表空间重建 SQL> drop tablespace test including contents;
注意offline drop并不是真的恢复数据,而是把该数据文件标记丢弃,里面的数据会全部丢失,system和sysaux表空间的数据文件绝不允许这样做,否则数据库无法打开。如果损坏的恰好是system文件,且连一份冷备份都没有,那么能借助的只剩Oracle支持的工具或者按块提取数据的第三方工具,成功率无法保证。这也是为什么强烈建议:非归档模式至少要有周期性的冷备份计划,最好每天一次,且停机窗口内完成。
另一个值得了解的技巧是非归档模式下的BEGIN BACKUP方式:alter tablespace ... begin backup后拷贝数据文件再end backup。这种方式在非归档模式下虽然语法允许,但拷贝出来的文件是模糊备份(fuzzy backup),缺少足够的日志支撑,恢复时大概率无法open,只能作为应急手段而不应作为常规策略。非归档环境的正道始终是干净关闭后的冷备份。
五、建议:尽早切换到归档模式
如果业务对数据有任何恢复到当前时间点的要求,非归档模式都是不够用的。切换到归档模式的操作并不复杂,只需要一次重启:
-- 1. 设置归档路径 SQL> alter system set log_archive_dest_1='location=/archive' scope=spfile; -- 2. 干净关闭并启动到mount SQL> shutdown immediate; SQL> startup mount; -- 3. 打开归档模式 SQL> alter database archivelog; SQL> alter database open; -- 4. 确认 SQL> archive log list; 数据库日志模式 存档模式
开启归档后,就可以使用RMAN做在线热备份,配合归档日志实现不完全恢复和基于时间的恢复,误操作防护能力会有质的提升。如果暂时无法切换,也请务必执行严格的冷备份制度:固定时间、干净关闭、备份全部物理文件、异地存放,并定期做恢复演练。备份的价值只有在成功恢复的那一刻才能体现,没验证过的备份等同于没有备份。
Oracle备份恢复非归档模式Cold Backup修改时间:2026-09-11 06:46:37