【RMAN】控制文件损坏各种场景恢复

不同场景在满足不同的条件时的恢复方法:

针对不同的恢复方法给出具体的恢复思路:

1.1、通过重新拷贝冗余的控制文件

  1. 在线或者关闭数据库后损坏了其中部分控制文件;
  2. shutdown abort关闭数据库;
  3. 拷贝其中一个完好的控制文件;
  4. startup启动数据库。


2.1、 通过备份控制文件进行完全恢复

  1. 在线或者关闭数据库后损坏了所有控制文件;
  2. shutdown abort关闭数据库;
  3. startup nomount启动数据库;
  4. restore controlfile from ‘xxx’;从备份中还原控制文件;
  5. alter database mount;
  6. recover database using backup controlfile until cancel,在执行时选择auto自动应用所有的归档文件;
  7. 再次执行recover database using backup controlfile until cancel,选择应用未归档的redo文件;
  8. alter database open resetlogs;

2.2、通过备份控制文件进行不完全恢复

  1. 在线或者关闭数据库后损坏了所有控制文件;
  2. shutdown abort关闭数据库;
  3. startup nomount启动数据库;
  4. restore controlfile from ‘xxx’;从备份中还原控制文件;
  5. alter database mount;
  6. recover database using backup controlfile until cancel,在执行时选择auto自动应用尽可能多的归档文件;
  7. alter database open resetlogs;

2.3、通过备份控制文件进行重建的恢复(noresetlogs方式)

  1. 在线或者关闭数据库后损坏了所有控制文件;
  2. shutdown abort关闭数据库;
  3. startup nomount启动数据库;
  4. restore controlfile from ‘xxx’;从备份中还原控制文件;
  5. alter database mount;
  6. alter database backup controlfile to trace,生成创建控制文件的脚本;
  7. shutdown immediate并启动到startup nomount状态;
  8. 使用noresetlogs方式创建控制文件;
  9. recover database恢复数据库;
  10. 恢复完后通过alter database open打开数据库;

2.4、通过备份控制文件进行重建的恢复(resetlogs方式)

  1. 在线或者关闭数据库后损坏了所有控制文件;
  2. shutdown abort关闭数据库;
  3. startup nomount启动数据库;
  4. restore controlfile from ‘xxx’;从备份中还原控制文件;
  5. alter database mount;
  6. alter database backup controlfile to trace,生成创建控制文件的脚本;
  7. shutdown immediate并启动到startup nomount状态
  8. 使用resetlogs方式创建控制文件;  ------如果未归档的redo文件可用时,则直接recover database,然后选用未归档的redo文件应用。
  9. 最后通过alter database open resetlogs方式打开数据库。

如果未归档的redo文件不可用时,则需要设置隐含参数_allow_resetlogs_corruptiontrue过一致性检查,最后用alter database open resetlogs方式打开数据库。
注:打开数据库后很多情况下会出现需要推进scn的问题。

2.5、通过手工重建的控制文件进行恢复(noresetlogs方式)

  1. 在线或者关闭数据库后损坏了所有控制文件;
  2. shutdown abort关闭数据库;
  3. startup nomount启动数据库;
  4. 构造控制文件;

下面的步骤参考2.3的第八步;

2.6、通过手工重建的控制文件进行恢复(resetlogs方式)

  1. 在线或者关闭数据库后损坏了所有控制文件;
  2. shutdown abort关闭数据库;
  3. startup nomount启动数据库;
  4. 构造控制文件;

下面的步骤参考2.4的第八步;

模拟几种恢复方法的操作:

  下面主要对这三种恢复方法(通过备份控制文件进行完全恢复、通过备份控制文件进行重建的恢复(noresetlogs方式)、通过备份控制文件进行重建的恢复(resetlogs方式)的操作模拟,因为其他的几种恢复方法要么比较简单要么跟这三种方法共通。

一、通过备份控制文件进行完全恢复

 1、备份当前控制文件

RMAN> backup current controlfile;

2、删除控制文件

[oracle@T1 ~]$ rm -rf /u01/app/oracle/oradata/T1/control01.ctl
[oracle@T1 ~]$ rm -rf /u01/app/oracle/fast_recovery_area/T1/control02.ctl

3、强制关闭数据库

SQL> shutdown abort
ORACLE instance shut down.

4、打开数据库到nomount状态

SQL> startup nomount
ORACLE instance started.

5、RMAN恢复控制文件

RMAN> restore controlfile from '/u01/app/backup/backupset/T1_20210728_1079082169.bak';

6、将数据库启动到mount状态并开始恢复

SQL> alter database mount;

Database altered.

SQL> recover database using backup controlfile until cancel;
ORA-00279: change 2658123 generated at 07/28/2021 09:30:27 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle_archive/1_1_1079083827.dbf
ORA-00280: change 2658123 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO                                                          ------------选择auto,自动应用所有归档
ORA-00308: cannot open archived log
'/u01/app/oracle_archive/1_1_1079083827.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7


ORA-00308: cannot open archived log
'/u01/app/oracle_archive/1_1_1079083827.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/u01/app/oracle/oradata/T1/system01.dbf'


SQL> recover database using backup controlfile until cancel;   ------------由于未归档的redio文件需要手动应用
ORA
-00279: change 2658123 generated at 07/28/2021 09:30:27 needed for thread 1 ORA-00289: suggestion : /u01/app/oracle_archive/1_1_1079083827.dbf ORA-00280: change 2658123 for thread 1 is in sequence #1 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} /u01/app/oracle/oradata/T1/redo01.log ------------在关闭数据库前可以查看当前redo文件是哪一个,不清楚可以一直应用到提示Log applied为止
Log applied. Media recovery complete.

7、以resetlogs方式打开数据库

SQL> alter database open resetlogs;

 

二、通过备份文件进行重建恢复(noresetlogs)

前五步参照上完全恢复的前五步

6、将数据库启动到mount状态并生成创建控制文件的脚本

SQL> alter database mount;

Database altered.

SQL> alter database backup controlfile to trace as '/u01/app/oracle/rebuild_controlfile.ctl';

Database altered.

7、重启到nomount状态下创建NORESTLOGS控制文件

SQL> CREATE CONTROLFILE REUSE DATABASE "T1" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/T1/redo01.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 2 '/u01/app/oracle/oradata/T1/redo02.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 3 '/u01/app/oracle/oradata/T1/redo03.log'  SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/T1/system01.dbf',
  '/u01/app/oracle/oradata/T1/sysaux01.dbf',
  '/u01/app/oracle/oradata/T1/undotbs01.dbf',
  '/u01/app/oracle/oradata/T1/pdbseed/system01.dbf',
  '/u01/app/oracle/oradata/T1/pdbseed/sysaux01.dbf',
  '/u01/app/oracle/oradata/T1/users01.dbf',
  '/u01/app/oracle/oradata/T1/pdbseed/undotbs01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/system01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/sysaux01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/undotbs01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/users01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/test.dbf'
CHARACTER SET AL32UTF8
;

8、开始恢复

SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required

9、打开数据库

SQL> alter database open;

 

三、通过备份控制文件进行重建恢复(resetlogs)

前六步参照上文,第二步额外删除所有redo.log文件

7、重启到nomount状态并创建RESETLOGS控制文件

SQL> CREATE CONTROLFILE REUSE DATABASE "T1" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    MAXINSTANCES 8
  GROUP 1 '/u01/app/oracle/oradata/T1/redo01.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 2 '/u01/app/oracle/oradata/T1/redo02.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 3 '/u01/app/oracle/oradata/T1/redo03.log'  SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/T1/system01.dbf',
  '/u01/app/oracle/oradata/T1/sysaux01.dbf',
  '/u01/app/oracle/oradata/T1/undotbs01.dbf',
  '/u01/app/oracle/oradata/T1/pdbseed/system01.dbf',
  '/u01/app/oracle/oradata/T1/pdbseed/sysaux01.dbf',
  '/u01/app/oracle/oradata/T1/users01.dbf',
  '/u01/app/oracle/oradata/T1/pdbseed/undotbs01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/system01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/sysaux01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/undotbs01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/users01.dbf',
  '/u01/app/oracle/oradata/T1/pdb/test.dbf'
CHARACTER SET AL32UTF8
;

8、因为所有redo文件都删除了,无法恢复,所以会出现一致性的问题,通过设置隐含参数_allow_resetlogs_corruptiontrue跳过一致性检查;

SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

System altered.

SQL> shutdown immediate
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 2516582152 bytes
Fixed Size            9137928 bytes
Variable Size          536870912 bytes
Database Buffers     1962934272 bytes
Redo Buffers            7639040 bytes
Database mounted.

9、以resetlogs方式打开数据库

SQL> alter database open resetlogs;

 

参考作者:https://blog.csdn.net/liaocongyuan1314

posted @ 2021-07-28 10:19  蟹Bro  阅读(589)  评论(0编辑  收藏  举报