手工恢复控制文件的深入解析
手工恢复控制文件的深入解析
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,看了下面信息能理出一些关系不?
这个就是数据开启了一个新的逻辑生命周期。(简略了,时间很晚了)
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。