发表于:2006.03.17 15:49
分类: Oracle
出处:http://xsb.itpub.net/post/419/60493
---------------------------------------------------------------
假设条件:
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模式的,归档的日志都存在,应该是可以恢复的.道理一样.