使用备份控制文件做完全恢复前提:
1)使用之前备份的控制文件,对从当前控制文件还原的数据文件的做完全恢复。 2)完全恢复需要用到控制文件中记录的online redo log、current redo log的信息 (archive log + current、online redo log) 【归档模式】 |
环境介绍
1).有一个之前备份的控制文件 2).当前备份已经还原,备份后有新的事物操作。 |
SYS@ TestDB12>select sequence#, status, group# from v$LOG ; SEQUENCE# STATUS GROUP# ---------- ---------------- ---------- 43 CURRENT 1 41 INACTIVE 2 42 INACTIVE 3 SYS@ TestDB12>create table EMP as select * from SCOTT.EMP ; Table created. 完全恢复后能查看到EMP表。 |
1、使用当前的控制文件从备份还原数据文件
SYS@ TestDB12>startup mount ; RMAN> restore database ; |
或者控制文件损坏了,当前数据库无法做恢复,此时使用旧的控制文件做恢复。 |
2、还原旧的控制文件
SYS@ TestDB12>startup nomount ; SYS@ TestDB12>show parameter control_files; NAME TYPE VALUE -------------------------- ------------------------------ control_files string /u01/app/oracle/oradata/TestDB12/control01.ctl, /u01/app/oracle/fast_recovery_area/TestDB12/control02.ctl [oracle@rh55 ~] $cp /u02/db12.ctl /u01/app/oracle/oradata/TestDB12/control01.ctl [oracle@rh55 ~] $cp /u02/db12.ctl /u01/app/oracle/fast_recovery_area/TestDB12/control02.ctl |
3、MOUTdatabase
SYS@ TestDB12>alter database mount ; Database altered. |
4、数据库recover,恢复时不以控制文件记录信息为主
SYS@ TestDB12>recover database using backup controlfile ; 有报错,原因是旧的控制文件中没有当前库的current online redo log ORA-00308: cannot open archived log '/oracle/arch/1_43_844840244.dbf' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3 |
开库:不能打开数据库,除非不完全恢复RESETLOGS.
想要完全恢复,就要应用上current redo信息,当前已经应用所有的归档信息。
旧的控制文件中没有当前online redo的记录,只能通过重建控制文件,重新扫描数据库,
自动添加当前online redo 到控制文件中。
SYS@ TestDB12>select group#, sequence#, status from v$log ; GROUP# SEQUENCE# STATUS ---------- ---------- ---------------- 1 28 ACTIVE 3 30 CURRENT 2 29 ACTIVE |
5、重建控制文件
1) 导出控制文件重建脚本: SYS@ TestDB12>alter database backup controlfile to trace ; Database altered. |
2)根据时间找SID_ora_*.trc文件,里面有两个控制文件的重建脚本RESETLOGS和NORESETLOGS SYS@ TestDB12>show parameter user_dump NAME TYPE VALUE ---------------------------- ------------------------------------------------------------------------ user_dump_dest string /u01/app/oracle/diag/rdbms/testdb12/TestDB12/trace
11G环境可以使用v$diag_info视图查找当前trace文件: select value from v$diag_info where name='Default Trace File' ;
将标示为NORESETLOGS的重建控制文件脚本拷贝出来。 |
3)重建控制文件 SYS@ TestDB12>startup nomount force ; SYS@ TestDB12> CREATE CONTROLFILE REUSE DATABASE "TESTDB12" NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/TestDB12/redo01.log' SIZE 50M BLOCKSIZE 512, GROUP 2 '/u01/app/oracle/oradata/TestDB12/redo02.log' SIZE 50M BLOCKSIZE 512, GROUP 3 '/u01/app/oracle/oradata/TestDB12/redo03.log' SIZE 50M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE '/oracle/oradata/system01.dbf', '/oracle/oradata/sysaux01.dbf', '/oracle/oradata/undotbs01.dbf', '/oracle/oradata/users01.dbf', '/oracle/oradata/example01.dbf', '/oracle/oradata/undotbs02.dbf', '/oracle/oradata/fsh_arch01.dbf' CHARACTER SET AL32UTF8 ;
Control file created. |
6、数据库mount
SYS@ TestDB12>select status from v$instance ; STATUS ------------ MOUNTED |
7、控制文件能够识别数据库的current online redo了
SYS@ TestDB12>select group#, status, sequence# from v$log ; GROUP# STATUS SEQUENCE# ---------- ---------------- ---------- 1 CURRENT 43 3 INACTIVE 42 2 INACTIVE 41 |
8、恢复数据库
SYS@ TestDB12>recover database ; Media recovery complete. |
9、正常打开数据库,并验证已经完全恢复
SYS@ TestDB12>alter database open ; Database altered. |
SYS@ TestDB12>select count(*) from emp ; COUNT(*) ------------- 14 |
要点就是重建控制文件,识别到 current online log ,这对做完全恢复至关重要。