场景描述:控制文件损坏(控制文件内容变化)
1.1.备份
1 SQL> alter database backup controlfile to '/u01/admin/sun/udump/c.bin'; 2 3 Database altered. 4 5 SQL>
1.2.查看当前表空间
1 SQL> select ts#,name from v$tablespace order by 1; 2 3 TS# NAME 4 ---------- ------------------------------ 5 0 SYSTEM 6 1 UNDOTBS1 7 2 SYSAUX 8 3 TEMP 9 4 USERS 10 6 EXAMPLE 11 7 SUN01 12 8 SUN02 13 14 8 rows selected. 15 16 SQL>
2模拟场景
2.1.创建表空间sun03 (控制文件能容将被修改)
1 SQL> create tablespace sun03 datafile '/u01/oradata/sunbak/sun03_1.dbf' size 5M 2 2 extent management local uniform 3 3 segment space management auto; 4 5 Tablespace created. 6 7 SQL>
2.2在sun03上建表 插入数据
1 SQL> conn user1/user1 2 Connected. 3 SQL> create table t4 (id int,name varchar2(16)) tablespace sun03; 4 5 Table created. 6 7 SQL> insert into t4 values(0,'oracle'); 8 9 1 row created. 10 11 SQL> commit; 12 13 Commit complete. 14 15 SQL>
2.3损坏当前控制文件
1 -bash-3.00$ pwd 2 /u01/oradata/sunbak 3 -bash-3.00$ ls -l 4 total 2195216 5 -rw-r----- 1 oracle oinstall 7389184 Jan 25 19:14 control01.ctl 6 -rw-r----- 1 oracle oinstall 7389184 Jan 25 19:14 control02.ctl 7 -rw-r----- 1 oracle oinstall 7389184 Jan 25 19:14 control03.ctl 8 -rw-r----- 1 oracle oinstall 104865792 Jan 25 18:33 example01.dbf 9 -rw-r----- 1 oracle oinstall 52429312 Jan 25 18:17 redo01.log 10 -rw-r----- 1 oracle oinstall 52429312 Jan 25 19:13 redo02.log 11 -rw-r----- 1 oracle oinstall 52429312 Jan 25 18:17 redo03.log 12 -rw-r----- 1 oracle oinstall 10493952 Jan 25 18:33 sun01_1.dbf 13 -rw-r----- 1 oracle oinstall 10493952 Jan 25 18:33 sun02_1.dbf 14 -rw-r----- 1 oracle oinstall 5251072 Jan 25 19:09 sun03_1.dbf 15 -rw-r----- 1 oracle oinstall 251666432 Jan 25 19:13 sysaux01.dbf 16 -rw-r----- 1 oracle oinstall 503324672 Jan 25 19:13 system01.dbf 17 -rw-r----- 1 oracle oinstall 20979712 Jan 23 04:03 temp01.dbf 18 -rw-r----- 1 oracle oinstall 31465472 Jan 25 19:13 undotbs01.dbf 19 -rw-r----- 1 oracle oinstall 5251072 Jan 25 18:33 users01.dbf 20 -bash-3.00$ rm -f control* 21 -bash-3.00$
3.关闭数据库
1 SQL> shutdown abort 2 ORACLE instance shut down. 3 SQL>
4恢复
4.1.将备份的控制文件拷贝过来
1 -bash-3.00$ pwd 2 /u01/oradata/sunbak 3 -bash-3.00$ 4 -bash-3.00$ cp /u01/admin/sun/udump/c.bin control01.ctl 5 -bash-3.00$ cp /u01/admin/sun/udump/c.bin control02.ctl 6 -bash-3.00$ cp /u01/admin/sun/udump/c.bin control03.ctl 7 -bash-3.00$
4.2 开启到mount状态
1 SQL> startup mount 2 ORACLE instance started. 3 4 Total System Global Area 289406976 bytes 5 Fixed Size 1279820 bytes 6 Variable Size 92276916 bytes 7 Database Buffers 192937984 bytes 8 Redo Buffers 2912256 bytes 9 Database mounted. 10 SQL> 11 #查看当前表空间,此时sun03不存在 12 SQL> select ts#,name from v$tablespace order by 1; 13 14 TS# NAME 15 ---------- ------------------------------ 16 0 SYSTEM 17 1 UNDOTBS1 18 2 SYSAUX 19 3 TEMP 20 4 USERS 21 6 EXAMPLE 22 7 SUN01 23 8 SUN02 24 25 8 rows selected. 26 27 SQL>
4.3 恢复
1 SQL> recover database using backup controlfile; 2 ORA-00279: change 687115 generated at 01/25/2013 18:33:51 needed for thread 1 3 ORA-00289: suggestion : /u01/admin/sun/arch/1_26_805319563.dbf 4 ORA-00280: change 687115 for thread 1 is in sequence #26 5 #此时恢复提示需要归档日志文件1_26_805319563.dbf,到归档目录查看不存在此归档日志文件 6 #说明1_26_805319563.dbf的内容在redo日志文件中,目前不确定在哪一个文件中,只能一个个尝试 7 #-bash-3.00$ ls -ltr 8 #total 111836 9 .............. 10 #-rw-r----- 1 oracle oinstall 3584 Jan 23 04:35 1_23_805319563.dbf 11 #-rw-r----- 1 oracle oinstall 87552 Jan 25 11:26 1_24_805319563.dbf 12 #-rw-r----- 1 oracle oinstall 9251840 Jan 25 18:17 1_25_805319563.dbf 13 14 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} 15 /u01/oradata/sunbak/redo01.log 16 ORA-00310: archived log contains sequence 25; sequence 26 required 17 ORA-00334: archived log: '/u01/oradata/sunbak/redo01.log' 18 19 20 SQL> 21 #说明数据不再redo01.log中
4.4再次执行恢复
1 SQL> recover database using backup controlfile; 2 ORA-00279: change 687115 generated at 01/25/2013 18:33:51 needed for thread 1 3 ORA-00289: suggestion : /u01/admin/sun/arch/1_26_805319563.dbf 4 ORA-00280: change 687115 for thread 1 is in sequence #26 5 6 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} 7 /u01/oradata/sunbak/redo02.log 8 ORA-00283: recovery session canceled due to errors 9 ORA-01244: unnamed datafile(s) added to control file by media recovery 10 ORA-01110: data file 8: '/u01/oradata/sunbak/sun03_1.dbf' 11 12 13 ORA-01112: media recovery not started 14 15 16 SQL> 17 #此时/u01/oradata/sunbak/sun03_1.dbf文件名 已经加入到了控制文件中 18 #-bash-3.00$ strings control01.ctl |grep sun 19 #/u01/oradata/sunbak/sun03_1.dbf
4.5查看alter日志
1 ALTER DATABASE RECOVER LOGFILE '/u01/oradata/sunbak/redo02.log' 2 Fri Jan 25 19:38:28 2013 3 Media Recovery Log /u01/oradata/sunbak/redo02.log 4 File #8 added to control file as 'UNNAMED00008'. Originally created as: 5 '/u01/oradata/sunbak/sun03_1.dbf' 6 Some recovered datafiles maybe left media fuzzy 7 Media recovery may continue but open resetlogs may fail 8 Fri Jan 25 19:38:32 2013 9 Media Recovery failed with error 1244 10 ORA-283 signalled during: ALTER DATABASE RECOVER LOGFILE '/u01/oradata/sunbak/redo02.log' ... 11 Fri Jan 25 19:38:32 2013 12 ALTER DATABASE RECOVER CANCEL 13 ORA-1112 signalled during: ALTER DATABASE RECOVER CANCEL ...
4.6 继续恢复(此步骤可忽略)
1 SQL> recover database using backup controlfile; 2 ORA-00283: recovery session canceled due to errors 3 ORA-01111: name for data file 8 is unknown - rename to correct file 4 ORA-01110: data file 8: '/u01/oracle/dbs/UNNAMED00008' 5 ORA-01157: cannot identify/lock data file 8 - see DBWR trace file 6 ORA-01111: name for data file 8 is unknown - rename to correct file 7 ORA-01110: data file 8: '/u01/oracle/dbs/UNNAMED00008' 8 9 SQL> 10 11 报错显示:不能识别8号文件,需要重命名.现在查看两个视图: 12 SQL> select * from v$recover_file; 13 14 FILE# ONLINE ONLINE_ ERROR CHANGE# TIME 15 ---------- ------- ------- -------------------- ---------- --------- 16 8 ONLINE ONLINE FILE MISSING 0 17 18 SQL> 19 #8号文件是需要被恢复的 20 SQL> select file#,name from v$datafile; 21 22 FILE# NAME 23 ---------- ---------------------------------------- 24 1 /u01/oradata/sunbak/system01.dbf 25 2 /u01/oradata/sunbak/undotbs01.dbf 26 3 /u01/oradata/sunbak/sysaux01.dbf 27 4 /u01/oradata/sunbak/users01.dbf 28 5 /u01/oradata/sunbak/example01.dbf 29 6 /u01/oradata/sunbak/sun01_1.dbf 30 7 /u01/oradata/sunbak/sun02_1.dbf 31 8 /u01/oracle/dbs/UNNAMED00008 32 33 8 rows selected. 34 35 SQL> 36 #8号文件为/u01/oracle/dbs/UNNAMED00008
4.7重命名8号文件
1 SQL> alter database rename file '/u01/oracle/dbs/UNNAMED00008' to '/u01/oradata/sunbak/sun03_1.dbf'; 2 3 Database altered. 4 5 SQL>
4.8 继续恢复
1 SQL> recover database using backup controlfile ; 2 ORA-00279: change 688614 generated at 01/25/2013 19:09:32 needed for thread 1 3 ORA-00289: suggestion : /u01/admin/sun/arch/1_26_805319563.dbf 4 ORA-00280: change 688614 for thread 1 is in sequence #26 5 6 7 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} 8 /u01/oradata/sunbak/redo01.log 9 ORA-00310: archived log contains sequence 25; sequence 26 required 10 ORA-00334: archived log: '/u01/oradata/sunbak/redo01.log' 11 12 13 SQL> recover database using backup controlfile ; 14 ORA-00279: change 688614 generated at 01/25/2013 19:09:32 needed for thread 1 15 ORA-00289: suggestion : /u01/admin/sun/arch/1_26_805319563.dbf 16 ORA-00280: change 688614 for thread 1 is in sequence #26 17 18 19 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} 20 /u01/oradata/sunbak/redo02.log 21 Log applied. 22 Media recovery complete. 23 SQL>
5.打开数据库
1 SQL> alter database open resetlogs; 2 3 Database altered. 4 5 SQL>