Oracle手工恢复控制文件的深入解析
zjyhll 2013-06-16
v$database.CHECKPOINT_CHANGE# (last scn checkpointed)
v$database.CONTROLFILE_SEQUENCE# (control file sequence number incremented by control file transactions)
v$database.CONTROLFILE_CHANGE# (last scn in backup control file ;null if the control file is not a backup)
v$datafile.CHECKPOINT_CHANGE# (scn at last checkpoint)
v$datafile_header. CHECKPOINT_CHANGE# (datafile checkpoint change#
v$log.FIRST_CHANGE# (lowest system change number(SCN) in the log
v$database.CHECKPOINT_CHANGE# 代表是数据库最后一次进行完全检查点的scn号。只有在进行完全检查点的时候才进行更新,更新的值为当前现在数据库的current_scn值。
v$database.CONTROLFILE_CHANGE# (代表从备份中恢复过来的控制文件的最后一个scn号假如是刚刚从备份中恢复,如果控制文件不是从备份中恢复过来的,那么该值为null,但是当控制文件在数据库打开的时候,那么该值会随着增量检查点和完全检查点或是数据库结构变化时会设置为当下的current_scn值。
SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
4921905 14285 4922868
23:13:45 SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
4935440 14311 4935548
23:13:46 SYS@orcl#select current_scn from v$database;
CURRENT_SCN
-----------
4935575
23:13:46 SYS@orcl#alter system checkpoint;
select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
系统已更改。
23:13:46 SYS@orcl#
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
4935576 14313 4935578
23:13:49 SYS@orcl#
23:14:09 SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
4935576 14314 4935649
23:16:42 SYS@orcl#alter system switch logfile;
系统已更改。
23:16:52 SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
4935576 14318 4935675
23:16:55 SYS@orcl#
v$database.CONTROLFILE_SEQUENCE# (代表根据数据库的变化进行增加的序列,在查询的时候显示的是当前的控制文件是在哪个sequence号,随着增量检查点和完全检查点或是数据库结构变化而incremental。
v$datafile.CHECKPOINT_CHANGE# (这个值代表的是数据文件中最后一个last checkpoint 的scn号与v$database 中的CHECKPOINT_CHANGE#相同。也就是说当进行完全检查点的时候,需要数据文件中的scn和控制文件中的scn保持一致性。当我们启动到数据库mount状态下然后dump数据文件看到的checkpoint scn正是这个值,在进行数据库启动要验证该值)
23:26:05 SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
4935675 14332 4937039
23:26:30 SYS@orcl#select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
4935675
4935675
4935675
4935675
4935675
4935675
4935675
4935675
4935675
4935675
4935675
CHECKPOINT_CHANGE#
------------------
4935675
已选择12行。
23:26:31 SYS@orcl#alter system checkpoint;
系统已更改。
23:27:27 SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
4937086 14336 4937088
23:27:31 SYS@orcl#select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
4937086
4937086
4937086
4937086
4937086
4937086
4937086
4937086
4937086
4937086
4937086
CHECKPOINT_CHANGE#
------------------
4937086
已选择12行。
23:27:32 SYS@orcl#
v$datafile_header. CHECKPOINT_CHANGE# (代表数据文件头的检查点scn,这个值和数据文件的检查点相一致,在数据库运行到open状态进行的数据文件dump文件中的header 中的checkpoint scn就是此值。)