控制文件(control)被误删恢复方法(ORA-00283/ORA-01610的问题)

第一:
要弄清楚resetlogs与noresetlogs的区别
norestlogs,控制文件的scn是来自当前日志的high scn,而resetlogs控制文件的scn是来自数据文件。


第二:
如何时取得创建控制文件的脚本,方法如下:

sql>alter database backup to trace;


然后通过查询跟踪文件的脚本可以查询到相关的详细信息
SQL> SELECT a.VALUE||b.symbol||c.instance_name||'_ora_'||d.spid||'.trc' TRACE_FILE_NAME
    FROM (SELECT VALUE FROM v$parameter WHERE NAME='user_dump_dest') a,
        (SELECT SUBSTR(VALUE,-6,1) symbol FROM v$parameter WHERE NAME='user_dump_dest') b,
         (SELECT instance_name FROM v$instance) c,
         (SELECT spid FROM v$session s,v$process p,v$mystat m
          WHERE s.paddr=p.addr AND s.SID=m.SID AND m.statistic#=0) d
    /

TRACE_FILE_NAME
---------------------------------------------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP\orcl_ora_5724.trc


在这orcl_ora_5724.trc脚本中可以找到创建控制文件的两种方式noresetlogs/resetlogs.

第三:模拟出错的过程
shutdown abort来进行关闭据库。
第四:利用noresetlogs来进行控件文件以及数据库的恢复
1.启动到数据库为nomount状态
sql>startup nomount;
2.开始创建控制文件
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'  SIZE 50M,
  GROUP 2 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG'  SIZE 50M,
  GROUP 3 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\FTITEM10G01',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EYGLE01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\FTTEST01',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS02.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZXF1.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZXF2.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TZX01.DBF'
CHARACTER SET ZHS16GBK
;


3.recover database; //恢复数据库
4.打开数据库 alter database open;
因为noresetlogs是用当前日志的high scn来恢复,所以基本没有问题。

第四:利用resetlogs来进行控件文件以及数据库的恢复,这里出现的一些问题
1.shutdown abort
2.数据库启动到nomount状态
3.创建控制文件 
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'  SIZE 50M,
  GROUP 2 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG'  SIZE 50M,
  GROUP 3 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\FTITEM10G01',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EYGLE01.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\FTTEST01',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS02.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZXF1.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZXF2.DBF',
  'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TZX01.DBF'
CHARACTER SET ZHS16GBK
;


4.alter database mount; 把数据库启动到mount状态
5. SQL> recover database;
   ORA-00283: 恢复会话因错误而取消
   ORA-01610: 使用 BACKUP CONTROLFILE 选项的恢复必须已完成
因为采用的resetlogs方式,所以会出现如上的错误
这时需要用如下的方式进行恢复
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 6432534 (在 06/22/2008 16:39:31 生成) 对于线程 1 是必需的
ORA-00289: 建议:
E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_06_22\O1_MF_1_
13_%U_.ARC
ORA-00280: 更改 6432534 (用于线程 1) 在序列 #13 中


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

在这里有几个选项
suggested:在上面ORA-00289: 建议:....会按这个文件去恢复
filename:自己指定日志文件
auto:自动选择,但我个人觉得好像和suggestted一样呢:(
cancel:这个可以不从介质恢复。

我在这里选择auto和suggested无不行,报的错误如下:
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志 'E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2008_06_22
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

采用cancel报如下错:
ORA-01112: 未启动介质恢复

经过以上的步骤后来发现:
我这里的归档日志中要求的是日志文件不存在
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2008_06_22O1_MF_1_9_45W1NQDP_.ARC
ORA-00310: 归档日志包含序列 9; 要求序列 10
ORA-00334: 归档日志:
'E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2008_06_22O1_MF_1
_9_45W1NQDP_.ARC'

查看日志文件:
select * from v$log;
GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS      
------ ---------- ---------- ---------- ---------- --- --------
     1          1          0   52428800          1 YES UNUSED
     3          1          0   52428800          1 YES CURRENT
     2          1          0   52428800          1 YES UNUSED
发现这里的理解有问题,因为采用的是resetlogs,所以日志文件肯定是unused的,呵, 这里要多谢棉花糖的。

6.仔细查看eygle的书这时有一句话
"如果在线日志未损坏,则可以指定在线日志文件执行恢复",这时棉花糖也指出了这点:
“哦,忘了你的是resetlogs,你的在线日志还在吧 ,把在线日志的路径输入啊,比如这样D:ORACLEPRODUCT10.2.0ORADATATESTREDO01.LOG ,你把所有的日志测试过去,有一个应该是能用来做恢复”
经过再次尝试终于成功了


SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 6432534 (在 06/22/2008 16:39:31 生成) 对于线程 1 是必需的
ORA-00289: 建议:
E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_06_22\O1_MF_1_
13_%U_.ARC
ORA-00280: 更改 6432534 (用于线程 1) 在序列 #13 中


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
ORA-00310: 归档日志包含序列 12; 要求序列 13
ORA-00334: 归档日志: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG'


SQL>  recover database using backup controlfile until cancel;

ORA-00279: 更改 6432534 (在 06/22/2008 16:39:31 生成) 对于线程 1 是必需的
ORA-00289: 建议:
E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_06_22\O1_MF_1_
13_%U_.ARC
ORA-00280: 更改 6432534 (用于线程 1) 在序列 #13 中


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
已应用的日志。
完成介质恢复。


SQL> alter database open;

alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;

数据库已更改。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值