创建控制文件resetlogs和noresetlogs的区别




查看控制文件
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(原文这里是大写)( 这里具体是看你要重建控制文件数据库具体的,貌似一个表空间一个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 RECORDS内容:(这里我就全不打出来了累啊!!!主要的是)
...
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(原文这里是大写)( 这里具体是看你要重建控制文件数据库具体的,貌似一个表空间一个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(原文这里是大写)( 这里具体是看你要重建控制文件数据库具体的,貌似一个表空间一个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;
 
到这里两者的区别就很清楚了,这对一些数据库的灾难恢复有很好的帮助。希望对大家有用!


补充:
1. 使用resetlogs选项时,System Checkpoint SCN会被归为0,而其中记录的各个数据文件的Datafile Checkpoint SCN则来自于Start SCN(也就是说可能会从冷备份的数据文件的数据文件头中获取)。根据上述的描述,此时需要采用using backup controlfile做recovery。 因此情况是 System Checkpoint SCN=0 < Start SCN = Datafile Checkpoint SCN
2. 使用noresetlogs选项时,有一个前提就是:一定要有online redo log的存在。否则就要使用resetlogs选项。这个时候控制文件重建好时,其system checkpoint SCN=Datafile Checkpoint SCN=Lastest Checkpoint SCN in online redo log,我们可以看到Datafile Checkpoint SCN并没有从Start SCN中读取。而是读取了最新的日志文件中的SCN作为自己的数据。此时重建的控制文件在恢复中的作用跟最新的控制文件类似,System Checkpoint SCN(已经读取最新的redo log的checkpoint SCN信息)可能会>Start SCN (因为数据文件可能会从冷备份中恢复),恢复时就不需要加using backup controlfile子句了。
关于backup controlfile的补充 
backup controlfile只有备份时刻的archive log信息,并没有DB crash时刻的archive log信息,所以并不会自动应用online redo log,而是提示找不到序号为Lastest Archive log sequence + 1 的archive log。尽管你可以手动指定online redo log来实现完全恢复,但因为一旦使用了using backup controlfile子句,Oracle就视为不完全恢复,必须open resetlogs! 实际上,假如你有旧的控制文件又不想resetlogs,那很简单,使用旧的控制文件mount然后 backup to trace ,然后手工创建控制文件,使用 reuse database ... noresetlogs 。这样就可以 recover database 自动恢复并open database 而不用 resetlogs 了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值