控制文件恢复与备份详解及案例
通常,数据库的控制文件不止一个,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都可以手动备份控制文件。备份可分为:备份集,镜像复制、和重建脚本。
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管理恢复。
镜像备份恢复
恢复流程:
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存储备份先关的。
RMAN> catalog start with '/u01/oracle/product/flash_recovery_area/ORCL/datafile' ;
完毕!
-------------------------------------------------------------------
总结自包老师的<oracle 11g 数据库恢复技术>