欢迎投稿

今日深度:

手工恢复控制文件的深入解析

手工恢复控制文件的深入解析


手工恢复控制文件的深入解析
 
    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就是此值。)
 
 
23:35:32 SYS@orcl#col file# for 99
23:35:43 SYS@orcl#col name for a70
23:35:52 SYS@orcl#r
  1* select a.file#,a.name,b.ts#,b.name from v$datafile a,v$tablespace b where a.ts#=b.ts#
 
FILE# NAME                                                                          TS# NAME
----- ---------------------------------------------------------------------- ---------- ----------------------------------------------------------------------
    1 /opt/oracle/oradata/ORCL/datafile/o1_mf_system_8no75lqw_.dbf                    0 SYSTEM
    2 /opt/oracle/oradata/ORCL/datafile/o1_mf_sysaux_8no736vh_.dbf                    1 SYSAUX
    3 /opt/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_8no736w0_.dbf                  2 UNDOTBS1
    4 /opt/oracle/oradata/ORCL/datafile/o1_mf_users_8no75m69_.dbf                     4 USERS
    5 /opt/oracle/oradata/ORCL/datafile/huadan                                        6 VPN_HUADAN
    6 /opt/oracle/oradata/sysaux_add.dbf                                              1 SYSAUX
    7 /opt/oracle/oradata/system_add.dbf                                              0 SYSTEM
    8 /opt/oracle/oradata/test1.dbf                                                   7 TEST1
    9 /opt/oracle/oradata/ORCL/datafile/bigtablespace.dbf                            11 BIGTABLESPACE
   10 /opt/oracle/oradata/ORCL/datafile/undotbs02.dbf                                 5 UNDOTBS2
   11 /opt/oracle/oradata/ORCL/datafile/test2.dbf                                    12 TEST2
 
FILE# NAME                                                                          TS# NAME
----- ---------------------------------------------------------------------- ---------- ----------------------------------------------------------------------
   12 /opt/oracle/oradata/ORCL/datafile/test3.dbf                                    13 TEST3
 
已选择12行。
 
23:35:54 SYS@orcl#show user;
USER 为 "SYS"
23:36:09 SYS@orcl#select default_tablespace from dba_users where username='SYS';
 
DEFAULT_TABLESPACE
------------------------------------------------------------
SYSTEM
 
23:36:30 SYS@orcl#
23:38:43 SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
 
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
           4937086                 14340             4937775
 
23:38:44 SYS@orcl#select current_scn from v$database;
 
CURRENT_SCN
-----------
    4937838
 
23:38:44 SYS@orcl#select file#,checkpoint_change# from v$datafile_header;
 
FILE# CHECKPOINT_CHANGE#
----- ------------------
    1            4937086
    2            4937086
    3            4937086
    4            4937086
    5            4937086
    6            4937086
    7            4937086
    8            4937086
    9            4937086
   10            4937086
   11            4937086
 
FILE# CHECKPOINT_CHANGE#
----- ------------------
   12            4937086
 
已选择12行。
 
23:38:44 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:38:44 SYS@orcl#alter system checkpoint;
select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database; 
select checkpoint_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;
系统已更改。
 
23:38:44 SYS@orcl#
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
           4937839                 14341             4937840
 
23:38:44 SYS@orcl#
CHECKPOINT_CHANGE#
------------------
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
 
CHECKPOINT_CHANGE#
------------------
           4937839
 
已选择12行。
 
23:38:44 SYS@orcl#
 
FILE# CHECKPOINT_CHANGE#
----- ------------------
    1            4937839
    2            4937839
    3            4937839
    4            4937839
    5            4937839
    6            4937839
    7            4937839
    8            4937839
    9            4937839
   10            4937839
   11            4937839
 
FILE# CHECKPOINT_CHANGE#
----- ------------------
   12            4937839
 
已选择12行。
 
23:38:45 SYS@orcl#
23:38:47 SYS@orcl#
 v$log.FIRST_CHANGE#(代表应该改日志文件的最小的scn号。也就是刚刚使用这个redo 记录的开始事务操作的scn号)
 
 2、利用alter database backup controlfile to '/backup/control.bin';命令备份出来的控制文件做恢复时,为什么一定要用resetlogs才能打开库?
 从第一个问题可以看出,当控制文件从备份中恢复过来后,控制文件的数据库检查点小于当前数据文件检查点,那么必须要进行数据库的恢复操作,应用日志进行对控制文件的scn进行递增,达到
 演示步骤如下:
 SYS@orcl#alter session set events 'immediate trace name controlf level 8';
 
会话已更改。
 
SYS@orcl#alter database backup controlfile to '/opt/oracle/control.ctl';
 
数据库已更改。
 
SYS@orcl#alter system checkpoint; 
 
系统已更改。
 
SYS@orcl#exit
从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开
oracle@oracle:~> sqlplus "/as sysdba"
 
SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 6月 7 23:54:22 2013
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
 
连接到: 
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SYS@orcl#alter session set events 'immediate trace name controlf level 8';
 
会话已更改。
SYS@orcl#shutdown abort;
ORACLE 例程已经关闭。
SYS@orcl#
这个时候在查看一下这两次转储的控制文件信息:
发现如下是不一样的信息:
第一次转储信息如下:
DUMP OF CONTROL FILES, Seq # 14348 = 0x380c
 Control Seq=14348=0x380c, File size=612=0x264
 Database checkpoint: Thread=1 scn: 0x0000.004b586f
 Controlfile Checkpointed at scn:  0x0000.004b5b11 06/07/2013 23:52:17
THREAD #1 - status:0x2 flags:0x0 dirty:73
low cache rba:(0x3.90df.0) on disk rba:(0x3.9223.0)
on disk scn: 0x0000.004b5b48 06/07/2013 23:53:24
heartbeat: 817528803 mount id: 1345278620
Change tracking state=2, file index=15, checkpoint count=9
Checkpointed at scn:  0x0000.004b586f 06/07/2013 23:38:44
 thread:1 rba:(0x3.8e76.10)
 Checkpoint cnt:673 scn: 0x0000.004b586f 06/07/2013 23:38:44
 Checkpoint cnt:665 scn: 0x0000.004b586f 06/07/2013 23:38:44
 Checkpoint cnt:597 scn: 0x0000.004b586f 06/07/2013 23:38:44
 Checkpoint cnt:663 scn: 0x0000.004b586f 06/07/2013 23:38:44
 第二次转储的信息如下:
 DUMP OF CONTROL FILES, Seq # 14352 = 0x3810
 Control Seq=14352=0x3810, File size=612=0x264
 Database checkpoint: Thread=1 scn: 0x0000.004b5b5e
 Controlfile Checkpointed at scn:  0x0000.004b5b62 06/07/2013 23:54:20
THREAD #1 - status:0x2 flags:0x0 dirty:28
low cache rba:(0x3.9229.0) on disk rba:(0x3.923b.0)
on disk scn: 0x0000.004b5b6f 06/07/2013 23:54:24
heartbeat: 817528822 mount id: 1345278620
Change tracking state=2, file index=15, checkpoint count=10
Checkpointed at scn:  0x0000.004b5b5e 06/07/2013 23:54:16
 thread:1 rba:(0x3.9226.10)
 Checkpoint cnt:674 scn: 0x0000.004b5b5e 06/07/2013 23:54:16
 Checkpoint cnt:666 scn: 0x0000.004b5b5e 06/07/2013 23:54:16
 Checkpoint cnt:598 scn: 0x0000.004b5b5e 06/07/2013 23:54:16
 Checkpoint cnt:664 scn: 0x0000.004b5b5e 06/07/2013 23:54:16
 可以看到控制文件序列不一样了,database checkpoint scn不一样了,心跳不一样了,checkpoint at scn不一样了。
 然后我们在看一下在启动到mount状态下查看一下数据文件中的控制文件信息和数据文件的头部信息;
 SYS@orcl#show parameter control
 
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
_optimizer_extended_stats_usage_cont integer                240
rol
_optimizer_join_order_control        integer                3
control_file_record_keep_time        integer                7
control_files                        string                 /opt/oracle/oradata/ORCL/contr
                                                            olfile/o1_mf_7q9c8orh_.ctl, /o
                                                            pt/oracle/flash_recovery_area/
                                                            ORCL/controlfile/o1_mf_7q9c8pc
                                                            f_.ctl
control_management_pack_access       string                 DIAGNOSTIC+TUNING
SYS@orcl#!
oracle@oracle:~> cd oradata/ORCL/controlfile/
oracle@oracle:~/oradata/ORCL/controlfile> rm o1_mf_7q9c8orh_.ctl
oracle@oracle:~/oradata/ORCL/controlfile> rm /opt/oracle/flash_recovery_area/ORCL/controlfile/o1_mf_7q9c8pcf_.ctl
oracle@oracle:~/oradata/ORCL/controlfile> cp /opt/oracle/control.ctl /opt/oracle/oradata/ORCL/controlfile/o1_mf_7q9c8orh_.ctl
oracle@oracle:~/oradata/ORCL/controlfile> cp /opt/oracle/control.ctl /opt/oracle/flash_recovery_area/ORCL/controlfile/o1_mf_7q9c8pcf_.ctl
oracle@oracle:~/oradata/ORCL/controlfile> exit
exit
 
SYS@orcl#alter database mount;
 
数据库已更改。
 
SYS@orcl#
SYS@orcl#set linesize 200
SYS@orcl#
SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database; 
select checkpoint_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
           4937839                 14352             4938513
 
SYS@orcl#
CHECKPOINT_CHANGE#
------------------
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
           4937839
 
CHECKPOINT_CHANGE#
------------------
           4937839
 
已选择12行。
 
SYS@orcl#
 
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            4938590
         2            4938590
         3            4938590
         4            4938590
         5            4938590
         6            4938590
         7            4938590
         8            4938590
         9            4938590
        10            4938590
        11            4938590
 
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
        12            4938590
 
已选择12行。
 
SYS@orcl#
 
可以看到数据文件头的scn和控制文件中不一致啊。那么就需要进行恢复数据库。
SYS@orcl#recover database;
ORA-00283: ??????????
ORA-01610: ?? BACKUP CONTROLFILE ??????????
 
提醒控制文件是备份过来的,需要使用 using backup controlfile恢复。
SYS@orcl#recover database using backup controlfile;
ORA-00279: ?? 4938513 (? 06/07/2013 23:16:52 ??) ???? 1 ????
ORA-00289: ??: /opt/oracle/flash_recovery_area/ORCL/archivelog/2013_06_08/o1_mf_1_3_%u_.arc
ORA-00280: ?? 4938513 (???? 1) ??? #3 ?
 
 
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: ???????? '/opt/oracle/flash_recovery_area/ORCL/archivelog/2013_06_08/o1_mf_1_3_%u_.arc'
ORA-27037: ????????
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
 
 
ORA-00308: ???????? '/opt/oracle/flash_recovery_area/ORCL/archivelog/2013_06_08/o1_mf_1_3_%u_.arc'
ORA-27037: ????????
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
这是由于最后没有归档日志,其实这个是redo还没来得急归档,可以使用在线的然后进行完全恢复
SYS@orcl#select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIV STATUS                           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- --------------
         1          1          1   52428800          2 YES    INACTIVE                               4918661 05-6?  -13
         3          1          3   52428800          2 NO     CURRENT                                4935675 07-6?  -13
         2          1          2   52428800          2 YES    INACTIVE                               4935491 07-6?  -13
 
SYS@orcl#select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIV STATUS                           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- --------------
         1          1          1   52428800          2 YES    INACTIVE                               4918661 05-6?  -13
         3          1          3   52428800          2 NO     CURRENT                                4935675 07-6?  -13
         2          1          2   52428800          2 YES    INACTIVE                               4935491 07-6?  -13
 
SYS@orcl#desc v$logfile;
 名称                                                                                                              是否为空? 类型
 ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
 GROUP#                                                                                                                     NUMBER
 STATUS                                                                                                                     VARCHAR2(7)
 TYPE                                                                                                                       VARCHAR2(7)
 MEMBER                                                                                                                     VARCHAR2(513)
 IS_RECOVERY_DEST_FILE                                                                                                      VARCHAR2(3)
 
SYS@orcl#col member for a120
SYS@orcl#select group#,member from v$logfile;
 
    GROUP# MEMBER
---------- ------------------------------------------------------------------------------------------------------------------------
         3 /opt/oracle/oradata/ORCL/onlinelog/o1_mf_3_8np02j56_.log
         3 /opt/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_8np02l6x_.log
         2 /opt/oracle/oradata/ORCL/onlinelog/o1_mf_2_8np02cjq_.log
         2 /opt/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_8np02fpo_.log
         1 /opt/oracle/oradata/ORCL/onlinelog/o1_mf_1_8np02719_.log
         1 /opt/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_8np02985_.log
 
已选择6行。
 
SYS@orcl#recover database using backup controlfile;
ORA-00279: ?? 4938513 (? 06/07/2013 23:16:52 ??) ???? 1 ????
ORA-00289: ??: /opt/oracle/flash_recovery_area/ORCL/archivelog/2013_06_08/o1_mf_1_3_%u_.arc
ORA-00280: ?? 4938513 (???? 1) ??? #3 ?
 
 
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
/opt/oracle/oradata/ORCL/onlinelog/o1_mf_3_8np02j56_.log
已应用的日志。
完成介质恢复。
SYS@orcl#
 
这个时候我们在看看控制文件,数据文件的信息,注意和在没有进行recover之前的区别:如下:
SYS@orcl#select CHECKPOINT_CHANGE#,CONTROLFILE_SEQUENCE#,CONTROLFILE_CHANGE# from v$database;
 
CHECKPOINT_CHANGE# CONTROLFILE_SEQUENCE# CONTROLFILE_CHANGE#
------------------ --------------------- -------------------
           4937839                 14357             4938734
 
SYS@orcl#select checkpoint_change# from v$datafile;
 
CHECKPOINT_CHANGE#
------------------
           4938734
           4938734
           4938734
           4938734
           4938734
           4938734
           4938734
           4938734
           4938734
           4938734
           4938734
 
CHECKPOINT_CHANGE#
------------------
           4938734
 
已选择12行。
 
SYS@orcl#select file#,checkpoint_change# from v$datafile_header;
 
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            4938734
         2            4938734
         3            4938734
         4            4938734
         5            4938734
         6            4938734
         7            4938734
         8            4938734
         9            4938734
        10            4938734
        11            4938734
 
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
        12            4938734
 
已选择12行。
 
SYS@orcl#
然后在看一下v$log 的FIRST_CHANGE#可以看出来,日志已经和数据库的相关的scn不一样了,也就是oracle认为这个日志是有问题的,它不知道现在哪个是current 日志了。所以需要重新
resetlogs(说的有点简略了哈)
4、恢复控制文件时尽量用什么方法可以避免用resetlogs打开库?
可以重建控制文件,其他我没想到 。请大家给予方法。谢谢。
5、说说什么是incarnation,看了下面信息能理出一些关系不?
这个就是数据开启了一个新的逻辑生命周期。(简略了,时间很晚了)

www.htsjk.Com true http://www.htsjk.com/oracle/21820.html NewsArticle 手工恢复控制文件的深入解析 手工恢复控制文件的深入解析 v$database.CHECKPOINT_CHANGE# (last scn checkpointed) v$database.CONTROLFILE_SEQUENCE# (control file sequence number incremented by control file transactions) v...
相关文章
    暂无相关文章
评论暂时关闭