控制文件恢复与备份

Opencv2系列学习笔记9(使用Canny算子检测轮廓) 前面我们用sobel算子和拉普拉斯变换也可以进行边缘检测,见我的上一篇blog: http://blog.csdn.net/lu597203933/article/details/17252285 但这样得到的二值边缘图像有两大缺点。第一:检测到的边缘过粗,这意味着难以实现物体的精确定位。第二:难以找到这样的阀值,即能足够低检测到所有重要的边缘,同时也不至于包含过多次要的边缘。 这个正是ca 阅读详情

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

通常,数据库的控制文件不止一个,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 数据库恢复技术>


【ZYNQ-7000开发之十五】Vivado HLS和OpenCV_下 本篇文章在上篇文章【ZYNQ-7000开发之十四】的基础上,利用OpenCV HLS的函数,hls::Sobel,编写边缘检测算法,仿真测试,创建IP,最后在vivado里测试Sobel IP,此外本篇文章的实验还要基于 【ZYNQ-7000开发之十】TGP+VDMA+HDMI搭建视频通路 阅读详情

相关推荐

opencv (三十三)图像边缘检测(原理Sobel算子、scharr算子生成算子)

小白学视觉,笔记,扩展 FILTER_SCHARR是scharr算子,1,3,5,7是Sobel算子 #include <opencv2\opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { //读取图像,黑白图像边缘检测结果较为明显 Mat img = imread("equalLena.png", IMREAD_ANYCOLOR); if (im

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2300

八方向Sobel算子(5x5)的Python实现

基于河北师范大学硕士学位论文《基于八方向Sobel算子的边缘检测算法研究》。采用5x5, 0、 22.5、 45、 67.5、 90、 112.5、135、 157.5 八个方向的模板进行检测。

从中心差分到SIMD向量化——OpenCV图像梯度算子源码全解析与清晰度检测实战

用过OpenCV做边缘检测的人,大概率写过这行代码: 一行调用,算出图像的水平方向梯度。看起来就是个"卷积滤波"。但打开,文件总共823行。一个"求梯度"的操作,凭什么需要823行C++?因为这个文件里不只是Sobel——它同时包含了Scharr算子的核生成、Laplacian算子的多路径实现、OpenCL GPU加速分支、IPP硬件加速层、以及可分离卷积引擎的完整调度逻辑。再加上旁边的(323行),专门为3×3 Sobel写了一整套手工SIMD优化——用向量指令同时处理16个像素的梯度计算。这篇文章从数学

weixin_45715405的博客 106

sobel5X5.zip:使用 Hdl Coder 的 Sobel 边缘检测器 (5x5) 的 FPGA 实现-matlab开发

这里使用 HDL 编码器实现了 sobel 边缘检测器。使用了 5x5 内核。

sobel算子检测图像清晰度

系列文章目录 在研究调焦的过程中,发现最主要有两个步骤: 1.判断图像清晰度 2.搜索策略 文章目录系列文章目录前言一、sobel算子是什么?1.原理二、改进的八方向sobel算子基于的理论1.视觉系统2.读入数据sobel算子实现 前言 边缘检测是图像最基本的特征,图像的轮廓,细节基本都存在于图像的边缘部分,在图像分析中借助它能大大减少所要处理的信息,又保留了图像中物体的形状信息。因此边缘检测在图像处理、模式识别、机器视觉等领域中有很重要的作用。在边缘检测中最常用的就是sobel算子,在图像空间利用水

qq_43614246的博客 6330

OpenCV中的Sobel算子

OpenCV中的Sobel算子 刚开始第一次接触这个东西的时候也是感觉一脸懵逼,这是什么鬼。完全看不懂。今天再次接触到,感觉理解的透彻了一点。 首先来看一下Sobel算子是个什么东西: -1 0 1 -2 0 2 -1 0 1 这个就是Sobel算子中的一个,就以这个为例。可以看出来这个就是之前说的那个核。用这个核去和原图像进行卷积操作。那根据核可以知道,卷积过后得到的输出...

qq_25105061的博客 1023

任意尺寸的sobel算子模板(附带matlab代码)

sobel算子可以通过杨辉三角来获取,两个方向上的sobel算子本质上就是用于差分处理和平滑处理的两个向量的乘积,在程序中,这两个向量可以通过循环卷积简单地获得,例如:5*5的sobel算子可以通过以下方法获得:这个向量即我们所说的用于平滑处理的向量。差分处理的向量也可以通过类似方法算得:将其中一个向量转置后右乘另一个向量,可得到一个方向的sobel算子,将其转置即另一个方向的算子。将这得到的两个算子与图像卷积,求平方和的根即可得到对应图像的轮廓。

weixin_46785947的博客 1944

java求sobel算子代码_sobel算子原理opencv源码实现

sobel算子原理opencv源码实现简要描述sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。原理算子使用两个33的矩阵(图1)算子使用两个33的矩阵(图1)去和原始图片作卷积,分别得到横向G(x)和纵向G(y)的梯度值,如果梯度值大于某一个阈值,则认为该点为边缘点图1:卷积矩阵图2:卷积运算事实上卷积矩阵也可以由两个一维矩阵卷积而成,在opencv源码中就是用两个...

weixin_30433439的博客 409

OpenCV学习笔记(八)之边缘检测算子上篇(Sobel算子实现原理及源码分析)

Sobel

夜月枫雪 3210

OpenCVSobel 衍生品(48)

OpenCV是一个开源的计算机视觉库,由英特尔公司开发并开源的一组跨平台的C++函数和少量的C函数组成,用于实时图像处理、计算机视觉和机器学习等应用领域。OpenCV可以在包括Windows、Linux、macOS等各种操作系统平台上使用,具有开放的编程接口,可用于各种应用开发。OpenCV的主要特点是易于使用,高效、学习资源和社区活跃。OpenCV可以计算相机标定、物体识别、动作跟踪、人脸识别、手写数字识别等任务,并可集成到摄像头、网络摄像头和机器人等系统中。

2301_78348935的博客 1017

matlab开发-sobel5X5zip

matlab开发-sobel5X5zip。基于HDL编码器的Sobel边缘检测(5x5)的FPGA实现

opencv源码之sobel的核模板

1, 如果图像四周不补pad, 滤波后的图像尺寸会变小,为了让滤波后图像尺寸不变,opencv函数都会在图像四周补pad ,有如下几种pad方式,默认采用BORDER_REFLECT_101的方式。opencv实现的Sobel的核模板生成是一个单独的函数,可以观察到不同的k_size时候,具体的核函数是什么。当ksize=3,(dx,dy)=(1,0)当ksize=3,(dx,dy)=(0,1)当ksize=3,(dx,dy)=(1,1)1, 计算kerel模板值。

Briwisdom的博客 1089

OpenCV(二十五):边缘检测(一)

有两个Sobel卷积核,一个用于水平方向(x方向)的边缘检测,另一个用于垂直方向(y方向)的边缘检测。它包含两个卷积核,一个用于水平方向(x方向)的边缘检测,另一个用于垂直方向(y方向)的边缘检测。ddepth:输出图像的数据类型,它可以是负值(如-1)表示与输入图像保持一致,也可以是CV_8U、CV_16U、CV_32F等值,表示输出图像的深度。ddepth:输出图像的数据类型,可以是负值(如-1),表示与输入图像保持一致,也可以是CV_8U、CV_16U、CV_32F等值,表示输出图像的深度。

weixin_63357306的博客 1440

[opencv][python] 学习手册3:练习代码2

46_图像降噪-均值滤波.py 47_图像降噪-均值滤波api.py 48_图像降噪-中值滤波api.py 49_图像降噪-加权均值滤波.py 50_高斯模糊.py 51_Sobel算子.py 52_Sobel算子_api.py 53_Scharr函数_Sobel改进版.py 54_拉普拉斯算子.py 55_补充-锐化滤波.py

weixin_37834269的博客 530

OpenCV】Kirsch算子实战:多方向边缘检测与方向信息提取

本文深入探讨了Kirsch算子OpenCV中的多方向边缘检测应用,详细解析了其8方向卷积核的数学原理与实战技巧。通过对比实验证明,Kirsch算子在边缘方向信息提取方面具有独特优势,特别适用于车牌识别、医疗影像分析等需要精确方向检测的场景。文章还提供了完整的Python实现代码和性能优化方案,帮助开发者高效应用这一强大的边缘检测工具。

weixin_29044713的博客 343

010 边缘检测

原理 对图像在x,y方向分别做差分,合并就可以得到边缘 实现(Python) import cv2 as cv import matplotlib.pyplot as plt import math import numpy as np img = cv.imread('../images/girl.jpg') gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) kernel_x = np.array([ [1, 0, -1], [2, 0,

理工伪文青 300

读浅墨博客 十二 笔记(2)代码

http://blog.csdn.net/poem_qianmo/article/details/25560901 #include #include #include #include using namespace std; using namespace cv; Mat src, dst, gray; Mat canny; int can

还在路上的蒲公英 455
上一篇: 用rman从自动备份中还原spfile常见问题
下一篇: 参数文件恢复
LinsFay
博客等级 码龄14年 5粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值