首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > Oracle 丢失数据文件和控制文件的恢复案例
【标  题】:Oracle 丢失数据文件和控制文件的恢复案例
【关键字】:Oracle
【来  源】:http://blog.csdn.net/My_Way/archive/2007/03/05/1521391.aspx

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

 
MSSQL server数据库减肥 的一个办法:【上一篇】
Error:ORA-01033:ORACLE initialization or shutdown in progress错误解决:【下一篇】
【相关文章】
  • Oracle表段中的高水位线HWM
  • oracle SQL性能优化
  • 解析oracle的rownum
  • oracle数据字典简介说明
  • 如何打开ORACLE9i 的自动归档模式
  • oracle学习日记-0304RMAN nocatalog备份当通过rman nocatalog方式
  • oracle init.ora 文件据在位置
  • ORACLE 中 设置 utl_file_dir
  • oracle学习日记-0302查询命令
  • UNIX下让ORACLE定时执行*.sql文件
  • 【随机文章】
  • 古代最成功的项目管理案例 [转贴]
  • 在Windows 2003/XP with SQL Server下部署Snort入侵检测系统
  • 用ServletJSP动态生成英文、数字图像验证码
  • nmap 扫描mac地址
  • 学习Java6(七)JDBC4.0(1)JDBC驱动自动加载
  • procmail error solution
  • 用C来调用C++的动态库
  • 宽带接入网络的规划与设计(1)
  • 一个c指针例析
  • 在Debia上安装 Oracle 10gR2 RAC: 配置裸设备
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.