最近遇到一个控制文件是损坏重建的case,有个疑问是重建的control file的SCN怎么获取的,于是问了万能的度娘,得到了答案
转至:http://space.itpub.net/35489/viewspace-693880
关于重建控制文件后, 控制文件中的数据文件检查点SCN来自哪里, 有下面两种说法 :
1. 用noresetlogs重建控制文件时,控制文件中datafile checkpoint SCN来自online logs 中的current log头部,选择noresetlogs重建使得控制文件最新。 如记录了最新的联机日志和日志序号。
2. 用noresetlogs重建控制文件后,这时查询v$log中的current redo log的first_change# 及v$database中的系统检查点SCN, 发现重建的控制文件中的系统检查点SCN从当前redo log的low SCN获得, 而控制文件里记录的数据文件检查点SCN(v$datafile)从数据文件头部(v$datafile_header)获得.
测试发现重建控制文件后,更新到新建控制文件中的系统检查点SCN及数据文件检查点SCN 好象都是来自于数据文件头的scn .
测试 :
SQL> insert into tony.test values (11,'CMM');
SQL> insert into tony.test values (12,'CMM');
SQL> commit;
提交完成。
SQL> alter database backup controlfile to trace ;
数据库已更改。
SQL> insert into tony.test values (13,'CMM');
SQL> insert into tony.test values (14,'CMM');
SQL> commit;
提交完成。
SQL> alter system switch logfile;
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
正常关闭数据库后,模拟手工删除控制文件。
SQL> host del D:\oracle\product\10.2.0\oradata\test01\CONTROL01.CTL
SQL> host del D:\oracle\product\10.2.0\oradata\test01\CONTROL02.CTL
SQL> host del D:\oracle\product\10.2.0\oradata\test01\CONTROL03.CTL
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 524288000 bytes
Fixed Size 1249920 bytes
Variable Size 159387008 bytes
Database Buffers 356515840 bytes
Redo Buffers 7135232 bytes
ORA-00205: ?????????, ??????, ???????
从tracefile中提出脚本重建控制文件。
SQL> CREATE CONTROLFILE REUSE DATABASE "TEST01" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\REDO01.LOG' SIZE 50M,
9 GROUP 2 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\REDO02.LOG' SIZE 50M,
10 GROUP 3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\REDO03.LOG' SIZE 50M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\SYSTEM01.DBF',
14 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\UNDOTBS01.DBF',
15 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\SYSAUX01.DBF',
16 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\USERS01.DBF'
17 CHARACTER SET AL32UTF8
18 ;
控制文件已创建。
SQL> select group#, first_change# from v$log where status='CURRENT' ;
GROUP# FIRST_CHANGE#
---------- -------------
1 902875 -- 在current redo log中的 LOW SCN
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
903181 -- 更新到新建控制文件中的系统检查点SCN
这时控制文件中的数据文件检查点SCN如下 CHECKPOINT_CHANGE# :
SQL> select file# , CHECKPOINT_CHANGE#, LAST_CHANGE# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
1 903181 903181
2 903181 903181
3 903181 903181
4 903181 903181
SQL> select file# , CHECKPOINT_CHANGE# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 903181 -- 数据文件头中的检查点SCN
2 903181
3 903181
4 903181
SQL> alter database mount;
SQL> select group#, first_change# from v$log where status='CURRENT' ;
GROUP# FIRST_CHANGE#
---------- -------------
3 903182
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
903565
SQL> select file# , CHECKPOINT_CHANGE#, LAST_CHANGE# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
1 903565 903565
2 903565 903565
3 903565 903565
4 903565 903565
SQL> select file# , CHECKPOINT_CHANGE# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 903565
2 903565
3 903565
4 903565
SQL> recover database using backup controlfile;
ORA-00279: 更改 903565 (在 04/27/2011 11:56:24 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\ARCH\ARC00003_0749482512.001
ORA-00280: 更改 903565 (用于线程 1) 在序列 #3 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\ARCH\ARC00003_0749482512.001'
ORA-27041: 无法打开文件
OSD-04002: ???????
O/S-Error: (OS 2) ????????????????
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\ARCH\ARC00003_0749482512.001'
ORA-27041: 无法打开文件
OSD-04002: ???????
O/S-Error: (OS 2) ????????????????
SQL> select group#, first_change# from v$log where status='CURRENT' ;
GROUP# FIRST_CHANGE#
---------- -------------
3 903182
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
903565
SQL> select file# , CHECKPOINT_CHANGE#, LAST_CHANGE# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
1 903565
2 903565
3 903565
4 903565
SQL> select file# , CHECKPOINT_CHANGE# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 903565
2 903565
3 903565
4 903565
SQL>
SQL> recover database using backup controlfile;
ORA-00279: 更改 903565 (在 04/27/2011 11:56:24 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\ARCH\ARC00003_0749482512.001
ORA-00280: 更改 903565 (用于线程 1) 在序列 #3 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
D:\oracle\product\10.2.0\oradata\test01\REDO03.LOG
已应用的日志。
完成介质恢复。
SQL>
SQL> select group#, first_change# from v$log where status='CURRENT' ;
GROUP# FIRST_CHANGE#
---------- -------------
3 903182
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
903565
SQL> select file# , CHECKPOINT_CHANGE#, LAST_CHANGE# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
1 903566 903566
2 903566 903566
3 903566 903566
4 903566 903566
SQL> select file# , CHECKPOINT_CHANGE# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 903566
2 903566
3 903566
4 903566
SQL> alter database open resetlogs ;
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\TEMP01.DBF'
2 SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;