部分控制文件丢失

数据库默认会有两个控制文件存放在不同位置,如果其中一个文件丢失可以通过拷贝另一个控制文件进行恢复,这也是为什么要采用多路复用的原因。

停止数据库

SQL> shutdown immediate

拷贝恢复控制文件

$ cp /u01/app/oracle/oradata/ogg/control01.ctl /u01/app/oracle/fast_recovery_area/ogg/control02.ctl

启动数据库

SQL> startup

所有控制文件丢失,有备份

由于未启用CATALOG,备份信息都存储在控制文件上,控制文件丢失备份信息也就丢失了,无法通过RESTORE CONTROLFILE FROM AUTOBAKCUP来直接恢复了,需要指定控制文件备份集来恢复

恢复控制文件

RMAN> startup nomount
RMAN> restore controlfile from '/u01/backup/bak_04t4t2o0_1_1';
  
Starting restore at 2018-06-08 01:40:01
using channel ORA_DISK_1
  
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:07
output file name=/u01/app/oracle/oradata/ogg/control01.ctl
output file name=/u01/app/oracle/fast_recovery_area/ogg/control02.ctl
Finished restore at 2018-06-08 01:40:08

恢复数据库

SQL> recover database using backup controlfile until cancel; 

RESERTLOG启动数据库

SQL> alter database open resetlogs;

注:由于控制文件是通过备份恢复的,因此需要以RESETLOGS的方式启动数据库

全部控制文件丢失,无备份

当无法通过备份来恢复控制文件的话,只能通过手工创建一个新的控制文件,并在控制文件中指定数据文件位置和日志文件位置,能够在alert日志中找到相关信息。

启动数据库到nomount

SQL> startup nomount

创建控制文件

Create controlfile reuse set database "ogg" NORESETLOGS ARCHIVELOG
MAXINSTANCES 8
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
Datafile
'/u01/app/oracle/oradata/ogg/system01.dbf',
'/u01/app/oracle/oradata/ogg/sysaux01.dbf',
'/u01/app/oracle/oradata/ogg/undotbs01.dbf',
'/u01/app/oracle/oradata/ogg/users01.dbf'
LOGFILE
GROUP 1 ('/u01/app/oracle/oradata/ogg/redo01.log') SIZE 51200K,
GROUP 2 ('/u01/app/oracle/oradata/ogg/redo02.log') SIZE 51200K,
GROUP 3 ('/u01/app/oracle/oradata/ogg/redo03.log') SIZE 51200K
CHARACTER SET ZHS16GBK;

注:RESETLOGS/NORESETLOGS表示是否忽略LOGFILE中指定的日志文件内容,如果只是控制文件丢失,LOGFILE没问题的话则选择NORESETLOGS,反之则选择RESETLOGS。ARCHIVELOG/NOARCHIVELOG表示指定ARCHIVELOG时重新使用redo log前将其归档。默认未NOARCHILOG。

恢复数据库

SQL> recover database;

打开数据库

SQL> alter database open;

Tips:Performing User-Managed Recovery: Advanced Scenarios