RMAN从丢失的控制文件中恢复

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

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

服务热线 : 13764045638    QQ号:47079569    邮箱:[email protected]

 

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)。所以,配置控制文件自动备份是一个很好地尝试。 


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *