Oracle 丢失数据文件和控制文件的恢复案例

Oracle 丢失数据文件和控制文件的恢复案例
===========================================================

假设条件:
1、只做了对控制文件的备份
2、非归档模式
3、在对控制文件做了备份以后,创建了一个表空间,并包含一个数据文件
4、在新建的表空间下建了一张表,并存了一条数据
5、备份控制文件以后没有进行别的DML操作
6、shutdown abort以后,错误删除刚建表空间所包含的数据文件,包括控制文件:


思路:
要想恢复数据库,必须先恢复控制文件,但控制文件是旧的,不包括删除了的表空间
和数据文件.但删除的数据文件的信息在redo里面还是存在的,由此想到了利用redo来
更新控制文件.更新控制文件后,如果open数据库,它应该会提示数据文件丢失.再增加
相应的数据文件.应用所有redo.数据恢复完成.
可以相应的进行扩展,对archivelog模式的,如果所有存档都在,类似的恢复应该是
没有问题的.



以下是我的恢复过程.

SQL> conn sys/lovelijie@lijie as sysdba
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。

SQL> archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 g:oracleoradatalijiearchive
最早的概要日志序列 1
当前日志序列 2


SQL> alter database backup controlfile to 'd:tempcontrol01.ctl';

数据库已更改。

SQL> create tablespace test datafile 'g:oracleoradatalijietest.dbf' size 5m;


表空间已创建。

SQL> create table test(n number) tablespace test;

表已创建。

SQL> insert into test values(1);

已创建 1 行。

SQL> commit;

提交完成。

SQL> shutdown abort
ORACLE 例程已经关闭。
SQL>

SQL> startup
ORACLE 例程已经启动。

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select name
2 from v$datafile;

NAME
-----------------------------------------------------

G:ORACLEORADATALIJIESYSTEM01.DBF
G:ORACLEORADATALIJIEUNDOTBS01.DBF
G:ORACLEORADATALIJIECWMLITE01.DBF
G:ORACLEORADATALIJIEDRSYS01.DBF
G:ORACLEORADATALIJIEEXAMPLE01.DBF
G:ORACLEORADATALIJIEINDX01.DBF
G:ORACLEORADATALIJIEODM01.DBF
G:ORACLEORADATALIJIETOOLS01.DBF
G:ORACLEORADATALIJIEUSERS01.DBF
G:ORACLEORADATALIJIEXDB01.DBF
G:ORACLEORADATALIJIETEST.DBF

已选择11行。

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

================================

--利用备份的控制文件,删除数据文件后尝试启动数据库.

================================

SQL> startup
ORACLE 例程已经启动。

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项


SQL> shutdown immediate;
ORA-01109: 数据库未打开


已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。

=======================================

基于时间点的恢复,在alert_lijie.log中找到时间加入表空间的时间点.
主要是把控制文件恢复到最新.
换句话说就是把test.dbf的信息加入到控制文件中.

=======================================

SQL> recover database using backup controlfile until time '2005-3-28 15:25:27';
ORA-00279: 更改 406557 (在 03/28/2005 15:20:07 生成) 对于线程 1 是必需的
ORA-00289: 建议: G:ORACLEORADATALIJIEARCHIVEARC00002.001
ORA-00280: 更改 406557 对于线程 1 是按序列 # 2 进行的


指定日志: { =suggested | filename | AUTO | CANCEL}
g:oracleoradatalijieredo01.log
ORA-00283: 恢复会话因错误而取消
ORA-01244: 未命名的数据文件由介质恢复添加至控制文件
ORA-01110: 数据文件 11: 'G:ORACLEORADATALIJIETEST.DBF'


ORA-01112: 未启动介质恢复

=========================================

目的已经达到.(ORA-01244: 未命名的数据文件由介质恢复添加至控制文件.)
加入相应的数据文件.信息在(ORA-01110: 数据文件 11: 'G:ORACLEORADATALIJIETEST.DBF')

==========================================

SQL> alter database create datafile 11 as 'g:oracleoradatalijietest.dbf';

数据库已更改。

===========================================

接着和一般的恢复一样的.指定redo.

===========================================


SQL> recover database using backup controlfile;
ORA-00279: 更改 407488 (在 03/28/2005 15:25:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: G:ORACLEORADATALIJIEARCHIVEARC00002.001
ORA-00280: 更改 407488 对于线程 1 是按序列 # 2 进行的


指定日志: { =suggested | filename | AUTO | CANCEL}
g:oracleoradatalijieredo01.log
ORA-00279: 更改 427753 (在 03/28/2005 15:32:57 生成) 对于线程 1 是必需的
ORA-00289: 建议: G:ORACLEORADATALIJIEARCHIVEARC00003.001
ORA-00280: 更改 427753 对于线程 1 是按序列 # 3 进行的
ORA-00278: 此恢复不再需要日志文件 'g:oracleoradatalijieredo01.log'


指定日志: { =suggested | filename | AUTO | CANCEL}
g:oracleoradatalijieredo02.dbf
ORA-00308: 无法打开存档日志 'g:oracleoradatalijieredo02.dbf'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


指定日志: { =suggested | filename | AUTO | CANCEL}
g:oracleoradatalijieredo02.log
已应用的日志。
完成介质恢复。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

==============================================

用resetlogs打开,使数据文件和日志文件一致.

===============================================

SQL> alter database open resetlogs;

数据库已更改。

SQL> select *
2 from test;

N
----------
1

SQL>
SQL>


conclusions:

要恢复数据库,肯定要恢复控制文件.所以要分两步走,1:恢复控制文件.2:恢复丢失的数据.
这个case是noarchivelog模式的,如果后来的dml很多,覆盖了redo,就没法恢复了.
如果是archivelog模式的,归档的日志都存在,应该是可以恢复的.道理一样.

ref: http://lijietz.itpub.net/post/4988/2393

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值