有一个问题,使用旧备份控制文件时候恢复到最新, 总是要using backup controlfile
经过pub 朋友 SUNBLAZE (端着AK的猫 ),给了思路~~也许是需要instance recover
特此实验记录下
SQL> @d:\backup\backupctl.txt
已复制 1 个文件。
已复制 1 个文件。
已复制 1 个文件。
SQL> alter system switch logfile;~~~~~~~~~~~~~~~因为是实验~需要执行一次,若备份和current controlfile中间~没有2次checkpoint,那么备份controlfile可以直接使用
对比的是 controlfile中 Checkpoint cnt,与file header 中 ctl cnt(这个就是防止更新controlfile时候abort)
系统已更改。
SQL> alter system checkpoint;
系统已更改。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 226495364 bytes
Database Buffers 377487360 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL>
SQL> select sequence#,group#,status from v$log;
SEQUENCE# GROUP# STATUS
---------- ---------- ----------------
11 1 CURRENT
9 3 INACTIVE
10 2 INACTIVE
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1435071 1435071~~~~~~~~~~~~~~datafile scn ,stop scn
1435071 1435071
1435071 1435071
1435071 1435071
1435071 1435071
1435071 1435071
1435071 1435071
1435071 1435071
已选择8行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1435071~~~~~~~~~~~~~~~~~~~~~~~~~START SCN
1435071
1435071
1435071
1435071
1435071
1435071
1435071
已选择8行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1435071~~~~~~~~~~~~~~~~~~~~~~~~~SYSTEM SCN
以上信息是 当前控制文件中信息
SQL> shutdown immediate;
ORA-01109: 数据库未打开
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~restore controlfile
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 226495364 bytes
Database Buffers 377487360 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01122: 数据库文件 1 验证失败
ORA-01110: 数据文件 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'
ORA-01207: 文件比控制文件更新 - 旧的控制文件
SQL> select sequence#,group#,status from v$log;
SEQUENCE# GROUP# STATUS
---------- ---------- ----------------
8 1 INACTIVE
9 3 INACTIVE
10 2 CURRENT
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1432437
1432437
1432437 ~~~~~~没有 stop scn(其实应该有值,我备份时候是 online 没关闭database 所以controlfile中没记录stop scn ,为无穷大)
1432437
1432437
1432437
1432437
1432437
已选择8行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1435071
1435071
1435071 START SCN 不等于stop scn, 需要 instance recover 应用current redo log
1435071
1435071
1435071
1435071
1435071
已选择8行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1432437
SQL>
SQL> recover database using backup controlfile;
ORA-00279: 更改 1434879 (在 09/11/2009 09:35:13 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ARCHIVELOG\ARC00011_0697045088.001.ARC
ORA-00280: 更改 1434879 (用于线程 1) 在序列 #11 中
指定日志: {=suggested | filename | AUTO | CANCEL}
E:\oracle\product\10.2.0\oradata\orcl\redo01.log
已应用的日志。
完成介质恢复。
SQL> select sequence#,group#,status from v$log;
SEQUENCE# GROUP# STATUS
---------- ---------- ----------------
8 1 INACTIVE
9 3 INACTIVE
10 2 CURRENT
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1432437 1435071
1432437 1435071~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~stop SCN
1432437 1435071
1432437 1435071
1432437 1435071
1432437 1435071
1432437 1435071
1432437 1435071
已选择8行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1435071
1435071
1435071~~~~~~~~~~~~~~~~~~~~~~~~~~~START SCN
1435071
1435071
1435071
1435071
1435071
已选择8行。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~STOP SCN=START SCN 不需要instance recover
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1432437
~~~~~~~~~~~~~~~~~~~~controlfile其它信息没变 但是多了STOP SCN(同步了)
SQL> alter session set events 'immediate trace name controlf level 8';
会话已更改。
SQL> alter system dump logfile 'E:\oracle\product\10.2.0\oradata\orcl\redo01.log';
系统已更改。
DUMP CONTROLFILE
DATA FILE #2:
(name #9) E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
creation size=0 block size=8192 status=0xe head=9 tail=9 dup=1
tablespace 1, index=2 krfil=2 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:255 scn: 0x0000.0015db75 09/11/2009 09:00:58
Stop scn: 0x0000.0015e5bf 09/11/2009 09:35:49~~~~STOP SCN
Creation Checkpointed at scn: 0x0000.00081f74 08/30/2005 17:25:44
thread:0 rba:(0x0.0.0)
SQL> select to_number('15e5bf','xxxxxxxx') from dual;
TO_NUMBER('15E5BF','XXXXXXXX')
------------------------------
1435071
DUMP OF REDO FROM FILE 'E:\oracle\product\10.2.0\oradata\orcl\redo01.log'
Opcodes *.*
RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff
SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff
Times: creation thru eternity
FILE HEADER:
Low scn: 0x0000.0015e4ff (1434879) 09/11/2009 09:35:13~~~~v$log FIRST_CHANGE#
Next scn: 0xffff.ffffffff 01/01/1988 00:00:00~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这是current logfile
Thread closed scn: 0x0000.0015e5bf (1435071) 09/11/2009 09:35:49~~~~~~~~~~~~从redo获得了STOP SCN
SQL> alter database open resetlogs;
数据库已更改。
小结:使用备份控制文件恢复到最新的时候 oracle 发现控制文件中stop scn比 datafile 中start scn要小所以需要instance reocver ,instanc recover 就是用current redo
log