SQL> alter database mount; --有了控制文件,就可以将数据库启动到mount状态了
Database altered.
由于只是控制文件丢失,数据文件仍在,因此并不需要对整个数据库进行修复操作,只需要执行recover命令,重新应用备份的控制文件后生成的那些重做
日志即可;
RMAN> recover database;
Starting recover at 01-SEP-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=153 instance=HHPEN11 devtype=DISK
starting media recovery
archive log thread 1 sequence 6 is already on disk as file +RAC_GROUP/hhpen1/onlinelog/group_1.261.857093607
archive log thread 2 sequence 69 is already on disk as file +RAC_GROUP/hhpen1/onlinelog/group_3.258.857093745
archive log thread 2 sequence 70 is already on disk as file +RAC_GROUP/hhpen1/onlinelog/group_4.257.857093747
archive log filename=+RAC_GROUP/hhpen1/onlinelog/group_1.261.857093607 thread=1 sequence=6
archive log filename=+RAC_GROUP/hhpen1/onlinelog/group_3.258.857093745 thread=2 sequence=69
creating datafile fno=6 name=+RAC_GROUP/hhpen1/datafile/test.dbf
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 09/01/2014 13:45:41
ORA-01119: error in creating database file '+RAC_GROUP/hhpen1/datafile/test.dbf'
ORA-17502: ksfdcre:4 Failed to create file +RAC_GROUP/hhpen1/datafile/test.dbf
ORA-15005: name "hhpen1/datafile/test.dbf" is already used by an existing alias
由于之前模拟了数据文件的丢失操作,其他控制文件中已经有了其配置信息,对数据库进行备份的时候并没有创建test表空间,而只对数据库执行修复操作
的话,肯定会报错。
RMAN> restore datafile 6; --对数据文件执行修复操作
Starting restore at 01-SEP-14
using channel ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 09/01/2014 13:49:20
RMAN-06085: must use SET NEWNAME command to restore datafile /u01/app/oracle/db_1/dbs/UNNAMED00006
登录数据库查看数据文件信息,如下:
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
HHPEN12 MOUNTED
SQL> col name for a50;
SQL> select FILE#,name,status from v$datafile;
FILE# NAME STATUS
---------- -------------------------------------------------- -------
1 +RAC_GROUP/hhpen1/datafile/system.267.857093505 SYSTEM
2 +RAC_GROUP/hhpen1/datafile/undotbs1.266.857093509 ONLINE
3 +RAC_GROUP/hhpen1/datafile/sysaux.263.857093507 ONLINE
4 +RAC_GROUP/hhpen1/datafile/users.265.857093511 ONLINE
5 +RAC_GROUP/hhpen1/datafile/undotbs2.259.857093701 ONLINE
6
/u01/app/oracle/db_1/dbs/UNNAMED00006 RECOVER
6 rows selected.
查看当前数据库需要恢复的数据文件,如下:
SQL> select * from v$recover_file where error like '%FILE%';
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- -------------------- ---------- ------------
6 ONLINE ONLINE FILE MISSING 0
SQL> select file#,name from v$datafile where file#=6;
FILE# NAME
---------- --------------------------------------------------
6 /u01/app/oracle/db_1/dbs/UNNAMED00006
现在需要对数据文件进行改名字,如果说你忘记之前设置的数据文件的名字了,不要紧,使用如下SQL语句查询
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- -------------------------------------------------- --- --- --- ---
0 SYSTEM YES NO YES
1 UNDOTBS1 YES NO YES
2 SYSAUX YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
5 UNDOTBS2 YES NO YES
6
TEST YES NO YES
7 rows selected.
SQL>
alter database create datafile '/u01/app/oracle/db_1/dbs/UNNAMED00006' as '+RAC_GROUP/hhpen1/datafile/test.dbf';
Database altered.
在RMAN执行数据库的恢复操作,如下,显然是OK了:
RMAN> recover database;
Starting recover at 01-SEP-14
using channel ORA_DISK_1
starting media recovery
archive log thread 1 sequence 6 is already on disk as file +RAC_GROUP/hhpen1/onlinelog/group_1.261.857093607
archive log thread 2 sequence 69 is already on disk as file +RAC_GROUP/hhpen1/onlinelog/group_3.258.857093745
archive log thread 2 sequence 70 is already on disk as file +RAC_GROUP/hhpen1/onlinelog/group_4.257.857093747
archive log filename=+RAC_GROUP/hhpen1/onlinelog/group_3.258.857093745 thread=2 sequence=69
archive log filename=+RAC_GROUP/hhpen1/onlinelog/group_1.261.857093607 thread=1 sequence=6
archive log filename=+RAC_GROUP/hhpen1/onlinelog/group_4.257.857093747 thread=2 sequence=70
media recovery complete, elapsed time: 00:00:03
Finished recover at 01-SEP-14
SQL>
alter database open resetlogs; --以resetlogs方式打开数据库
alter database open resetlogs
*
ERROR at line 1:
ORA-01153: an incompatible media recovery is active --看来是好事多磨啊,我喜欢
此时查看数据文件状态,发现test表空间是online状态,如下:
SQL> select FILE#,name,status from v$datafile;
FILE# NAME STATUS
---------- -------------------------------------------------- -------
1 +RAC_GROUP/hhpen1/datafile/system.267.857093505 SYSTEM
2 +RAC_GROUP/hhpen1/datafile/undotbs1.266.857093509 ONLINE
3 +RAC_GROUP/hhpen1/datafile/sysaux.263.857093507 ONLINE
4 +RAC_GROUP/hhpen1/datafile/users.265.857093511 ONLINE
5 +RAC_GROUP/hhpen1/datafile/undotbs2.259.857093701 ONLINE
6 +RAC_GROUP/hhpen1/datafile/test.dbf ONLINE
6 rows selected.
原因分析:RMAN备份或恢复的时候,数据库不能以resetlogs方式打开,关闭当前操作的会话,打开新的会话使用resetlogs方式打开数据库,结果成功了。
SQL> select instance_name,status from gv$instance;
INSTANCE_NAME STATUS
---------------- ------------
HHPEN11 OPEN
HHPEN12 OPEN
SQL> conn dayong/dayong; --备份之后创建的用户还在,表还在,表中数据还在
Connected.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
MYTABLE TABLE
SQL> select * from mytable;
ID NAME
---------- ----------
1 dayong
2 xiaoru