1. NOARCHIVELOG 模式
NOARCHIVELOG 是指不保留重做历史记录的日志操作模式。这种操作模式只能用于保护例程失败(例如系统断电),而不能保护介质失败。NOARCHIVELOG 模式具有以下特点:
当检查点完成之后,后台进程LGWR 可以覆盖原有重做日志内容。
如果在数据库备份之后的重做日志内容已经被覆盖,那么当数据文件出现介质失败时,只能恢复到过去的完全备份点。
当数据库处于OPEN 状态时,不能备份数据库。
当执行数据库备份时,必须使用SHUTDOWN NORMAL 或 SHUTDOWN IMMEDIATE 关闭数据库。
当执行数据库备份时,必须备份所有数据文件和控制文件。
2. 在 NOARCHIVELOG 模式下的备份
(1) 列出要备份的数据文件和控制文件。
(2) 关闭数据库。
(3) 复制所有数据文件和控制文件到备份目录。
1) 数据文件出现介质失败但重做日志未被覆盖。
(1) 装载数据库到mount状态。
(2) 确定需要恢复的数据文件。
(3) 复制数据文件备份。
(4) 恢复数据文件。
(5) 打开数据库。
次要数据文件是指只包含次要数据的数据文件。如果次要数据文件出现介质失败,并且备份以来的重做日志内容已经被覆盖,那么可以删除次要数据文件。
(1) 关闭数据库。
(2) 复制所有数据文件和控制文件备份。
(3) 装载数据库到mount状态。
(4) 用RESETLOGS 选项打开数据库。
NOARCHIVELOG 是指不保留重做历史记录的日志操作模式。这种操作模式只能用于保护例程失败(例如系统断电),而不能保护介质失败。NOARCHIVELOG 模式具有以下特点:
当检查点完成之后,后台进程LGWR 可以覆盖原有重做日志内容。
如果在数据库备份之后的重做日志内容已经被覆盖,那么当数据文件出现介质失败时,只能恢复到过去的完全备份点。
当数据库处于OPEN 状态时,不能备份数据库。
当执行数据库备份时,必须使用SHUTDOWN NORMAL 或 SHUTDOWN IMMEDIATE 关闭数据库。
当执行数据库备份时,必须备份所有数据文件和控制文件。
2. 在 NOARCHIVELOG 模式下的备份
(1) 列出要备份的数据文件和控制文件。
(2) 关闭数据库。
(3) 复制所有数据文件和控制文件到备份目录。
(4) 启动例程并打开数据库。
SQL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
SQL> select name from v$datafile
2 union
3 select name from v$controlfile;
NAME
----------------------------------------------------------------------------------------
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\CONTROL01.CTL
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\CONTROL02.CTL
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\CONTROL03.CTL
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\SYSAUX01.DBF
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\SYSTEM01.DBF
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\TESTSPACE01.DBF
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\UNDOTBS01.DBF
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\USERS01.DBF
已选择8行。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\CONTROL01.CTL F:\ORACLE\PRODUCT\10.2.0\backup_ing
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\CONTROL02.CTL F:\ORACLE\PRODUCT\10.2.0\backup_ing
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\CONTROL03.CTL F:\ORACLE\PRODUCT\10.2.0\backup_ing
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\SYSAUX01.DBF F:\ORACLE\PRODUCT\10.2.0\backup_ing
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\SYSTEM01.DBF F:\ORACLE\PRODUCT\10.2.0\backup_ing
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\TESTSPACE01.DBF F:\ORACLE\PRODUCT\10.2.0\backup_ing
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\UNDOTBS01.DBF F:\ORACLE\PRODUCT\10.2.0\backup_ing
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\USERS01.DBF F:\ORACLE\PRODUCT\10.2.0\backup_ing
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 222301060 bytes
Database Buffers 381681664 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
数据库已经打开。
SQL>
3 在NOARCHIVELOG 模式下的恢复1) 数据文件出现介质失败但重做日志未被覆盖。
(1) 装载数据库到mount状态。
(2) 确定需要恢复的数据文件。
(3) 复制数据文件备份。
(4) 恢复数据文件。
(5) 打开数据库。
SQL> desc t_t;
名称 是否为空? 类型
----------------------------------------------------------------- -------- ------------
TEXT VARCHAR2(20)
SQL> insert into t_t values('evan');
已创建 1 行。
SQL> commit;
提交完成。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\USERS01.DBF
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 226495364 bytes
Database Buffers 377487360 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 4: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\USERS01.DBF'
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> select file#,error from v$recover_file;
FILE# ERROR
---------- -----------------------------------------------------------------
4 FILE NOT FOUND
SQL> recover datafile 4;
ORA-00283: 恢复会话因错误而取消
ORA-01110: 数据文件 4: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\USERS01.DBF'
ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 4: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\USERS01.DBF'
SQL> host copy F:\ORACLE\PRODUCT\10.2.0\backup_ing\USERS01.DBF F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE
已复制 1 个文件。
SQL> recover datafile 4;
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL> select * from t_t;
TEXT
--------------------
evan
2) 次要数据文件出现介质失败
次要数据文件是指只包含次要数据的数据文件。如果次要数据文件出现介质失败,并且备份以来的重做日志内容已经被覆盖,那么可以删除次要数据文件。
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------------------------------------------
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\SYSTEM01.DBF
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\UNDOTBS01.DBF
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\SYSAUX01.DBF
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\USERS01.DBF
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\TESTSPACE01.DBF
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\TESTSPACE01.DBF
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 243272580 bytes
Database Buffers 360710144 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 5 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 5: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\TESTSPACE01.DBF'
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> select name from v$datafile where file#=5;
NAME
--------------------------------------------------------------------------------------------------------------------
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\TESTSPACE01.DBF
SQL> alter database datafile 5 offline drop;
数据库已更改。
SQL> alter database open;
数据库已更改。
3)重要数据文件出现介质失败
(1) 关闭数据库。
(2) 复制所有数据文件和控制文件备份。
(3) 装载数据库到mount状态。
(4) 用RESETLOGS 选项打开数据库。
SQL> create table t (id int);
表已创建。
SQL> insert into t values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into t values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> set linesize 120
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 38 52428800 1 NO INACTIVE 8081483 21-8月 -12
2 1 39 52428800 1 NO CURRENT 8109794 22-8月 -12
3 1 37 52428800 1 NO INACTIVE 8052682 20-8月 -12
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
--删除数据文件,模拟数据文件丢失
SQL> ho del G:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 209718148 bytes
Database Buffers 394264576 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 4: 'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF'
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 38 52428800 1 NO INACTIVE 8081483 21-8月 -12
3 1 37 52428800 1 NO INACTIVE 8052682 20-8月 -12
2 1 39 52428800 1 NO CURRENT 8109794 22-8月 -12
SQL> shutdown immediate
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> --复制所有控制文件与数据文件到指定的位置,这里要复制所有的控制文件与数据文件,因为是非归档模式
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 209718148 bytes
Database Buffers 394264576 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。
--只能恢复到我们备份的时间点,所以表t不存在
SQL> desc t
ERROR:
ORA-04043: 对象 t 不存在
在NOARCHIVELOG模式下,RECOVER DATABASE UNTIL CANCEL 命令并未执行任何恢复操作,只是提示控制文件不再使用原有重做日志。