oracle scn与备份恢复backup recovery(一)

  前面文章中,多次涉及了scn,比如block dump中的scn, scn对于构造cr从而实现consistent read

;至少重要,而且scn与数据库整体的备份恢复有着密不可分的关系;
  
   oracle scn里面的类别有很多种,让人有些晕着不知所向;比如在控制文件中有scn,数据库有scn,数据文件有scn;

数据文件头有scn;日志文件有scn;block有scn;
 
   它们之间有何联系;如何有机组合服务于备份与恢复;我们一步步来讲,千里之行,始于足下:
 
如下摘集一些关于scn的贴子:

 
http://logzgh.itpub.net/post/3185/42513

http://www.doc88.com/p-146571552776.html

1,先研究下scn与checkpoint的关系;自然就要知道何为检查点,检查点oracle具体什什么工作;
 
  /**********检查点概念及简介*****************/
  http://space.itpub.net/?uid-9240380-action-viewspace-itemid-757005
 
  ckpt进程触发检查点时,把当前最新的scn写入到数据文件头部和控制文件中,同时ckpt通知dbwr把buffer cache
  的dirty buffer写入到数据文件中
 
  与checkpoint相关的scn有几个呢,上面说了,发生检查点会在数据文件头部和控制文件中写入:
  所以我们检查与数据文件头部和控制文件有关的视图即可:
 
  /*关于v$database可参见*************http://docs.oracle.com/cd/E11882_01/server.112/e25513/dynviews_1096.htm#REFRN30047************/
  /***第一列会随机变化,而第二列是最新发生checkpoint的scn******v$database还有其它的scn,比如与backup及resetslog相关的,本文不关注**/
  SQL> select current_scn,checkpoint_change# from v$database;--v$database是记录控制文件的scn
 
CURRENT_SCN CHECKPOINT_CHANGE#
----------- ------------------
   10558777           10514593                        
                   

SQL> alter system checkpoint;
 
System altered

/*************产生检查点发checkpoint_change#变化了*/
SQL> select current_scn,checkpoint_change# from v$database;
 
CURRENT_SCN CHECKPOINT_CHANGE#
----------- ------------------
   10558978           10558976                   
                   
/*******数据文件的checkpoint scn*****你会发现它与控制文件的scn一样,因为v$datafile也是来自于控制文件**/                   
SQL> select checkpoint_change# from v$datafile;
 
CHECKPOINT_CHANGE#
------------------
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
 
CHECKPOINT_CHANGE#
------------------
          10558976
 
21 rows selected

/**************数据文件头部的scn也与上面的一样/
SQL> select checkpoint_change# from v$datafile_header;
 
CHECKPOINT_CHANGE#
------------------
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
          10558976
 
CHECKPOINT_CHANGE#
------------------
          10558976
 
21 rows selected  


小小结:
  1,一般情况下控制文件的checkpoint scn与数据文件头的checkpoint scn一样               
   2,v$database与v$datafile取自控制文件
    3,v$datafile_header记录数据文件头信息
   
/********介质恢复概念*********/
http://space.itpub.net/?uid-9240380-action-viewspace-itemid-757008

 

  数据库启动时,如果上述的checkpoint scn与datafile checkpoint scn和数据文件头的checkpoint scn不一样,
就要执行介质恢复;或者说是v$database.checkpoint_change#与v$datafile.checkpoint_change#与v$datafile_header.checkpoint_change#
不一样就要执行介质恢复

 

SQL> alter tablespace TBS_16K read only;
 
Tablespace altered
 
SQL> select file#,name,checkpoint_change# from v$datafile_header where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560282
 
SQL> select checkpoint_change# from v$database;
 
CHECKPOINT_CHANGE#
------------------
          10558976
 
SQL> select file#,name,checkpoint_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560282
       
       

 

SQL> create table t_hb(a int) tablespace tbs_16k;
 
Table created
 
SQL> select file#,name,checkpoint_change# from v$datafile_header where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560282
 
SQL> select file#,name,checkpoint_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560282
 
SQL>  select checkpoint_change# from v$database;
 
CHECKPOINT_CHANGE#
------------------
          10558976
       
小结:1,对于read only操作触发的检查点,数据文件及数据文件头的checkpoint scn发生变化,而
    v$database.checkpoint_change#控制文件的检查点scn被冻结不变化
   2,如一直处于read only期间,三者scn皆不再变化

--回复表空间为正常状态
SQL> alter tablespace TBS_16K read write;
 
Tablespace altered
 
SQL>  select checkpoint_change# from v$database;
 
CHECKPOINT_CHANGE#
------------------
          10558976
 
SQL> select file#,name,checkpoint_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> select file#,name,checkpoint_change# from v$datafile_header where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682       
 
 
小结:表空间恢复正常后,控制文件的检查点scn及数据文件及头部的检查点scn开始变化
   alter tablespace read only;一般用于备份表空间

 


SQL> select file#,name,checkpoint_change# from v$datafile_header where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> select file#,name,checkpoint_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> insert into t_hb values(1);
 
1 row inserted
 
SQL> select file#,name,checkpoint_change# from v$datafile_header where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> select file#,name,checkpoint_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> commit;
 
Commit complete
 
SQL> select file#,name,checkpoint_change# from v$datafile_header where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> select file#,name,checkpoint_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
       
小结:1,commit不会触发检查点

 

QL> select file#,name,checkpoint_change# from v$datafile_header where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> select file#,name,checkpoint_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> alter system switch logfile;
 
System altered
 
SQL> select file#,name,checkpoint_change# from v$datafile_header where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
 
SQL> select file#,name,checkpoint_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------
        21 C:\TBS16K_1.DBF                                                                            10560682
       
小结:alter system switch logfile切换日志不会触发检查点               

 

SQL> select file#,name,checkpoint_change#,last_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE# LAST_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------ ------------
        21 C:\TBS16K_1.DBF                                                                            10561215
 
SQL> alter tablespace tbs_16k read only;
 
Tablespace altered
 
SQL> select file#,name,checkpoint_change#,last_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE# LAST_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------ ------------
        21 C:\TBS16K_1.DBF                                                                            10561320     10561320
 
SQL> alter tablespace tbs_16k read write;
 
Tablespace altered
 
SQL> select file#,name,checkpoint_change#,last_change# from v$datafile where file#=21;
 
     FILE# NAME                                                                             CHECKPOINT_CHANGE# LAST_CHANGE#
---------- -------------------------------------------------------------------------------- ------------------ ------------
        21 C:\TBS16K_1.DBF                                                                            10561336
 
SQL>

小结:表空间或数据文件正常情况下,last_change#为空,若read only切回到正常模式,则为上次检查点的scn

 

二。SCN号与数据库启动
 1,数据库启动过程中,如果v$database.checkpoint_change#,v$datafile.checkpoint_change#及v$datafile_header.checkpoint_change#三者
  一致,则数据库可以正常打开,否则需要介质恢复
 
 2,数据库启动过程中,如果end_scn即v$datafile.last_change#为null,但需要作实例恢复;
  也就是说数据库关闭时,会把v$datafile.last_change#设置为v$datafile.checkpoint_change#;
  3,数据库启动之后,会把v$datafile.last_change#配置为null

如果在启动的过程中,End SCN号为NULL,则需要做instance recovery.
ORACLE在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery.
三。SCN号与数据库关闭
如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应
数据文件的Start SCN号。

当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE
会将END SCN号设置为NULL.
如果数据库异常关闭的话,则END SCN号将为NULL.

 

/---************我们测试下实例恢复-----------------/
SQL> select checkpoint_change#,last_change# from v$datafile;
 
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
          10561215
 
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10561336
 
21 rows selected

/***********非常关闭数据库*************/
SQL> shutdown abort
ORACLE instance shut down.

/********启动到mount***********/
SQL> startup mount
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.

Total System Global Area  238034944 bytes
Fixed Size                  2174520 bytes
Variable Size             159384008 bytes
Database Buffers           71303168 bytes
Redo Buffers                5173248 bytes
Database mounted.

/****测试是否下面就要实例恢复***********
alter database open
SQL> alter database open;

Database altered.

/*****************看alert,确实发生了实例恢复***************/
alter database open
Beginning crash recovery of 1 threads
 parallel recovery started with 3 processes --开启了并行恢复
Started redo scan --实例恢复要应用在线日志
Completed redo scan
 read 836 KB redo, 421 data blocks need recovery
Started redo application at
 Thread 1: logseq 822, block 30632 --自异常中断库当前重作日志的rba为822.30632
Recovery of Online Redo Log: Thread 1 Group 8 Seq 822 Reading mem 0
  Mem# 0: D:\ORACLE11G_64BIT\ORADATA\ORCL\REDO08.LOG
Completed redo application of 0.61MB
Completed crash recovery at
 Thread 1: logseq 822, block 32304, scn 10588920 --中止于异常中断库当前重作日志的rba为822.32304
 421 data blocks read, 421 data blocks written, 836 redo k-bytes read

/************附上shutdown abort之前的日志信息*******/
SQL> select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- ----------- ------------ -----------
         3          1        817   52428800        512          1 NO       INACTIVE              10453013 2013/3/24 1     10454569 2013/3/24 1
         4          1        818  209715200        512          1 NO       INACTIVE              10454569 2013/3/24 1     10492795 2013/3/24 1
         5          1        819  209715200        512          1 NO       INACTIVE              10492795 2013/3/24 1     10560992 2013/3/25 1
         6          1        820  209715200        512          1 NO       INACTIVE              10560992 2013/3/25 1     10561002 2013/3/25 1
         7          1        821  209715200        512          1 NO       INACTIVE              10561002 2013/3/25 1     10561202 2013/3/25 1
         8          1        822  209715200        512          1 NO       CURRENT               10561202 2013/3/25 1 281474976710              ---实例恢复就是操作这个日志文件
         9          1        816  209715200        512          1 NO       INACTIVE              10446578 2013/3/24 1     10453013 2013/3/24 1
        10          1        815   20971520        512          1 NO       INACTIVE              10445875 2013/3/24 1     10446578 2013/3/24 1
 
8 rows selected

/********数据库启动后,last_change#结束scn也为空,除非read only或begin backup********/
SQL> select checkpoint_change#,last_change# from v$datafil

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923

21 rows selected.


/*********再看下正常关闭库结束scn的情况,是否为数据文件的checkpoint_change#**********/

/---数据库open期间,数据文件的检查点scn及结束scn************/
SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923

21 rows selected.

/******数据库open期间数据文件头部**************/
SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923

CHECKPOINT_CHANGE#
------------------
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923
          10588923

21 rows selected.

/**********控制文件***************/
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
          10588923
         

/********日志文件*******发现当前日志文件的scn与数据文件及数据头和控制文件是一致的;这样就把日志文件,控制文件,数据文件结合起来了************/
SQL>  select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME  NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- ----------- ------------ -----------
         3          1        817   52428800        512          1 NO       INACTIVE              10453013 2013/3/24 1     10454569 2013/3/24 1
         4          1        818  209715200        512          1 NO       INACTIVE              10454569 2013/3/24 1     10492795 2013/3/24 1
         5          1        819  209715200        512          1 NO       INACTIVE              10492795 2013/3/24 1     10560992 2013/3/25 1
         6          1        820  209715200        512          1 NO       INACTIVE              10560992 2013/3/25 1     10561002 2013/3/25 1
         7          1        821  209715200        512          1 NO       INACTIVE              10561002 2013/3/25 1     10561202 2013/3/25 1
         8          1        822  209715200        512          1 NO       INACTIVE              10561202 2013/3/25 1     10588922 2013/3/25 1
         9          1        816  209715200        512          1 NO       INACTIVE              10446578 2013/3/24 1     10453013 2013/3/24 1
        10          1        823   20971520        512          1 NO       CURRENT               10588922 2013/3/25 1 281474976710 --当前日志文件的first_change#比数据文件的checkpoint_change#小1
 
8 rows selected         

/**********关库***********/
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

/*********启动库到mount**************/
SQL> startup mount
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.

Total System Global Area  238034944 bytes
Fixed Size                  2174520 bytes
Variable Size             159384008 bytes
Database Buffers           71303168 bytes
Redo Buffers                5173248 bytes
Database mounted.

/********正常关库启动后控制文件,数据文件,数据文件头三者检查点scn是一致;且数据文件的检查点scn与结束scn是一样的,不用实例恢复**********/
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
          10590727
         
SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727

CHECKPOINT_CHANGE#
------------------
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727
          10590727

21 rows selected.


SQL> select checkpoint_change#,last_change# from v$datafile

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727
          10590727     10590727

21 rows selected.

SQL>

/********打开数据库*****未发现实例恢复操作***********/
SQL> alter database open;

Database altered.

alter database open
Mon Mar 25 19:34:24 2013
Thread 1 opened at log sequence 823
  Current log# 10 seq# 823 mem# 0: D:\ORACLE11G_64BIT\ORADATA\ORCL\REDO10.LOG
Successful open of redo thread 1
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Mon Mar 25 19:34:24 2013
SMON: enabling cache recovery
Successfully onlined Undo Tablespace 2.
Verifying file header compatibility for 11g tablespace encryption..
Verifying 11g file header compatibility for tablespace encryption completed
SMON: enabling tx recovery
Database Characterset is AL32UTF8
No Resource Manager plan active
Starting background process QMNC
Mon Mar 25 19:34:28 2013
QMNC started with pid=22, OS id=8208
Completed: alter database open
/**********正常关闭库打开库数据文件的结束scn,last_change#还是设置为空/         
SQL> select checkpoint_change#,last_change# from v$datafile

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730
          10590730

21 rows selected.

SQL>      

/*********实例恢复是从当前日志的first_change#到下面查询的scn之间应用日志*************/
SQL> select dbms_flashback.get_system_change_number from dual;
 GET_SYSTEM_CHANGE_NUMBER
 ------------------------
                   594373
如果需要进行实例恢复,则需要恢复的记录为587705至594373中redo log中的记录。   

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-757067/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9240380/viewspace-757067/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值