关于重建控制文件的两种方式以及区别(resetlogs,noresetlogs)
关于resetlogs,与noresetlogs的间接,可以由
alterdatabase backup control file to trace ;
中获得,相关的介绍。
[oracle@pc-flynnudump]$ more orcl_ora_7145.trc
Set#1. NORESETLOGS case
--
--The following commands will create a new control file and use it
--to open the database.
--Data used by Recovery Manager will be lost.
--Additional logs may be required for mediarecovery of offline
--Use this only if the current versions of allonline logs are
--available.
--After mounting the created controlfile, the following SQL
--statement will place the database in the appropriate
--protection mode:
-- ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUPNOMOUNT
CREATECONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
MAXLOGFILES16
MAXLOGMEMBERS3
MAXDATAFILES100
MAXINSTANCES8
MAXLOGHISTORY292
LOGFILE
GROUP1 '/u01/app/oracle/product/10.2.0/oradata/orcl/redo01.log' SIZE 50M,
GROUP2 '/u01/app/oracle/product/10.2.0/oradata/orcl/redo02.log' SIZE 50M,
GROUP3 '/u01/app/oracle/product/10.2.0/oradata/orcl/redo03.log' SIZE 50M
--STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/product/10.2.0/oradata/orcl/system01.dbf',
'/u01/app/oracle/product/10.2.0/oradata/orcl/undotbs01.dbf',
'/u01/app/oracle/product/10.2.0/oradata/orcl/sysaux01.dbf',
'/u01/app/oracle/product/10.2.0/oradata/orcl/users01.dbf',
'/u01/app/oracle/product/10.2.0/oradata/orcl/example01.dbf'
CHARACTERSET WE8ISO8859P1
;
-- Set #2. RESETLOGS case
--
--The following commands will create a new control file and use it
--to open the database.
--Data used by Recovery Manager will be lost.
--The contents of online logs will be lost andall backups will
--be invalidated. Use this only if online logs are damaged.
--After mounting the created controlfile, the following SQL
--statement will place the database in the appropriate
--protection mode:
-- ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUPNOMOUNT
CREATECONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
MAXLOGFILES16
MAXLOGMEMBERS3
MAXDATAFILES100
MAXINSTANCES8
MAXLOGHISTORY292
LOGFILE
GROUP1 '/u01/app/oracle/product/10.2.0/oradata/orcl/redo01.log' SIZE 50M,
GROUP2 '/u01/app/oracle/product/10.2.0/oradata/orcl/redo02.log' SIZE 50M,
GROUP3 '/u01/app/oracle/product/10.2.0/oradata/orcl/redo03.log' SIZE 50M
--STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/product/10.2.0/oradata/orcl/system01.dbf',
'/u01/app/oracle/product/10.2.0/oradata/orcl/undotbs01.dbf',
'/u01/app/oracle/product/10.2.0/oradata/orcl/sysaux01.dbf',
'/u01/app/oracle/product/10.2.0/oradata/orcl/users01.dbf',
'/u01/app/oracle/product/10.2.0/oradata/orcl/example01.dbf'
CHARACTERSET WE8ISO8859P1
;
无聊的时候总结并实验了一下以两种方式(resetlogs和noresetlogs)重建控制文件.总结了一下,希望大家来多多指点出自己的不足:
利用noresetlogs方式重建控制文件
-------------------------------
首先要保证有必须的重作日志文件组的存在。这个时候存在的几个日志文件组和数据库文件会将他们信息记录在重新好的控制文件当中,并且会将数据库的状态由nomount变为mount,并且控制文件中记录的对应数据文件的开始checkpointSCN等于StopSCN,并且等于我们的database,redo的checkpointSCN,我们通过转存储控制文件的方法可以得知,表示数据库处于同步状态,例如:
DATABASEENTRY:
---------------
Databasecheckpoint: Thread=1 scn: 0x0000.0002365f
REDO THREADRECORDS:
--------------------
Checkpointedat scn: 0x0000.0002365f 08/07/2007 18:48:44
DATAFILE RECORDS:
-------------------
Checkpointcnt:101 scn: 0x0000.0002365f 08/07/2007 18:48:44
Stop scn:0x0000.0002365f 08/07/2007 18:52:29
如果此时,我们通过alterdatabase open的命令将数据库变成打开状态,我们再转储控制文件的时候会发现,此时重做日志文件组会发生一次日志切换(switchlog),并且会产生一次checkpoint.
此时数据库也是同步的(数据库,日志,数据库文件的SCN是一致),只不过数据库在打开的时候。会将每一个数据文件的Stopscn设为无穷大(0xffff.ffffffff)。
利用resetlogs方式重建控制文件
-----------------------------
利用resetlogs方式来重新建立控制文件是在我们日志文件组缺少或不全的状态下进行的。也就是说在控制文件建好之后open数据库的时候一定是需要用resetlogs的选项将数据库打开,openresetlogs这个操作将会清空我们的日志文件组,并且将我们日志文件组的sequence全部清零。那么打开之后我们需要做一次全库备份。因为之前的归档日志和在线日志由于我们所进行的resetlogs操作已经都不能用了。在我们做recover的时候oracle会去读取控制文件中记录的redo和归档信息,因为redo日志已经被重置都变为了0,所以我们需要做一次全库备份。继续走我们的正题,当以resetlogs方式重建控制文件后,数据库文件会将他们的信息记录到新建的控制文件当中,而redo日志文件组的信息,在控制文件中都是无效状态,需要用resetlogs方式打开数据库后进行更新,例如:
Low scn: 0x0000.0000000001/01/1988 00:00:00
Next scn: 0x0000.00000000 01/01/198800:00:00
同时观察到数据文件的checkpointSCN不等于StopSCN类似于异常关闭状态(因为stopSCN是0xffff.ffffffff):
DATABASEENTRY:
---------------
Databasecheckpoint: Thread=0 scn: 0x0000.00000000
REDO THREADRECORDS:
--------------------
Checkpointedat scn: 0x0000.00000000
DATA FILERECORDS:
-------------------
Checkpointcnt:103 scn: 0x0000.00023821 08/07/2007 19:10:39
Stop scn:0xffff.ffffffff 08/07/2007 19:15:22
同样如果此时,我们通过alterdatabaseopen的命令将数据库变成打开状态,我们再一次的转储控制文件的时候会发现,此时Oracle会产生两次checkpoint(在数据库文件的checkpointcnt可以对比看出来),此时数据库也是同步的(数据库,日志,数据库文件的SCN是一致),只不过数据库在打开的时候。会将每一个数据文件的Stopscn保持为无穷大(0xffff.ffffffff),重做日志也从默认的第三组开始边为current且sequence号为1,所对应的first_change#号就是resetlogsscn + 1