控制文件恢复与备份

控制文件恢复与备份详解及案例

通常,数据库的控制文件不止一个,10g默认为3个都在库文件目录/oradata/orcl;11g默认2个,其中一个在FRA中。

也可以手动添加更多的控制文件互为镜像,进程对其写的操作都一样,会写入所有控制文件,因为互为镜像的控制文件完全一致。但是进程对读控制文件,则只读取第一个(control_files参数)。所有,当第一个控制文件出错,读写都会出错。其他控制文件出错,控制文件写出错。


实例启动时控制文件损坏

实例启动,进程既会读控制文件,也会写控制文件,因此,实例启动的时候,必须保证所有控制文件都完好。control_files参数指定的任意一个控制文件损坏,实例无法mount,只能启动到nomount状态。并伴随有“ORA-00205 控制文件损坏 ” 和“ORA-00227 控制文件存在坏块”。具体情况,可以检查告警日志:alert.log


SQL> startup
ORACLE instance started.
Total System Global Area 972898304 bytes
Fixed Size 2219272 bytes
Variable Size 608174840 bytes
Database Buffers 356515840 bytes
Redo Buffers 5988352 bytes
ORA-00205: error in identifying control file, check alert log for more info

或者:

SQL> startup
ORACLE instance started.
Total System Global Area 972898304 bytes
Fixed Size 2219272 bytes
Variable Size 608174840 bytes
Database Buffers 356515840 bytes
Redo Buffers 5988352 bytes
ORA-00227: corrupt block detected in control file: (block 0, # blocks )



实例运行是控制文件损坏

实例运行时,发生控制文件损坏,起初实例能保存open状态,但是并不能保证所有功能都能正常运行。(涉及到对控制文件写操作时,将会出错)CKPT进程每隔3秒就回对控制文件进行写操作,因此,实例运行时,发现控制文件损坏的,极有可能是CKPT进程。此时,建议对实例shutdown abort。

备份控制文件

一般控制文件备份可分为:在线镜像备份、自动备份、手动备份

在线镜像备份

在线镜像备份,也称为控制文件副本,有control_files 参数指定几个互为镜像的控制文件。

虽然互为镜像的几个控制文件内容上完全一致,但是功能上有所不同。第一个控制文件需要被读写,其余控制文件仅仅被写入。如果发生控制文件损坏,首先应该考虑使用在线镜像备份恢复。

自动备份

自动备份分显示备份与隐式备份

显示自动备份:

显示备份默认时关闭的,需要手动配置,,在RMAN:configure controlfile autobackup on;

这样,rman就会在以下两个时机,悄悄备份控制文件

1、rman的任何备份操作,导致了控制文件内,rman与备份相关的资料库更新的时候。(configure 命令除外)。

2、数据库物理结构发生变化之后 (此种备份有延时性,有隐含参数"_controlfile_autobackup_delay控制)。

其中,在数据库物理结构发生变化是,比如,添加表空间,添加数据文件,删除数据文件,表空间

、数据文件的上下线、表空间的可读写状态切换时,都会触发控制文件的自动备份。(前提是配置了控制文件自动备份)。但是此种备份具有一定延时性,比如,在一个较为短的时间内,添加了10个数据文件,此种备份也许只有一个。延时性由"_controlfile_autobackup_delay“参数控制。

隐式自动备份:

指即便在自动备份配置:configure controlfile  autobackup off 的情况下,只要使用rman备份system表空间中的第一个数据文件(1号数据文件),控制文件就回自动备份。


channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
including current SPFILE in backup set

channel ORA_DISK_1: starting piece 1 at 10-APR-11

但是oracle并不认为这是自动备份,所以此备份并没有保存在FRA中的autobackup目录中,而是保存在了backupset目录。控制文

件的备份片由”O1_mf_ncsnf_“ 第八个字符是C. 或者尺寸明显小于其他备份片集的。

手动备份

使用rman或sql*plus都可以手动备份控制文件。备份可分为:备份集,镜像复制、和重建脚本。

备份集和镜像复制默认存储FRA,没有配置FRA,则在参数文件一个目录。$oracle_home/dbs 或者$oracle_home/database.重建脚本则在默认追踪文件路径中。

1、备份集备份:


    由rman对控制文件备份集备份;

RMAN> backup as backupset current controlfile;

2、镜像复制备份


  rman和sqlplus都可以对控制文件镜像镜像复制备份。

rman:

RMAN> backup as copy current controlfile  format '/u01/oracle/product/control.backup';     

splplus:

SQL> alter database backup controlfile to '/u01/oracle/pruduct/control.backup.2';

3、重建脚本


SQL> alter database backup controlfile to trace;

此时得到一个跟踪文件,跟踪文件的位置

SQL> select value from v$diag_info where name='Default Trace File';

VALUE
--------------------------------------------------------------------------------
/u01/oracle/product/diag/rdbms/orcl/orcl/trace/orcl_ora_4956.trc

此追踪文件包含两条create controlfile  命令,一个是不重设日志的(noresetlogs) 一个是重设日志的(resetlogs)。

STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/oracle/product/oradata/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/u01/oracle/product/oradata/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/u01/oracle/product/oradata/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/u01/oracle/product/oradata/orcl/system01.dbf',
  '/u01/oracle/product/oradata/orcl/sysaux01.dbf',
  '/u01/oracle/product/oradata/orcl/undotbs01.dbf',
  '/u01/oracle/product/oradata/orcl/users01.dbf',
  '/u01/oracle/product/oradata/orcl/example01.dbf',
  '/u01/oracle/product/oradata/orcl/users02.dbf'
CHARACTER SET WE8MSWIN1252
;
-- Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('BACKUP OPTIMIZATION','ON');
-- Configure RMAN configuration record 2
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
-- Configure RMAN configuration record 3
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('DEVICE TYPE','DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET');
-- Configure RMAN configuration record 4
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO REDUNDANCY 3');
-- Configure RMAN configuration record 5
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('DEFAULT DEVICE TYPE TO','DISK');
-- Configure RMAN configuration record 6
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('ARCHIVELOG DELETION POLICY','TO BACKED UP 3 TIMES TO DISK');
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- Set Database Guard and/or Supplemental Logging
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oracle/product/oradata/orcl/temp01.dbf'
     SIZE 24117248  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
-- End of tempfile additions.

重建脚本,首先将数据nomount状态,然后用create controlfile 命令,创建控制文件。然后召回对rman的一些配置,恢复数据
库,添加临时文件等等一系列操作。

控制文件恢复

控制文件备份从时间跨度上来分,可分为 3类:在线镜像备份、结构备份、历史备份。

1、在线镜像备份

   与数据库当前控制文件完全一致,有当前数据库最新的数据结构,检查点信息,日志序列,SCN号等

2、结构备份:

   该备份中,数据库物理结构和当前控制文件物理结构一致,只是不具有当前控制文件最新的检查点信息,日志序列,控制文件、数据文件SCN等信息。它的这些信息停留在备份的那一刻。


如果在备份控制文件后,没有改变数据库的物理结构,那么该备份就是一个结构备份。

3、历史备份:

    该备份中,数据库的物理结构与当前数据库的物理结构不一致。更别说检查点、SCN等信息。例如在备份控制文件之后,改变了数据库的物理结构,此时,该备份就成为了一个历史备份。


在恢复控制文件时,考虑的顺序是:在线镜像备份---结构备份--历史备份。

除了在线镜像备份恢复,其他两种恢复,基本概况为一下几个步骤:

1、数据库nomount状态 --- (startup nomount)

2、还原控制文件---(restore controlfile)

3、mount数据库---(alter database mount)

4、recover database 还原数据库 ---(recover database)

5、resetlogs打开数据 ---(alter database open resetlogs)

分别利用三种备份恢复控制文件


在线镜像备份恢复:


查看告警日志,alert.log检查出哪一个控制文件损坏,以及哪一个控制文件可能是完整的,然后将所有控制文件 复制到一个单独的目标。然后将认为是完好的那个控制文件 复制到 损坏的控制文件位置上去。

恢复流程:

1、nomount数据库

2、检查alert.log,诊断出损坏的控制文件。

3、将健康的控制文件 用操作系统命名复制到损坏的控制文件路径上去替换掉受损文件。

4、mount数据库

5、open数据

注:替换之前,最好将所有控制文件,都复制一份到一个独立的目标,以防诊断失误,用损失的控制文件替换掉了健康的控制文件。

利用自动备份恢复:


若在线镜像备份不可用,则该考虑使用自动文件自动备份来恢复。因为往往至少有一份控制文件自动备份 是结构备份。

恢复流程:

1、nomount数据库

2、restore controlfile from autobackup;

3、alter databae mount;

4、recover database

5、alter database open reserlogs;

由于启动了控制文件自动备份,因此在发布  restore controlfile from autobackup 时,(因为控制文件损坏,因此rman资料库也损坏,此时自动还原的时候,通过什么来自动寻找备份文件呢,通过参数文件!)参数文件中的 db_recovery_file_dest记录了FRA的位置。

三种recover database:

1、SQL> recover database ;  该命令用来恢复数据库中所有数据文件,并且只能使用存储在文件系统上的归档日志与重做日志,前提是控制文件,不可以是还原的或重建的

     
2、SQL> recover database using backup controlfile; 该命令用来恢复数据库中所有数据文件以及控制文件,但是只能使用存储在文件系统上的归档日志和在线重做日志。

3、RMAN> recover database;该命令用于恢复所有数据文件和控制文件,并且可以利用增量备份,备份中的 和文件系统上的归档日志 以及文件系统上的在线日志。


利用手动备份恢复

由于手动备份既可以是备份集 也可以是镜像复制,所以用rman或操作系统命令都可以完成恢复。备份集只能有rman管理恢复。

镜像备份恢复

恢复流程:

1、nomount数据库

2、restore controlfile from ‘<control_backup_dir>’;  ---指定控制文件备份路径,或者是用操作系统命令复制控制文件到control_files参数指定的路径。

3、alter databae mount;

4、recover database

5、alter database open reserlogs;


利用历史备份恢复

当在线镜像和结构备份都不能用是,才考虑使用历史备份恢复。

第二类和第三类recover  database 可以自动修复一些不一致,具体如下:

1、备份控制文件中没有某个表空间或者数据文件信息,但是实际上存在,此时,会重建数据文件,以达到一致

2、备份控制文件中没有某个在线日志组的信息,但是实际却存在。比如:备份控制文件后,添加新的日志文件组,并且,实例shutdown abort的时候该新增日志组,不可以是current或active状态,这种情况,recover database 以控制文件为准,恢复后,就像从来没添加过日志组一样。

3、备份文件中有某个在线日志组新政,但实际却没有。比如,在备份控制文件后,删除了某个日志组。此时,以控制文件为准,被删除的日志文件组又被重建回来了。



另外一些情况,recover database 就不能自动修复了,必须使用recover database using backup controlfile 或者特殊的recover命令恢复。具体如下:

1、控制文件中有某个表空间或者数据文件的信息,但是实际上却没有。例如:备份控制文件后,删除某个表空间或数据文件。但是recover database的时候,rman会执着的去恢复一个实际不存在的表空间或数据文件,此时,可以应用:recover database using backup controlfile  或者: recover database  skip tablespace xxx  |recover database skip datafle n 命令修复。

2、备份控制文件中没有某个在线日志组的信息,但实际却存在。例如:备份控制文件后,新增了某个在线日志,而且该在线日志恰好就是实例shutdown abort 时的current 或者active状态,那么rman在执行recover database的时候,会出现:

RMAN-06054: media recovery requesting unknown archived log“ 请求未知归档日志错误。这时需要用sqlplus recover database using backup controlfile 命令 以及手动指定重做日志路径才能恢复。


自动修复不一致和手动修复不一致分布举一个例子

自修复不一致

exp:控制文件自动备份关闭,备份控制文件(RMAN> backup current controlfile;)后,创建了一个新的表空间  test  数据文件 test_a.dbf.此时,备份(o1_mf_ncnnf_TAG20130601T015018_8tmfgosm_.bkp)就成为了一个历史备份。 现在的状况是:所有控制文件损坏且无在线镜像备份和自动备份可以使用。


RMAN> restore controlfile from '/u01/oracle/product/flash_recovery_area/ORCL/backupset/2013_06_01/o1_mf_ncnnf_TAG20130601T015018_8tmfgosm_.bkp'  ;

Starting restore at 01-JUN-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=10 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
output file name=/u01/oracle/product/oradata/orcl/control01.ctl
output file name=/u01/oracle/product/flash_recovery_area/orcl/control02.ctl
Finished restore at 01-JUN-13

--mount数据库
RMAN> mount database;

观察还原出来的控制文件,是否包含了新建的表空间以及数据文件。

SQL> select * from v$tablespace;

       TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
         0 SYSTEM                         YES NO  YES
         1 SYSAUX                         YES NO  YES
         2 UNDOTBS1                       YES NO  YES
         4 USERS                          YES NO  YES
         3 TEMP                           NO  NO  YES
         6 EXAMPLE                        YES NO  YES
         7 USERS02                        YES NO  YES

7 rows selected.
没有发现新建的表空间test。

然后 恢复数据库 recover database

RMAN> recover database;

Starting recover at 01-JUN-13
Starting implicit crosscheck backup at 01-JUN-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=9 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=11 device type=DISK
Crosschecked 3 objects
Finished implicit crosscheck backup at 01-JUN-13

Starting implicit crosscheck copy at 01-JUN-13
using channel ORA_DISK_1
using channel ORA_DISK_2
Finished implicit crosscheck copy at 01-JUN-13

searching for all files in the recovery area
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /u01/oracle/product/flash_recovery_area/ORCL/backupset/2013_05_11/o1_mf_nnnd0_TAG20130511T065802_8rwmmrj1_.bkp
File Name: /u01/oracle/product/flash_recovery_area/ORCL/backupset/2013_05_11/o1_mf_nnnd0_TAG20130511T065802_8rwmmm2m_.bkp
File Name: /u01/oracle/product/flash_recovery_area/ORCL/backupset/2013_06_01/o1_mf_ncnnf_TAG20130601T015018_8tmfgosm_.bkp

using channel ORA_DISK_1
using channel ORA_DISK_2

starting media recovery

archived log for thread 1 with sequence 14 is already on disk as file /u01/oracle/product/oradata/orcl/redo02.log
archived log file name=/u01/oracle/product/oradata/orcl/redo02.log thread=1 sequence=14
creating datafile file number=7 name=/u01/oracle/product/oradata/orcl/test_a.dbf
archived log file name=/u01/oracle/product/oradata/orcl/redo02.log thread=1 sequence=14
media recovery complete, elapsed time: 00:00:04
Finished recover at 01-JUN-13

注意红色部分,恢复数据库是,自动重建了该数据文件。

再查看一下此时表空间;

SQL> select * from v$tablespace;

       TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
         0 SYSTEM                         YES NO  YES
         1 SYSAUX                         YES NO  YES
         2 UNDOTBS1                       YES NO  YES
         4 USERS                          YES NO  YES
         3 TEMP                           NO  NO  YES
         6 EXAMPLE                        YES NO  YES
         7 USERS02                        YES NO  YES
         8 TEST                           YES NO  YES

8 rows selected.

test表空间已经存在,这才是我们想要的结果。

打开数据库

SQL> alter database open resetlogs;
完成恢复!

手动修复不一致:

控制文件自动备份关闭,备份控制文件后,删除刚刚建立的表空间test以及其数据文件 test_a.dbf 文件编号为7.备份控制文件中,此表空间和数据文件存在。此时,所有控制文件损坏,无在线镜像以及自动备份可以使用。


RMAN> restore controlfile from '/u01/oracle/product/flash_recovery_area/ORCL/backupset/2013_06_01/o1_mf_ncnnf_TAG20130601T021729_8tmh1krz_.bkp'  ;

Starting restore at 01-JUN-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=10 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:04
output file name=/u01/oracle/product/oradata/orcl/control01.ctl
output file name=/u01/oracle/product/flash_recovery_area/orcl/control02.ctl
Finished restore at 01-JUN-13

完成控制文件还原,加载数据库

RMAN> mount database;

此时 检查一下控制文件,看一7号数据文件以及test表空间还在没有。(应该不存在才正确),

SQL> select file#,name from v$datafile where file#=7;

     FILE#        NAME
-------------   -----------------------------------------------------------------------------
         7        /u01/oracle/product/oradata/orcl/test_a.dbf

7号数据文件还存在,是因为我们此时从还原的控制文件中取出的信息,在备份该控制文件的时候,还没有删除,因此还存在。

直接恢复数据库 是会报错滴,例如:


using channel ORA_DISK_1
using channel ORA_DISK_2
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 06/01/2013 02:33:15
RMAN-06094: datafile 7 must be restored


7号数据文件必须被还原。因为rman在执行还原操作是,很执着的要求还原一个实际并不存在的数据文件(7号数据文件)。

为了使恢复操作不去理睬7号数据文件,可以先令7号数据文件下线(因为数据文件实际不存在,此时修改的是控制文件内关于7号数据文件的状态)。

SQL> alter database  datafile 7 offline;

Database altered.

然后利用sqlplus的recover database using backup controlfile.恢复,并在提示的时候,输入auto作为应答。

但是此时,极有可能会出现ORA-27037和ORA-00308错误,找不到某个归档日志。


SQL> recover database using backup controlfile;
ORA-00279: change 1361003 generated at 06/01/2013 02:10:34 needed for thread 1
ORA-00289: suggestion :
/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_
.arc
ORA-00280: change 1361003 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log
'/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u
_.arc'

ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


ORA-00308: cannot open archived log
'/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u
_.arc'
ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

是因为,sqlplus索要并未归档的日志,也就是在线重做日志。此时,再次执行 recover database using backup controlfile,在提示后,手动输入重做日志路径。可以随便输入其中一个,如果不正常,再次输入,不用担心指定重做日志错误导致错误应用日志的问题。

SQL> recover database using backup controlfile;
ORA-00279: change 1361003 generated at 06/01/2013 02:10:34 needed for thread 1
ORA-00289: suggestion :
/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_
.arc
ORA-00280: change 1361003 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
'/u01/oracle/product/oradata/orcl/redo03.log'
ORA-00339: archived log does not contain any redo
ORA-00334: archived log: '/u01/oracle/product/oradata/orcl/redo03.log'


SQL> recover database using backup controlfile;
ORA-00279: change 1361003 generated at 06/01/2013 02:10:34 needed for thread 1
ORA-00289: suggestion :
/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_
.arc
ORA-00280: change 1361003 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
'/u01/oracle/product/oradata/orcl/redo01.log'
Log applied.
Media recovery complete.

完成恢复!

其实此问题 还有一个比较简单的解决方式,就是用 rman recover database skip tablespace test.

就跳过对test表空间包含的数据文件的恢复。

recover database using backup controlfile  和 采用  ”alter database  datafile n  off line“  与 ”recover database using backup controlfile“配合的恢复方式,前者能对一个表空间所有的数据文件跳过恢复,后者能精确到某个数据文件。


缺失归档日志下的控制文件恢复

都知道,恢复控制文件的时候 recover database命令可能需要用到归档日志。所谓缺失归档,是指控制文件从备份还原之后,执行recover database命令时,报:找不到相应的归档日志 导致恢复失败。

这种情况下,恢复流程:

1、还原控制文件、加载数据库

2、recover  database 报RMAN-06054错误,即找不到相应的某个归档日志。

3、查看相关动态性能视图,确定问题,确定问题与控制文件有关 而不是与数据文件有关。

4、利用跟踪文件 create controlfile 重建控制文件

5、再次执行recover database 还会报:RMAN-06054错误,但此时报错日志号应该比上一次的大。查看v$log 实际上是某一个在线重做日志。

6、查看v$log视图,查看5步需要的是哪一个控制文件。

7、在sqlplus执行 recover database using backup controlfile恢复数据库,在提示符出现后,输入正确的在线重做日志。

8、resetlogs打开数据库

9、添加临时数据文件

10、将丢失的catalog信息 和configure重新注册到控制文件或者恢复目录中


exp:(做此实验前,由于前几场resetlogs原因 我将v$archived_log视图清空。)备份控制文件后时,日志序号1   经过几次手动归档,然后将3号归档删除。此时:所有控制文件损坏,无在线镜像备份可用,第3号归档日志缺失。


1、首先 还原控制文件 并mount数据库

RMAN> restore controlfile from '/u01/oracle/product/flash_recovery_area/ORCL/backupset/2013_06_01/o1_mf_ncnnf_TAG20130601T030549_8tmkw1m6_.bkp';

Starting restore at 01-JUN-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=10 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:05
output file name=/u01/oracle/product/oradata/orcl/control01.ctl
output file name=/u01/oracle/product/flash_recovery_area/orcl/control02.ctl
Finished restore at 01-JUN-13


RMAN> mount database;

恢复数据库,报错

archived log file name=/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_8tmkx0wl_.arc thread=1 sequence=1
archived log file name=/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_2_8tmkx8b9_.arc thread=1 sequence=2

unable to find archived log
archived log thread=1 sequence=3
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 06/01/2013 03:20:41
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 3 and starting SCN of 1362535

报错显示3号归档日志确实,经过查找,确实3好归档日志已经不在了。

捋一下,怎么回事:

看一下已知的归档日志多大,备份控制文件的时候,归档日志是序号多大。

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            14

已知的归档日志序号为14,

数据库备份时,日志序号多大:
SQL> select group#,status,sequence# from  v$log;

    GROUP# STATUS            SEQUENCE#
---------- ---------------- ----------
         1 CURRENT                   1
         3 UNUSED                    0
         2 UNUSED                    0

--可以看出,控制文件备份时,是上次以resetlogs 方式打开数据库之后,也可以知道当时备份控制文件时,归档的日志序号为1.  当前日志序列为14  其中第3号归档丢失。

既然归档日志序列号是14,那么current 日志序列号一定大于14(此时查看v$log,是查看到备份时的状态),我的在线重做日志组是3个,那么,在线日志最小序列应该大于11。进而得知,所有数据文件的完全检查点必然超过了11号在线日志的最后一条重做记录。也就是,如果我们恢复数据文件,最多只需要从11号日志文件之后的日志就能完成恢复。

那么 控制文件恢复,需要从什么时候开始呢,

上面已经查出了结论:从1号归档日志。所以,明白了,是控制文件恢复拖了后腿!

怎么解决呢?重建控制文件.

生成还原而来的控制文件的跟踪文件:

SQL> alter database backup controlfile to trace;

Database altered.


然后重新使数据库处于nomount状态

找到跟踪文件中的noresetlogs版本,复制到sqlplus或者用脚本运行它。


STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/oracle/product/oradata/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/u01/oracle/product/oradata/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/u01/oracle/product/oradata/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/u01/oracle/product/oradata/orcl/system01.dbf',
  '/u01/oracle/product/oradata/orcl/sysaux01.dbf',
  '/u01/oracle/product/oradata/orcl/undotbs01.dbf',
  '/u01/oracle/product/oradata/orcl/users01.dbf',
  '/u01/oracle/product/oradata/orcl/example01.dbf',
  '/u01/oracle/product/oradata/orcl/users02.dbf'
CHARACTER SET WE8MSWIN1252
;
-- Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('BACKUP OPTIMIZATION','ON');
-- Configure RMAN configuration record 2
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
-- Configure RMAN configuration record 3
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('DEVICE TYPE','DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET');
-- Configure RMAN configuration record 4
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO REDUNDANCY 3');
-- Configure RMAN configuration record 5
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('DEFAULT DEVICE TYPE TO','DISK');
-- Configure RMAN configuration record 6
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('ARCHIVELOG DELETION POLICY','TO BACKED UP 3 TIMES TO DISK');
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/oracle/product/flash_recovery_area/ORCL/archivelog/2013_06_01/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- Set Database Guard and/or Supplemental Logging
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oracle/product/oradata/orcl/temp01.dbf'
     SIZE 24117248  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
-- End of tempfile additions.

--绿色部分不是创建控制文件语法,是从备份控制文件中,提取出的以前对rman 以及数据库的一些配置,用这些语法还原某些配置。可以不使用这些,自己手动重新配置。


至此,完成数据库恢复,并且实例已经打开 ,也完成了rman的配置,和临时文件的添加,还有最后一个步骤:重新注册rman资料库到控制文件。

此时,你查看rman中,没有任何备份资料

RMAN> list backup;

using target database control file instead of recovery catalog
specification does not match any backup in the repository

因为控制文件时重建的,所以丢失了原有控制文件中关于rman备份资料库的信息,重新注册即可。

RMAN> catalog start with '/u01/oracle/product/flash_recovery_area/ORCL/autobackup' ;


RMAN> catalog start with '/u01/oracle/product/flash_recovery_area/ORCL/backupset' ;


RMAN> catalog start with '/u01/oracle/product/flash_recovery_area/ORCL/archivelog' ;

等等,如果有数据文件映像,总之,rman存储备份先关的。

RMAN> catalog start with '/u01/oracle/product/flash_recovery_area/ORCL/datafile' ;


完毕!

-------------------------------------------------------------------

总结自包老师的<oracle 11g 数据库恢复技术>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值