如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638    QQ号:47079569    邮箱:service@parnassusdata.com

 

RMAN 备份和使用备份的控制文件从丢失的控制文件中恢复

  • 情景1:  Bob 采取了控制文件的二进制备份,第二天,由于多媒体故障,他丢失了数据库的所有控制文件,因为他只有控制文件的二进制备份,Bob还原并恢复了数据库。
  • 采取控制文件的二进制备份,删除所有的控制文件,然后关闭并重启数据库:

SQL> alter database backup controlfile to '/tmp/control_backup.ctl'; Database altered. SQL> select name from v$controlfile; NAME -------------------------------------------------------- /u01/oracle/product/10.2.0/db_1/oradata/test/control01.ctl /u01/oracle/product/10.2.0/db_1/oradata/test/control02.ctl /u01/oracle/product/10.2.0/db_1/oradata/test/control03.ctl SQL> host rm -rf /u01/oracle/product/10.2.0/db_1/oradata/test/*.ctl SQL> startup force <.....output trimmed .....> ORA-00205: error in identifying control file, check alert log for more info SQL> select status from v$instance; STATUS ------------ STARTED SQL> alter database mount; alter database mount * ERROR at line 1: ORA-00205: error in identifying control file, check alert log for more info SQL>

  • 复制控制文件的二进制备份到原来控制文件的地方,安装数据库:

SQL> host [oracle@localhost ~]$ cp /tmp/control_backup.ctl /u01/oracle/product/10.2.0/db_1/oradata/test/control01.ctl [oracle@localhost ~]$ cp /tmp/control_backup.ctl /u01/oracle/product/10.2.0/db_1/oradata/test/control02.ctl [oracle@localhost ~]$ cp /tmp/control_backup.ctl /u01/oracle/product/10.2.0/db_1/oradata/test/control03.ctl [oracle@localhost ~]$ exit exit SQL> alter database mount; Database altered. SQL>

  • 如果你尝试打开数据库,你会收到必须使用重设日志选项的信息,如果你使用重设日志选项,要求你执行恢复,如果你尝试恢复数据库,要求你使用USING BACKUP CONTROLFILE语句,所以,你需要使用备份数据库,使backup controlfile 命令向Oracle 表示你正尝试从控制文件的二进制备份中恢复数据库:

SQL> alter database open; alter database open * ERROR at line 1: ORA-01589: must use RESETLOGS or NORESETLOGS option for database open SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-01194: file 1 needs more recovery to be consistent ORA-01110: data file 1: '/u01/oracle/product/10.2.0/db_1/oradata/test/system01.dbf' SQL> recover database; ORA-00283: recovery session canceled due to errors ORA-01610: recovery using the BACKUP CONTROLFILE option must be done SQL> recover database using backup controlfile; ORA-00279: change 470859 generated at 04/22/2010 07:30:27 needed for thread 1 ORA-00289: suggestion : /u01/oracle/product/10.2.0/db_1/flash_recovery_area/TEST/archivelog/ 2010_04_22/o1_mf_1_2_%u_.arc ORA-00280: change 470859 for thread 1 is in sequence #2 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} CANCEL Media recovery cancelled. SQL>

通过使用该命令,Oracle 要求你在采用控制文件备份之后做出改变,在这种情况下,你要及时提供重做日志文件的名称,包含了 scn 470859的变化为了获得正确的文件,这些文件包含具体的scn之后做出的改变,你需要查询归档重做日志和在线重做日志文件。 在这种情况下,因为你没有任何生成的归档重做日志文件,查询 v$log 视图:

SQL> select group#, status, first_change# from v$log;

GROUP# STATUS           FIRST_CHANGE# ---------- ---------------- ------------- 1 CURRENT                 470872 3 ACTIVE                  470861 2 ACTIVE                  470859 SQL> 

从上面的结果,可以看到,你需要分别应用 23 1组的重做日志文件,因为重做日志文件2包含了scn 470859的变化, 3 组和 1 组中的重做日志包含的值大于上面具体的值。

SQL> recover database using backup controlfile; ORA-00279: change 470859 generated at 04/22/2010 07:30:27 needed for thread 1 ORA-00289: suggestion : /u01/oracle/product/10.2.0/db_1/flash_recovery_area/TEST/archivelog/2010_04_22/ o1_mf_1_2_%u_.arc ORA-00280: change 470859 for thread 1 is in sequence #2 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} /u01/oracle/product/10.2.0/db_1/oradata/test/redo02.log

可以看出,在恢复过程中已经过/u01/oracle/product/10.2.0/db_1/oradata/test/redo02.日志文件,Oracle 接受并应用它,然后进行下一个重做日志文件,你提供了下面两个重做日志文件,得到下列信息:

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

现在准备好使用重设日志选项打开数据库:

SQL> alter database open resetlogs; Database altered. SQL>

数据库成功打开!

如果你有控制文件的创建脚本,即. 控制文件的跟踪备份,所有的重做日志文件可用,那么,不使用重设日志选项,你可以恢复数据库,打开数据库。 采用控制文件备份到跟踪:

SQL> alter database backup controlfile to trace as '/tmp/test.dat'; Database altered. SQL>

删除所有的控制文件:

[oracle@localhost ~]$ rm -rf /u01/oracle/product/10.2.0/db_1/oradata/new/control0*

使用跟踪文件中生成的命令创建一个新的控制文件,确保create controlfile 命令包含 no reset logs 选项

注释: 确保所有的数据库文件和在线重做日志文件正确地列举在 create controlfile命令中。

 

create controlfile reuse database "new" noresetlogs  archivelog

关闭数据库,并安装它,然后复原它,不使用重设日志选项打开它。

SQL> Shutdown immediate SQL> Startup mount SQL> Recover database; Media recovery complete. SQL> Alter database open; Database altered. SQL>

使用二进制备份从所有丢失的控制文件进行RMAN 备份和恢复数据库

假设你丢失了数据库的所有控制文件,并且只有该控制文件的二进制备份,此外,采用备份后,你已经添加了一个新的数据文件, 这种情况和之前的一样,在这种情况下,你需要:

  • 恢复控制文件的备份
  • 使用控制文件的备份恢复数据库
  • 用原来的文件重命名原来未命名的文件
  • 使用控制文件备份再次回复数据库,使用重设日志选项打开数据库Re

所有丢失的控制文件恢复数据库,没有备份

假设你丢失了所有的控制文件和和一个数据文件,控制文件备份后,没有进行数据文件备份,请看下列时间线:

  • 10.00:   采用控制文件备份(二进制备份)
  • 10.10:   使用一个数据文件创建一个新的表空间
  • 10.20:   丢点所有的控制文件

为此,你需要:

  • 恢复数据库,直到创建表空间
  • 使用alter database add datafile 命令创建一个空的数据文件
  • 使用归档重做日志文件恢复数据库

看下面的情况:

  • 为创建一个损坏环境,备份控制文件,创建一个新的表空间,删除所有的控制文件,使用强制选项启动数据库:

SQL> alter database backup controlfile to '/tmp/control.ctl'; Database altered. SQL> create tablespace tbs_test datafile '/u01/oracle/product/10.2.0/db_1/oradata/rc/tbs_test.dbf' size 1m; Tablespace created. SQL> select name from v$controlfile; NAME ---------------------------------------------------------------- /u01/oracle/product/10.2.0/db_1/oradata/rc/control01.ctl /u01/oracle/product/10.2.0/db_1/oradata/rc/control02.ctl /u01/oracle/product/10.2.0/db_1/oradata/rc/control03.ctl SQL> host [oracle@localhost ~]$ rm -rf /u01/oracle/product/10.2.0/db_1/oradata/rc/*.ctl [oracle@localhost ~]$ exit exit SQL> startup force ORACLE instance started. <.....output trimmed .....> ORA-00205: error in identifying control file, check alert log for more info SQL>

  • 恢复备份控制文件,安装数据库,通过提供必要的重做日志文件执行恢复:

SQL> host [oracle@localhost ~]$ cp /tmp/control.ctl /u01/oracle/product/10.2.0/db_1/oradata/rc/control01.ctl [oracle@localhost ~]$ cp /tmp/control.ctl /u01/oracle/product/10.2.0/db_1/oradata/rc/control02.ctl [oracle@localhost ~]$ cp /tmp/control.ctl /u01/oracle/product/10.2.0/db_1/oradata/rc/control03.ctl [oracle@localhost ~]$ exit exit SQL> startup force <.....output trimmed .....> Database mounted. ORA-01589: must use resetlogs or noresetlogs option for database open SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-01194: file 1 needs more recovery to be consistent ORA-01110: data file 1: '/u01/oracle/product/10.2.0/db_1/oradata/rc/system01.dbf' SQL> recover database using backup controlfile ORA-00279: change 476745 generated at 04/23/2010 04:01:31 needed for thread 1 ORA-00289: suggestion : /u01/oracle/product/10.2.0/db_1/flash_recovery_area/RC/archivelog/ 2010_04_23/o1_ mf_1_3_%u_.arc ORA-00280: change 476745 for thread 1 is in sequence #3 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} /u01/oracle/product/10.2.0/db_1/oradata/rc/redo02.log ORA-00283: recovery session canceled due to errors ORA-01244: unnamed datafile(s) added to control file by media recovery ORA-01110: data file 5: '/u01/oracle/product/10.2.0/db_1/oradata/rc/tbs_test.dbf' ORA-01112: media recovery not started SQL>

  • 查询 v$datafile 视图,在未命名文件的基础上创建一个新的数据文件,然后,再次恢复数据库:

SQL> select name from v$datafile;

NAME -------------------------------------------------------------- /u01/ORACLE/product/10.2.0/db_1/oradata/rc/system01.dbf /u01/ORACLE/product/10.2.0/db_1/oradata/rc/undotbs01.dbf /u01/ORACLE/product/10.2.0/db_1/oradata/rc/sysaux01.dbf /u01/ORACLE/product/10.2.0/db_1/oradata/rc/users01.dbf /u01/ORACLE/product/10.2.0/db_1/dbs/UNNAMED00005

SQL> alter database create datafile '/u01/oracle/product/10.2.0/db_1/dbs/UNNAMED00005' as '/u01/oracle/product/10.2.0/db_1/oradata/rc/tbs_test.dbf'; Database altered. SQL> recover database using backup controlfile; ORA-00279: change 481351 generated at 04/23/2010 04:04:28 needed for thread 1 ORA-00289: suggestion : /u01/oracle/product/10.2.0/db_1/flash_recovery_area/RC/archivelog/ 2010_04_23/o1_mf_1_3_%u_.arc ORA-00280: change 481351 for thread 1 is in sequence #3 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} /u01/oracle/product/10.2.0/db_1/oradata/rc/redo02.log Log applied. Media recovery complete. SQL> alter database open resetlogs; Database altered. SQL> select name from v$datafile;

NAME ----------------------------------------------------------------- /u01/ORACLE/product/10.2.0/db_1/oradata/rc/system01.dbf /u01/ORACLE/product/10.2.0/db_1/oradata/rc/undotbs01.dbf /u01/ORACLE/product/10.2.0/db_1/oradata/rc/sysaux01.dbf /u01/ORACLE/product/10.2.0/db_1/oradata/rc/users01.dbf /u01/ORACLE/product/10.2.0/db_1/oradata/rc/tbs_test.dbf SQL>

因为不匹配问题, 你使用了一个控制文件备份,该备份在新数据文件和恢复停止之前已存在,这是为什么Oracle 引入配置控制文件自动备份的原因之一,当改变数据库物理结构时,控制文件自动备份,例如,添加一个新的表空间或数据文件,不管对数据库备份使用了什么方法,用户管理或者Oracle管理 (RMAN)。所以,配置控制文件自动备份是一个很好地尝试。