相信对多次重建控制文件的朋友对这段英文不陌生吧,的确,这段英文解释已经很清楚地说了noresetlogs和resetlogs的使用在不同的场景了。
"Below are two sets of SQL statements, each of which creates a new control file and uses it to open the database.
---The first set opens the database with the NORESETLOGS option and should be used only ifthe current versions of all online logs are available.
---The second set opens the database with the RESETLOGS option and should be used if online logs are unavailable."
(1).resetlogs 表示一个数据库逻辑生存期的结束和
另一个数据库逻辑生存期的开始。数据库的逻辑生存期也被称为一个对应物(incarnation)。
(2).每次使用resetlogs 选项来打开数据库后都会创建一个新的数据库对应物,这对于恢复操作
来说非常重要。每次使用resetlogs 后,SCN 计数器不会被重置,但是Oracle会重置联机日
志序列号,同时还会重置联机重做日志内容。因此执行了resetlogs 之后,应该立即重新备
份整个数据库,否则恢复起来相当麻烦。(注:Oracle 10g中已经可以在resetlogs 之后不备
份数据库,恢复的时候能够穿越resetlogs)
下面正式切入正题:
查看控制文件
SQL> select name from v$controlfile;
将控制文件的创建语句备份到跟踪文件中;
SQL>alter database backup controlfile to trace;
查看跟踪文件其中内容包括
startup nomount
create controlfile reuse database "***" resetlog archivelog (***=oracle_sid
maxlogfiles 16
maxlogmembers 3
maxdatafiles 100
maxinstances 8
maxloghistory 454
logfile
group 1 '/.../.../.../redo01.log' size 10m,
group 2 '/.../.../.../redo02.log' size 10m,
group 3 '/.../.../.../redo03.log' size 10m
--standby logfile
datafile
'/.../.../.../systen01.dbf',
'/.../.../.../undotbs01.dbf',
'/.../.../.../sysaux01.dbf',
'/.../.../.../users01.dbf'
character set zhs16gbk
;
重建控制文件有一个主要选项需要理解:NORESETLOGS/RESETLOGS 在跟踪文件中包含以下注释,详细解释了这两个选项和含义:
--Below are two sets of SQL statements, each of which creates a new
--control file and uses it to open the database. The first set opens
--the database with the NORESETLOGS option and should be used only if
--the current versions of all online logs are available. The second
--set opens the database with the RESETLOGS option and should be used
--if online logs are unavailable.
下面开始测试来理解这两个选项
首先在数据库正常运行状态,可以执行一次控制文件转储:
SQL>alter session set events 'immediate trace name CONTROLF level 8';
这个转储文件中将包含数据库的检查点、REDO THREAD 信息、数据文件等信息,引用一点LOG FILE RECORD。
...
LOG FILE #1
...
Low scn:0x0004.6c279db0 03/28/2007 16:15:38
Next scn:0x0004.6c27b252 03/28/2007 16:15:50
LOG FILE #2
...
Low scn:0x0004.6c27b252 03/28/2007 16:15:50
Next scn:0xffff.ffffffff 01/01/1988 00:00:00
LOG FILE #3
...
Low scn:0x0004.6c273a84 03/28/2007 14:00:41
Next scn:0x0004.6c279db0 03/28/2007 16:15:38
从这里我们可以看出redo02.log文件时当前的日志文件
下面通过shutdown abort模拟一个数据库故障:
启动到nomount重建控制文件用noresetlogS。
SQL>startup nomount;
SQL> CREATE CONTROLFILE REUSE DATABASE "***" NORESETLOGS ARCHIVE(archive和当前数据库是否开启归档有关)
2 maxlogfiles 16
3 maxlogmembers 3
4 maxdatafiles 100
5 maxinstances 8
6 maxloghistory 454
7 logfile
8 group 1 '/.../.../.../redo01.log' size 10m,
9 group 2 '/.../.../.../redo02.log' size 10m,
10 group 3 '/.../.../.../redo03.log' size 10m
11 --standby logfile
12 datafile
13 '/.../.../.../systen01.dbf',
14 '/.../.../.../undotbs01.dbf',
15 '/.../.../.../sysaux01.dbf',
16 '/.../.../.../users01.dbf'
17 character set zhs16gbk
18 ;
(成功会出现 control file created)
我们再转储一次控制文件检查LOG FILE RECORD部分:
...
LOG FILE #1
...
Low scn:0x0004.6c279db0 03/28/2007 16:15:38
Next scn:0x0004.6c27b252 03/28/2007 16:15:50
LOG FILE #2
...
Low scn:0x0004.6c27b252 03/28/2007 16:15:50
Next scn:0xffff.ffffffff 01/01/1988 00:00:00
LOG FILE #3
...
Low scn:0x0004.6c273a84 03/28/2007 14:00:41
Next scn:0x0004.6c279db0 03/28/2007 16:15:38
我们可以发现通过NORESETLOGS重建控制文件的控制文件能够从当前的日志文件获得正确的SCN及时间点等信息。同样地,控制文件也能够从数据文件中获得详细的检查信息等:
DATA FILE #1
...
Checkpoint cnt:4673 scn: 0x0004.6c27b252 03/28/2007 16:15:50
Stop scn: 0xffff.ffffffff 03/28/2007 16:22:38
...
由于数据库是异常关闭的,所以数据文件的stop scn为无穷大:Stop scn: 0xffff.ffffffff。
下面对数据库执行恢复,然后记录控制文件信息:
SQL>RECOVER DATABSE;
SQL>alter session set events 'immediate trace name CONTROLF level 8';
以下是数据文件信息:
...
DATA FILE #1
...
Checkpoint cnt:4674 scn: 0x0004.6c27C3B4 03/28/2007 16:21:09
Stop scn: 0x0004.6c27C3B4 03/28/2007 16:21:09
...
恢复数据达到一致数据库可以顺利打开。
SQL>alter database open;
不需要使用 SQL>alter database open resetlogs;
下面再看下使用resetlogs的方式重建控制文件:
SQL> CREATE CONTROLFILE REUSE DATABASE "***" RESETLOGS ARCHIVE(archive和当前数据库是否开启归档有关)
2 maxlogfiles 16
3 maxlogmembers 3
4 maxdatafiles 100
5 maxinstances 8
6 maxloghistory 454
7 logfile
8 group 1 '/.../.../.../redo01.log' size 10m,
9 group 2 '/.../.../.../redo02.log' size 10m,
10 group 3 '/.../.../.../redo03.log' size 10m
11 --standby logfile
12 datafile
13 '/.../.../.../systen01.dbf',
14 '/.../.../.../undotbs01.dbf',
15 '/.../.../.../sysaux01.dbf',
16 '/.../.../.../users01.dbf'
17 character set zhs16gbk
18 ;
(成功会出现 control file created)
转储后查看LOG FILE RECORS的信息:
...
LOG FILE #1
...
Low scn:0x0000.00000000 01/01/1988 00:00:00
Next scn:0x0000.00000000 01/01/1988 00:00:00
LOG FILE #2
...
Low scn:0x0000.00000000 01/01/1988 00:00:00
Next scn:0x0000.00000000 01/01/1988 00:00:00
LOG FILE #3
...
Low scn:0x0000.00000000 01/01/1988 00:00:00
Next scn:0x0000.00000000 01/01/1988 00:00:00
可以注意到控制文件中的日志信息都是空的,oracle认为RESETLOGS方式下,当前的日志文件已经损坏,那么就意味着oracle可能丢失提交成功的数据,恢复将是一次不完全的介质恢复。
不完全恢复最终要求数据库通过resetlogs方式打开,resetlogs将会强制清空或重建在线日志文件。此时执行恢复必须使用backup controlfile选项,否则将出现错误 ORA-01610
树勇如下命令恢复数据库:
SQL> recover database using backup controlfile until cancel;
如果在线日志损坏,那么恢复到最后,oracle提示的最后一个归档日志将是不存在的(如果在线日志未损坏,则可以指定在线日志文件执行恢复),此时可以输入CANCEL取消恢复,然后通过resetlogs强制打开数据库。
SQL>alter database open resetlogs;