1.SCN
system change number(SCN)记录了数据库的数据库commit的版本信息。当所有数据文件中的SCN号与控制文件中的SCN相同的时候,表明数据库是一致的,数据库不需要恢复。
控制文件中记录的SCN号
sys@WISON>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1745302
2 1745302
3 1745302
4 1745302
5 1745302
6 1745302
7 1745302
7 rows selected.
sys@WISON>
数据文件中的SCN号
sys@WISON>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1745302
2 1745302
3 1745302
4 1745302
5 1745302
6 1745302
7 1745302
7 rows selected.
当控制文件中的SCN号与数据文件中的SCN号一致的时候,不需要恢复。
s1.删除一个数据文件
[oracle@oracle11gdemo ~]$ cd /u01/oradata/wison/
[oracle@oracle11gdemo wison]$ ls -l
total 2437324
-rw-r----- 1 oracle oinstall 9977856 Oct 18 13:53 control01.ctl
-rw-r----- 1 oracle oinstall 104865792 Oct 18 13:48 example01.dbf
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:48 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:48 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:52 redo03.log
-rw-r----- 1 oracle oinstall 576724992 Oct 18 13:48 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Oct 18 13:48 system01.dbf
-rw-r----- 1 oracle oinstall 30416896 Oct 18 12:52 temp01.dbf
-rw-r----- 1 oracle oinstall 5259264 Oct 18 13:48 ts_16k.dbf
-rw-r----- 1 oracle oinstall 10493952 Oct 18 13:48 undo_small.dbf
-rw-r----- 1 oracle oinstall 723525632 Oct 18 13:48 undotbs01.dbf
-rw-r----- 1 oracle oinstall 148119552 Oct 18 13:48 users01.dbf
[oracle@oracle11gdemo wison]$ cp example01.dbf /tmp/
[oracle@oracle11gdemo wison]$ rm example01.dbf
[oracle@oracle11gdemo wison]$ ls -l
total 2334812
-rw-r----- 1 oracle oinstall 9977856 Oct 18 13:53 control01.ctl
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:48 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:48 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:53 redo03.log
-rw-r----- 1 oracle oinstall 576724992 Oct 18 13:53 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Oct 18 13:53 system01.dbf
-rw-r----- 1 oracle oinstall 30416896 Oct 18 12:52 temp01.dbf
-rw-r----- 1 oracle oinstall 5259264 Oct 18 13:48 ts_16k.dbf
-rw-r----- 1 oracle oinstall 10493952 Oct 18 13:48 undo_small.dbf
-rw-r----- 1 oracle oinstall 723525632 Oct 18 13:53 undotbs01.dbf
-rw-r----- 1 oracle oinstall 148119552 Oct 18 13:48 users01.dbf
[oracle@oracle11gdemo wison]$
s2.关闭数据库
shutdown abort
s3.重新把数据库mount,从v$recover_file中查需要恢复的数据文件。
sys@WISON>startup mount
ORACLE instance started.
Total System Global Area 640286720 bytes
Fixed Size 1338420 bytes
Variable Size 457180108 bytes
Database Buffers 176160768 bytes
Redo Buffers 5607424 bytes
Database mounted.
sys@WISON>col error for a10
sys@WISON>select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- ---------- ---------- ---------
5 ONLINE ONLINE FILE NOT 0
FOUND
sys@WISON>
发现5号文件需要恢复,5号文件正是刚刚删除的文件
s4.比较5号文件与控制文件中的SCN是不是一致(相同)
控制文件中SCN信息,如下
sys@WISON>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1745302
2 1745302
3 1745302
4 1745302
5 1745302
6 1745302
7 1745302
7 rows selected.
sys@WISON>
数据文件中的中的SCN号
sys@WISON>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1745302
2 1745302
3 1745302
4 1745302
5 0
6 1745302
7 1745302
7 rows selected.
sys@WISON>
发现5号文件中的SCN号与控制文件中记录的SCN号不同,所以5号文件需要恢复
s5.恢复5号数据文件,恢复分两步
- 还原5号数据文件(从备份copy到磁盘)
- 恢复(使用recover命令)
还原数据文件
[oracle@oracle11gdemo ~]$ cd /u01/oradata/wison/
[oracle@oracle11gdemo wison]$ ls -l
total 2334812
-rw-r----- 1 oracle oinstall 9977856 Oct 18 14:03 control01.ctl
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:48 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:48 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:54 redo03.log
-rw-r----- 1 oracle oinstall 576724992 Oct 18 13:53 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Oct 18 13:53 system01.dbf
-rw-r----- 1 oracle oinstall 30416896 Oct 18 12:52 temp01.dbf
-rw-r----- 1 oracle oinstall 5259264 Oct 18 13:48 ts_16k.dbf
-rw-r----- 1 oracle oinstall 10493952 Oct 18 13:48 undo_small.dbf
-rw-r----- 1 oracle oinstall 723525632 Oct 18 13:53 undotbs01.dbf
-rw-r----- 1 oracle oinstall 148119552 Oct 18 13:48 users01.dbf
[oracle@oracle11gdemo wison]$ cp /tmp/example01.dbf .
[oracle@oracle11gdemo wison]$ ls -l
total 2437324
-rw-r----- 1 oracle oinstall 9977856 Oct 18 14:03 control01.ctl
-rw-r----- 1 oracle oinstall 104865792 Oct 18 14:03 example01.dbf
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:48 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:48 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Oct 18 13:54 redo03.log
-rw-r----- 1 oracle oinstall 576724992 Oct 18 13:53 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Oct 18 13:53 system01.dbf
-rw-r----- 1 oracle oinstall 30416896 Oct 18 12:52 temp01.dbf
-rw-r----- 1 oracle oinstall 5259264 Oct 18 13:48 ts_16k.dbf
-rw-r----- 1 oracle oinstall 10493952 Oct 18 13:48 undo_small.dbf
-rw-r----- 1 oracle oinstall 723525632 Oct 18 13:53 undotbs01.dbf
-rw-r----- 1 oracle oinstall 148119552 Oct 18 13:48 users01.dbf
[oracle@oracle11gdemo wison]$
恢复(恢复是指:应用日志文件恢复事务)
sys@WISON>recover datafile 5;
Media recovery complete.
sys@WISON>alter database open;
Database altered.
sys@WISON>
3.checkpoint和SCN
- checkpoint 进程会通知DBWN把数据库缓存中的信息写入数据文件
- checkpoint 进程会更新所有数据文件的header,写入checkpoint信息(也就是SCN),使得所有数据文件一致
- checkpoint 进程会更新控制文件中的信息。
没checkpoint的时候控制文件,数据文件中SCN
sys@WISON>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1765977
2 1765977
3 1765977
4 1765977
5 1765977
6 1765977
7 1765977
7 rows selected.
sys@WISON>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1765977
2 1765977
3 1765977
4 1765977
5 1765977
6 1765977
7 1765977
7 rows selected.
sys@WISON>
checkpoint后,控制文件,数据文件中SCN
sys@WISON>alter system checkpoint;
System altered.
sys@WISON>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1766028
2 1766028
3 1766028
4 1766028
5 1766028
6 1766028
7 1766028
7 rows selected.
sys@WISON>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1766028
2 1766028
3 1766028
4 1766028
5 1766028
6 1766028
7 1766028
7 rows selected.
sys@WISON>
那什么时候会导致checkpoint呢?
- 手动checkpoint
- 日志切换的时候,也会发生checkpoint