备份:
alter database backup controlfile to 'xxxxxxx' reuse;
alter database bakcup controlfile to trace as 'xxxxxxx'; RMAN备份控制文件 |
1.控制文件损坏后利用二进制备份恢复(异常断电)
备份控制文件:
alter database backup controlfile to '/home/oracle/control.ctl ' reuse; 插入测试数据: SQL> insert into t1 values(1); SQL> commit; 模拟断电: SQL> shutdown abort; 模拟控制文件故障: rm -rf /database/oradata/skyread/control01.ctl rm -rf /database/oradata/skyread/control02.ctl rm -rf /database/oradata/skyread/control03.ctl 再次开启数据库: SQL> startup; ORA-00205: error in identifying control file, check alert log for more info 报00205错误 把备份文件复制到数据库控制文件所在位置: cp /home/oracle/control.ctl /database/oradata/skyread/control01.ctl cp /home/oracle/control.ctl /database/oradata/skyread/control02.ctl cp /home/oracle/control.ctl /database/oradata/skyread/control03.ctl SQL> startup force mount Total System Global Area 5049942016 bytes Fixed Size 2090880 bytes Variable Size 1375733888 bytes Database Buffers 3657433088 bytes Redo Buffers 14684160 bytes Database mounted. |
检查数据文件,数据文件头,日志文件以及控制文件的scn信息,由于是机器断电,所以这里fuzzy的状态是YES
SQL> select file#,status,fuzzy,CHECKPOINT_CHANGE# from v$datafile_header;
FILE# STATUS FUZ CHECKPOINT_CHANGE#
-------------------- ------- --- --------------------
1 ONLINE YES 122694280130
2 ONLINE YES 122694280130
3 ONLINE YES 122694280130
4 ONLINE YES 122694280130
18 ONLINE YES 122694280130
26 ONLINE YES 122694280130
31 ONLINE YES 122694280130
SQL> select group#,sequence#,members,archived,status,first_change# from v$log;
GROUP# SEQUENCE# MEMBERS ARC STATUS FIRST_CHANGE#
-------------------- -------------------- -------------------- --- ---------------- --------------------
1 1 1 NO CURRENT 122694212304
2 2 1 YES INACTIVE 122693905385
5 3 1 YES INACTIVE 122694191761
4 4 1 YES INACTIVE 122694190542
3 5 1 YES INACTIVE 122694168156
CONTROLFILE_CHANGE#是备份时的控制文件SCN,这里数据文件的检查点肯定是大于当时备份的控制文件,所以数据打开的时候,数据文件,日志文件,控制文件的检查点信息是不一致的,要进行介质恢复到一致,才能打开,以上V$LOG,V$DATAFILE都是和备份的控制文件的检查点一致的。但是v$datafile_header记录的是最新的,就是数据库关闭前的。所以如果打开的时候做会做检查,检查数据文件头的检查点计数和与现在控制文件的检查点技术是否相等,如果相等,进行第二次检查,也就是检查数据文件头开始的SCN和控制文件结束的SCN是否相等,如果相等,就不需要进行恢复,不相等,就需要进行恢复。这里明显是不相等的,所以需要recovery。
SQL> select checkpoint_change#,controlfile_change#,resetlogs_change# from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_CHANGE# RESETLOGS_CHANGE#
-------------------- -------------------- --------------------
122694212305
122694259161
122693676208
介质恢复数据库:提示需要应用redo01.log
SQL> recover database using backup controlfile;
ORA-00279: change 122694280130 generated at 05/03/2013 11:25:37 needed for
thread 1
ORA-00289: suggestion : /database/oradata/arch/1_1_814447469.dbf
ORA-00280: change 122694280130 for thread 1 is in sequence #1
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/database/oradata/skyread/redo01.log
Log applied.
Media recovery complete.
重置日志文件打开数据库:
SQL> alter database open resetlogs;
Database altered.
2.控制文件损坏后利用trace文件重建控制文件(正常关机)
备份控制文件为文本格式
SQL> alter database backup controlfile to trace as '/home/oracle/controlfile.sql' reuse;
Database altered.
干净关闭数据库并破坏所有控制文件
SQL> shutdown immediate;
mv /database/oradata/skyread/control01.ctl /database/oradata/skyread/control01.ctl.bak
mv /database/oradata/skyread/control02.ctl /database/oradata/skyread/control02.ctl.bak
mv /database/oradata/skyread/control03.ctl /database/oradata/skyread/control03.ctl.bak
打开数据库出错
SQL> startup;
ORACLE instance started.
Total System Global Area 5049942016 bytes
Fixed Size 2090880 bytes
Variable Size 1375733888 bytes
Database Buffers 3657433088 bytes
Redo Buffers 14684160 bytes
ORA-00205: error in identifying control file, check alert log for more info
在nomount模式用
/home/oracle/controlfile.sql中的语句重建控制文件,注意这里用的是
NORESETLOGS,这里因为我们是干净关闭数据做的测试,相当于数据文件和日志文件都是没有损坏的,这里是基于数据文件头和日志文件头的信息构建出控制文件,所以这个控制文件和数据文件头和日志文件头都是一致的,既然是一致的,那么都不需要recover,直接打开数据库即可。
注意:这里如果是用二进制备份控制文件进行恢复,还是需要recover的,因为你备份的二进制文件和当前的数据文件头信息一般是不一致的。
CREATE CONTROLFILE REUSE DATABASE "SKYREAD" NORESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 20
MAXLOGMEMBERS 5
MAXDATAFILES 1000
MAXINSTANCES 8
MAXLOGHISTORY 2337
LOGFILE
GROUP 1 '/database/oradata/skyread/redo01.log' SIZE 512M,
GROUP 2 '/database/oradata/skyread/redo02.log' SIZE 512M,
GROUP 3 '/database/oradata/skyread/redo03.log' SIZE 512M,
GROUP 4 '/database/oradata/skyread/redo04.log' SIZE 512M,
GROUP 5 '/database/oradata/skyread/redo05.log' SIZE 512M
DATAFILE
'/database/oradata/skyread/system01.dbf',
'/database/oradata/skyread/tbs_test.dbf',
'/database/oradata/skyread/sysaux01.dbf',
'/database/oradata/skyread/users01.dbf',
'/database2/oradata/skyread/TBS_MRPMUSIC01.dbf',
'/database/oradata/skyread/sf01.dbf',
'/database2/oradata/skyread/undotbs02'
CHARACTER SET UTF8;
SQL> alter database open;
Database altered