首先理解recover database的过程,就是数据库以当前控制文件中记录的SCN比基准,向前跑日志直到system scn=startscn=closescn=datafilescn为止。
有这样的一种情况controlfile中所记录的system scn和startscn比datafile中scn小,就是这个controlfile是备份文件,但是数据文件是新的,所以控制文件为了与数据文件匹配一致,要将自身的scn跑到和datafilescn一致。
关闭数据库,备份控制文件
[oracle@redhat4 bdump]$ cp /u01/app/oracle/oradata/ORCL/controlfile/o1_mf_91j9gw3b_.ctl ctl.ctl
打开数据库,创建表空间和表,使数据库的SCN向前推
SQL> create tablespace tbs1 datafile '/data/orcl/test0823.dbf' size 50m;
表空间已创建。
SQL> create table lhq0823 tablespace tbs1 as select * from dba_objects;
表已创建。
SQL> select count(*) from lhq0823
2 ;
COUNT(*)
----------
50685
关闭数据库,再启动
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 734003200 bytes
Fixed Size 2023688 bytes
Variable Size 213913336 bytes
Database Buffers 515899392 bytes
Redo Buffers 2166784 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01122: 数据库文件 1 验证失败
ORA-01110: 数据文件 1: '/data/orcl/system01.dbf'
ORA-01207: 文件比控制文件更新 - 旧的控制文件
查询控制文件中的SCN
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
383089325
SQL> select file#,checkpoint_change#,last_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
1 383089325 383089325
2 383089325 383089325
3 383089325 383089325
4 383089325 383089325
5 383089325 383089325
6 383089325 383089325
7 383089325 383089325
8 383089325 383089325
已选择8行。
查询v$datafile_header中scn信息
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 383090539
2 383090539
3 383090539
4 383090539
5 383090539
6 383090539
7 383090539
8 383090539
已选择8行。
直接recover database
SQL> recover database;
ORA-00283: 恢复会话因错误而取消 ORA-01122:
数据库文件 1 验证失败
ORA-01110: 数据文件 1: '/data/orcl/system01.dbf'
ORA-01207: 文件比控制文件更新 - 旧的控制文件
使用using backup controlfile
SQL> recover database using backup controlfile;
ORA-00279: 更改 383089325 (在 08/24/2013 12:24:08 生成) 对于线程 1 是必需的 ORA-00289:
建议:
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2013_08_24/o1_mf_1_1_%u_.arc
ORA-00280: 更改 383089325 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
输入relog
/data/orcl/redo02.log
ORA-00283: 恢复会话因错误而取消 ORA-01244:
未命名的数据文件由介质恢复添加至控制文件 ORA-01110: 数据文件
9: '/data/orcl/test0823.dbf'
test0823.dbf是在备份控制文件之后建立的,所以旧控制文件中不包括这个文件信息,在recover时会自动添加至控制文件中
SQL> recover database using backup controlfile until cancel;
ORA-00283: 恢复会话因错误而取消 ORA-01111:
数据文件 9 名称未知 - 请重命名以更正文件 ORA-01110:
数据文件 9: '/u01/app/oracle/product/10.2.0/db_1/dbs/UNNAMED00009'
ORA-01157: 无法标识/锁定数据文件 9 - 请参阅 DBWR 跟踪文件 ORA-01111:
数据文件 9 名称未知 - 请重命名以更正文件 ORA-01110:
数据文件 9: '/u01/app/oracle/product/10.2.0/db_1/dbs/UNNAMED00009'
这里自动在控制文件中建立的文件路径不对,应该是/data/orcl/test0823.dbf,所以需要rename一下
SQL> alter database rename file '/u01/app/oracle/product/10.2.0/db_1/dbs/UNNAMED00009' to '/data/orcl/test0823.dbf';
数据库已更改。
SQL> recover database using backup controlfile;
ORA-00279: 更改 383090104 (在 08/24/2013 17:14:46 生成) 对于线程 1 是必需的 ORA-00289:
建议:
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2013_08_25/o1_mf_1_1_%u_.arc
ORA-00280: 更改 383090104 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
/data/orcl/redo02.log
已应用的日志。
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select count(*) from lhq0823;
COUNT(*)
----------
50685
数据恢复正常
小结:在以下情况需要使用using backup contriolfile
1、使用备份控制文件
2、重建控制文件