实例恢复相关scn初步分析
Oracle Scn 定义
SCN: oracle system change number.表示oracle 系统改变号。
SCN是一个由之间转换过来的数字,可以通过下列语句转换SCN和具体时间。
把系统改变号SCN 转换为 时间戳,再把时间戳 转换为 标准时间
|
SYS @ prod >select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual;
GET_SYSTEM_CHANGE_NUMBER ------------------------ 2885954
SYS @ prod >select SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER) from dual;
SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER) --------------------------------------------------------------------------- 15-APR-14 03.40.09.000000000 PM
SYS @ prod >SELECT TO_CHAR(SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER),'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
TO_CHAR(SCN_TO_TIME ------------------- 2014-04-15 15:40:15
SYS @ prod >SELECT TO_CHAR(SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER),'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
TO_CHAR(SCN_TO_TIME ------------------- 2014-04-15 15:36:45 |
常见的SCN
SCN遍布数据库的每一个角落。下面列举几个常见和重要的SCN。
|
SCN名称 |
存在位置 |
获得方式 |
备注 |
|
系统检查点SCN |
控制文件 |
视图/控制文件 |
一个数据库一个 |
|
文件检查点SCN |
控制文件 |
视图/控制文件 |
一个文件一个 |
|
文件最终检查点SCN |
控制文件 |
视图/控制文件 |
一个文件一个 |
|
文件头部检查点SCN |
数据文件头 |
视图/数据文件头 |
一个文件一个 |
|
RedoFile文件开始SCN |
RedoFile |
视图/RedoFile头 |
一个文件一个 |
|
RedoFile文件结束SCN |
RedoFile |
视图/RedoFile头 |
一个文件一个 |
|
RedoLog条目的SCN |
RedoFile |
视图/RedoFile条目 |
一个条目一个 |
1、系统检查点SCN(控制文件数据库条目)
|
可以通过查询视图获得系统检查点SCN值,该值保存在控制文件中.
SYS @ prod >SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;
CHECKPOINT_CHANGE# ------------------ 2884529
表示的是LAST SCN CHECKPOINTED。
可以通过dump出控制文件进行查看:ALTERSESSION SET EVENTS 'IMMEDIATE TRACE NAME CONTROLF LEVEL 12'。 |
2、控制文件检查点SCN(控制文件数据文件条目)
|
可以通过查询视图获得文件检查点SCN值,该值保存在控制文件中.
SYS @ prod >SELECT NAME,CHECKPOINT_CHANGE# FROM V$DATAFILE;
NAME CHECKPOINT_CHANGE# -------------------------------------------------- ------------------ /u01/app/oracle/oradata/prod/system01.dbf 2884529 /u01/app/oracle/oradata/prod/undotbs01.dbf 2884529 /u01/app/oracle/oradata/prod/sysaux01.dbf 2884529 /u01/app/oracle/oradata/prod/users01.dbf 2884529 /u01/app/oracle/oradata/prod/example01.dbf 2884529
可以通过dump出控制文件进行查看:ALTERSESSION SET EVENTS 'IMMEDIATE TRACE NAME CONTROLF LEVEL 12'。 |
3、文件最终检查点SCN(控制文件数据文件条目)
|
可以通过查询视图获得文件最终检查点SCN值,该值保存在控制文件中,
SYS @ prod >SELECT NAME,LAST_CHANGE# FROM V$DATAFILE;
NAME LAST_CHANGE# -------------------------------------------------- ------------ /u01/app/oracle/oradata/prod/system01.dbf /u01/app/oracle/oradata/prod/undotbs01.dbf /u01/app/oracle/oradata/prod/sysaux01.dbf /u01/app/oracle/oradata/prod/users01.dbf /u01/app/oracle/oradata/prod/example01.dbf
该值在数据库正常启动时设置为无穷大,该值在数据库正常关闭的情况下设置为关闭时的SCN,非正常关闭依旧为无穷大。 |
4、数据文件头部的检查点SCN(数据文件头)
|
可以通过查询视图获得文件检查点SCN值,该值保存在数据文件头部,
SYS @ prod >SELECT NAME,CHECKPOINT_CHANGE# FROM V$DATAFILE_HEADER;
NAME CHECKPOINT_CHANGE# -------------------------------------------------- ------------------ /u01/app/oracle/oradata/prod/system01.dbf 2884529 /u01/app/oracle/oradata/prod/undotbs01.dbf 2884529 /u01/app/oracle/oradata/prod/sysaux01.dbf 2884529 /u01/app/oracle/oradata/prod/users01.dbf 2884529 /u01/app/oracle/oradata/prod/example01.dbf 2884529
也可以通过dump数据文件头块进行查看。 |
5、RedoFile文件开始SCN
|
表 示切换到该日志文件的时间点,可以通过查询视图获得文件RedoFile文件开始SCN,该值保存在数据文件头部, SYS @ prod >SELECT FIRST_CHANGE# FROM V$LOG;
FIRST_CHANGE# ------------- 2884414 2884529 2884405 也可以通过dump redoFile文件头块进行查看。当前redoFile的开始SCN就是上一个redoFile的的结束SCN。 |
6、RedoFile文件结束SCN
|
表 示切换到下一个日志文件的时间点,可以通过查询视图获得文件RedoFile文件开始SCN,该值保存在数据文件头部,
SELECT NEXT_CHANGE# FROM V$LOG;
也可以通过dump redoFile文件头块进行查看。当前redoFile的结束SCN就是下一个redoFile的的开始SCN。 |
7、RedoLog条目的SCN
|
表示redo条目对应数据库被修改时间点的CSN。 |
各检查点之间关系
|
1、数据库正常关闭和启动时,控制文件的系统SCN、控制文件中的数据文件开始SCN和数据文件头部的开始SCN是相等的,文件的最终检查点SCN是无穷大。 2、正常关闭数据库,oracle会做下列操作。 A、将所有的buffer cache写到磁盘上。 B、用关闭的时间点SCN更新系统SCN、文件检查点SCN、文件最终检查点SCN、数据文件头部检查点SCN。此时4中SCN的值相同。 3、 数据库非正常关闭(abort),数据库不做写buffercache操作和更新SCN操作。此时文件最终检查点依然为空,数据库需要进行实例恢复。数据 库在open的过程中,从控制文件的检查点条目中的每个检查点队列中取得LRBA(检查点队列中第一个脏块的LRBA)和ON DISK RBA(对应REDO FILE的最后一条redolog 条目),然后从LRBA跑日志到ON DISK RBA。 4、数据库正常关闭,用一个备份的数据文件覆盖其中一个数据文件,此时数据文件头部的检查点SCN小于控制文件中的“文件检查点SCN”,此时就需要进行介质恢复。 |
切换日志,查看数据库scn、控制文件检查点号、数据文件检查点号
|
查看当前SCN SYS @ prod >select db.current_scn "db.chk#",ctl.checkpoint_change# "ctl.chk#",dbfile.checkpoint_change# "dbfile.chk#" from v$database db,v$datafile ctl,v$datafile_header dbfile ;
db.chk# ctl.chk# dbfile.chk# ---------- ---------- ----------- 2887937 2887848 2887848 2887938 2887848 2887848 2887939 2887848 2887848 2887940 2887848 2887848
切换日志 SYS @ prod >alter system switch logfile;
System altered.
查看此时SCN
SYS @ prod >select db.current_scn "db.chk#",ctl.checkpoint_change# "ctl.chk#",dbfile.checkpoint_change# "dbfile.chk#" from v$database db,v$datafile ctl,v$datafile_header dbfile ;
db.chk# ctl.chk# dbfile.chk# ---------- ---------- ----------- 2888088 2888073 2888073 2888089 2888073 2888073 2888090 2888073 2888073 2888091 2888073 2888073
|
操作对SCN号的影响
|
SCN\操作 |
日志切换 |
全量检查点 |
正常关闭 |
增量检查点 |
刷新缓存 |
offline |
|
系统检查点SCN |
×/√ |
√ |
√ |
× |
√ |
× |
|
文件检查点SCN |
×/√ |
√ |
√ |
× |
√ |
× |
|
文件最终检查点SCN |
× |
× |
√ |
× |
× |
× |
|
文件头部检查点SCN |
×/√ |
√ |
√ |
× |
√ |
√ |
|
日志文件开始SCN |
√ |
× |
× |
× |
× |
× |
|
日志文件结束SCN |
√ |
× |
× |
× |
× |
× |
|
RedoLog条目SCN |
× |
× |
× |
× |
× |
× |

注:1、曾量检查点会更新控制文件checkpoint 条目的LRBA值。不会改变SCN
2、日志切换,假如切换之后将active类型的日志文件切换为inactive,则会更新系统检查点SCN、文件检查点SCN和文件头部检查点SCN。
3、全量检查点会将buffercache全部写到内容,所以日志状态会发生变化,所以会改变系统检查点CSN。
源文档 <http://www.itpub.net/forum.php?mod=viewthread&tid=1772666>