1、 控制文件损坏
1)创建控制文件
l 使用shutdown abort关闭数据库之后的恢复
SQL> startup nomount
SQL> CREATE CONTROLFILE REUSE DATABASE "TBM" NORESETLOGS ARCHIVELOG……
SQL> recover database ; --因为是shutdown abort关闭,所以需要恢复
SQL> alter database open;
l 使用正常shutdown关闭数据库之后的恢复
SQL> startup nomount
SQL> CREATE CONTROLFILE REUSE DATABASE "TBM" NORESETLOGS ARCHIVELOG……
SQL> alter database open;
说明:我们看到如果是正常数据库down机的,那么使用noresetlog创建控制文件后直接可以打开数据库。如果重新创建文件之前,Online logs 没有丢失日志的话,在恢复的时候就可以完全恢复,否则,只能进行不完全恢复。注意我们可以看到由于重建了控制文件,临时表空间的临时文件没有了。
2)使用控制文件备份来恢复
说明:备份控制文件不会存有关于联机日志文件和数据文件结束SCN,因此不会在恢复时使用联机日志文件,并因此将数据文件假定了一个无穷大的结束SCN,所以要休整他,必须resetlogs。
当数据库用normal或immediate关闭时,发出检查点处理,这将为每个数据文件在控制文件中设置相应的结束SCN,使其等于数据文件头中对应的开始SCN。
注意:在使用控制文件备份来恢复数据库时,必须同时使用在控制文件备份之前进行备份的全部数据文件先行覆盖现有数据库的数据文件,此时数据库才能恢复成功。而此时的恢复可以是完全恢复,也可以是不完全恢复。
在关闭数据库之前,先查看此时的SCN,为了保证进行完全恢复;
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
68658 69410
SQL> shutdown
还原备份控制文件,还原所有备份数据文件。
SQL> startup mount
SQL> recover database using backup controlfile until cancel;
接下来就是进行存档日志的恢复了;
再次查看此时的SCN;
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
68658 69408
到此是不完全恢复那我们还可以应用在线日志进行完全恢复。
继续:
SQL> recover database using backup controlfile until cancel;
指定日志: {
C:\oracle\oradata\testdb\REDO02.LOG ß----指定联机日志文件名称
(until cancel+ backup controlfile不前滚在线日志文件,只能指定名称)
ORA-00310: 存档日志包含序列 3;要求序列 5
ORA-00334: 归档日志: 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'
继续:
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的
指定日志: {
C:\oracle\oradata\testdb\REDO01.LOG --这步是关键
已应用的日志。
完成介质恢复。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
68658 69418 --在SEQUENCE=5中的SCN被应用了
SQL> alter database open resetlogs;
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
69418 69516
2、 控制文件丢失
1)使用正常shutdown 关闭数据库,并且丢失1个数据文件,此数据文件表空间中刚刚新建了一张表,且插入了数据,那么我们通过创建控制文件,recover database也可以完全恢复。
在这里新建了一张表 test,存储在users表空间中;
~~~~~~~~~~~~~~~~~~~~~~~~
删除控制文件
删除USERS01.DBF
~~~~~~~~~~~~~~~~~~~~~~~~
SQL> STARTUP NOMOUNT
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS ARCHIVELOG。。。。。。
SQL> RECOVER DATABASE;
完成介质恢复。
SQL> ALTER DATABASE OPEN;
数据库已更改。
完全恢复了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10037372/viewspace-663239/ ,如需转载,请注明出处,否则将追究法律责任。