在用户管理的备份模式下,如果是在线备份,在必须先启动beging backup,也就是热备份模式,以恢复可能出现的断裂快。
启动了begin backup后,数据库会冻结表空间或数据库对应数据文件的文件头的checkpoint_change#,不过在冻结之前会先发出一次检查点,并将该检查点前的所有事务应用都固化到数据文件,然后冻结这个SCN,直到使用END BACKUP,使备份过程结束,再更新为新的SCN,冻结的原因是因为使用操作系统命令拷贝数据文件时,他不能保证第一个读取的块就是数据文件头,如果不冻结,则可能从备份开始,已经多次更新了文件头,而此时文件头还没有被拷贝,这样等文件头被拷贝后,他的SCN已经远远大于了数据文件中其他数据块的SCN,这样从文件头的SCN来定位恢复起点就不现实了 。
一般情况下,被冻结的数据文件的文件头的checkpoint_change#是会小于当前的SCN的,不过,由于在冻结之前对需要冻结的数据文件发出过一次检查点,所以,如果刚冻结就直接强制关闭数据库的话,被冻结的数据文件的文件头的checkpoint_change#也是有可能大于当前的SCN的。不过,这种情况下,说明在冻结之后数据库并没有对冻结文件进行什么操作,因此,此时被冻结的数据文件从某种角度来说还是一致性的。如下:
让表空间TEST01启动begin backup:
SQL>ALTER TABLESPACE TEST01 BEGIN BACKUP;
然后,马上强制关闭数据库(强制关闭数据库的时候,不会进行检查点操作)
SQL>SHUTDOWN ABORT;
打开数据库
SQL> startup open;
ORACLE instance started.
Total System Global Area 418484224 bytes
Fixed Size 1375004 bytes
Variable Size 314574052 bytes
Database Buffers 96468992 bytes
Redo Buffers 6066176 bytes
Database mounted.
ORA-10873: file 6 needs to be either taken out of backup mode or media
recovered
ORA-01110: data file 6: 'D:\APP\ASUS\ORADATA\WAREHOUSE\TEST01.DBF'
查看当前的SCN和被冻结的数据文件(6,8)的checkpoint_change#,会发现数据文件的要比当前的SCN要大:
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1162657
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1162657
2 1162657
3 1162657
4 1162657
5 1162657
6 1168090
7 1162657
8 1168090
8 rows selected.
不过,可以正常恢复:
SQL>ALTER TABLESPACE END BACKUP;
SQL>ALTER DATABASE OPEN;
不过,正常情况下,被冻结的数据文件的文件头checkpoint_change#要比当前数据库的SCN要小:
1、让表空间begin backup
SQL>ALTER TABLESPACE TEST01 BEGIN BACKUP;
2、多次发出检查点
SQL>ALTER SYSTEM CHECKPOINT;
SQL>ALTER SYSTEM CHECKPOINT;
SQL>ALTER SYSTEM CHECKPOINT;
SQL>ALTER SYSTEM CHECKPOINT;
3、关闭数据
SQL>SHUTDOWN ABORT;
4、加载数据库
SQL>STARTUP MOUNT;
5、查看当前SCN与被冻结数据文件的checkpoint_change#
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1188529
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1188529
2 1188529
3 1188529
4 1188529
5 1188529
6 1188510
7 1188529
8 1188510
8 rows selected.
SQL> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- ---------
1 UNKNOWN ERROR 0
2 UNKNOWN ERROR 0
3 UNKNOWN ERROR 0
4 UNKNOWN ERROR 0
5 UNKNOWN ERROR 0
6 ACTIVE 1168090 20-AUG-13
7 NOT ACTIVE 0
8 ACTIVE 1168090 20-AUG-13
6、让表空间end backup
SQL>ALTER TABLESPACE TEST01 END BACKUP;
SQL>ALTER DATABASE OPEN;