OS 删除oracle数据文件恢复过程

     在数据库正常运行时,运维人员在无意中将部分数据文件删除了,此时数据库管理员并不知道,且数据库运行正常,并没有立即抛出错误和告警;但是开发人员在对某张表进行更新的时候,正好这张表在被删除的数据文件中,报出ORA-01110和ORA-27041错误。随即数据库管理人员来看现象,发现有一个文件已经从系统层面删除了,并且数据库数据库没有进行重启操作,所以在没有进行更新的时候业务并没有造成影响。

非常幸运的是,在数据文件删除的情况下,数据库没有重启,使得这次的恢复变的较为简单,基于这次的恢复,我在我得实验设备上进行了重演,记录了完整的数据文件删除和恢复的完整步骤,如下:


一、准备测试环境,创建新的表空间及数据文件:

 

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production



SQL>create tablespace test1 datafile '/app/oracle11g/oradata/uporcl/testdata02.dbf' size 1g autoextend on;

Tablespace created.

SQL> select name from v$dbfile;

NAME
--------------------------------------------------------------------------------
/app/oracle11g/oradata/uporcl/system01.dbf
/app/oracle11g/oradata/uporcl/undotbs01.dbf
/app/oracle11g/oradata/uporcl/sysaux01.dbf
/app/oracle11g/oradata/uporcl/users01.dbf
/app/oracle11g/oradata/uporcl/testdata01.dbf
/app/oracle11g/oradata/uporcl/testdata02.dbf

6 rows selected.


 

二、模拟故障,在系统级别删除数据文件:


SQL> !rm -rf /app/oracle11g/oradata/uporcl/testdata02.dbf

三、检查数据库状态,并且创建测试数据

SQL> !tail -f 300 /app/oracle11g/diag/rdbms/uporcl/uporcl/trace/alert*
tail: cannot open `300' for reading: No such file or directory
==> /app/oracle11g/diag/rdbms/uporcl/uporcl/trace/alert_uporcl.log <==
  Current log# 1 seq# 235 mem# 0: /app/oracle11g/oradata/uporcl/redo01.log
Thu Aug 27 13:47:36 2015
Errors in file /app/oracle11g/diag/rdbms/uporcl/uporcl/trace/uporcl_m001_27005.trc:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/app/oracle11g/oradata/uporcl/testdata02.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Thu Aug 27 13:47:37 2015
Checker run found 1 new persistent data failures

#在这里我们可以看到数据文件在系统层面被删除之后数据库并没产生告警。

我们添加一个表,发现已经报错了。
SQL> create table test tablespace test1 as select * from dba_tables;
create table test tablespace test1 as select * from dba_tables
                                                    *
ERROR at line 1:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/app/oracle11g/oradata/uporcl/testdata02.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

#在数据库层面,我们需要往这个删除的文件中写入数据的时候才发现数据文件被删除了。

SQL> select instance_name,status from v$instance;

INSTANCE_NAME  STATUS
---------------- ------------
uporcl   OPEN #即便数据库已经知道了数据库文件丢失,因为不是系统表空间的数据文件,所以数据库的运行并没有收到影响。


四、查找数据文件

因为数据库并没有停止运行,这个时候我们可以通过dbwr写数据文件进程来找到进程句柄号,进入该句柄号就可以找到该进程锁定的相关数据文件了。


SQL> !ps -ef|grep dbw
oracle   21705     1  0 Aug26 ?        00:00:03 ora_dbw0_uporcl
oracle   27137 26986  0 14:01 pts/1    00:00:00 /bin/bash -c ps -ef|grep dbw

#我们可以看到进程的ID为21705,通过进程ID查找到进程下锁定的所有文件
SQL> !ls -rtl /proc/21705/fd
total 0
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 9 -> /app/oracle11g/product/11.2.0/dbhome_1/dbs/hc_uporcl.dat
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 8 -> /dev/zero
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 7 -> /proc/21705/fd
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 6 -> /app/oracle11g/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 3 -> /dev/null
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 265 -> /app/oracle11g/oradata/uporcl/temp01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 264 -> /app/oracle11g/oradata/uporcl/testdata02.dbf (deleted)我们找到了这个文件,处于deleted
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 263 -> /app/oracle11g/oradata/uporcl/testdata01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 262 -> /app/oracle11g/oradata/uporcl/users01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 261 -> /app/oracle11g/oradata/uporcl/sysaux01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 260 -> /app/oracle11g/oradata/uporcl/undotbs01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 259 -> /app/oracle11g/oradata/uporcl/system01.dbf
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 258 -> /app/oracle11g/oradata/uporcl/control03.ctl
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 257 -> /app/oracle11g/oradata/uporcl/control02.ctl
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 256 -> /app/oracle11g/oradata/uporcl/control01.ctl
l-wx------ 1 oracle oinstall 64 Aug 27 14:02 2 -> /dev/null
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 11 -> /app/oracle11g/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lrwx------ 1 oracle oinstall 64 Aug 27 14:02 10 -> /app/oracle11g/product/11.2.0/dbhome_1/dbs/lkUPORCL
l-wx------ 1 oracle oinstall 64 Aug 27 14:02 1 -> /dev/null
lr-x------ 1 oracle oinstall 64 Aug 27 14:02 0 -> /dev/null


五、将该文件句柄拷贝到原文件位置:

  1. SQL>!cp /proc/21705/fd/264      /app/oracle11g/oradata/uporcl/testdata02.dbf

六、对拷贝回来的文件执行常规的数据恢复操作,实际上也就是更新下数据文件头部的scn号:


SQL> col name format a44
SQL> select file#,status,name from v$datafile;

     FILE# STATUS  NAME
---------- ------- --------------------------------------------
  1 SYSTEM  /app/oracle11g/oradata/uporcl/system01.dbf
  2 ONLINE  /app/oracle11g/oradata/uporcl/undotbs01.dbf
  3 ONLINE  /app/oracle11g/oradata/uporcl/sysaux01.dbf
  4 ONLINE  /app/oracle11g/oradata/uporcl/users01.dbf
  5 ONLINE  /app/oracle11g/oradata/uporcl/testdata01.dbf
  6 ONLINE  /app/oracle11g/oradata/uporcl/testdata02.dbf #我们可以看到这个时候该数据文件是ONLINE状态

6 rows selected.

   
#由于这是一套在线库,且有其它业务,不可随意停机,所以这个时候将需要恢复的数据文件offline,就可以直接在线执行恢复了。
注意:在offline数据文件时,如果是在非归档模式下需要offlien tablespace .如果直接offline 数据文件会报错
SQL> alter database datafile 6 offline;
alter database datafile 6 offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled

SQL> archive log list;
Database log mode        No Archive Mode
Automatic archival        Disabled
Archive destination        USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     233
Current log sequence        235
SQL> alter tablespace test1 offline;

Tablespace altered.

SQL>  select file#,status,name from v$datafile;

     FILE# STATUS  NAME
---------- ------- --------------------------------------------
  1 SYSTEM  /app/oracle11g/oradata/uporcl/system01.dbf
  2 ONLINE  /app/oracle11g/oradata/uporcl/undotbs01.dbf
  3 ONLINE  /app/oracle11g/oradata/uporcl/sysaux01.dbf
  4 ONLINE  /app/oracle11g/oradata/uporcl/users01.dbf
  5 ONLINE  /app/oracle11g/oradata/uporcl/testdata01.dbf
  6 OFFLINE /app/oracle11g/oradata/uporcl/testdata02.dbf. #在对数据文件进行操作,触发了该文件,发现文件头部的scn不一致,提示需要进行恢复。

6 rows selected

执行在线恢复并且online该数据文件。

SQL>recover datafile 6;

Media recovery complete.

SQL>alter database datafile 8 online;
Database altered.


七、验证数据文件恢复后是否可以正常使用


SQL>  select file#,status,name from v$datafile;

     FILE# STATUS  NAME
---------- ------- --------------------------------------------
  1 SYSTEM  /app/oracle11g/oradata/uporcl/system01.dbf
  2 ONLINE  /app/oracle11g/oradata/uporcl/undotbs01.dbf
  3 ONLINE  /app/oracle11g/oradata/uporcl/sysaux01.dbf
  4 ONLINE  /app/oracle11g/oradata/uporcl/users01.dbf
  5 ONLINE  /app/oracle11g/oradata/uporcl/testdata01.dbf
  6 ONLINE /app/oracle11g/oradata/uporcl/testdata02.dbf


SQL>create table test tablespace test1 as select * from dba_users;

Table created.


八、至此完成该数据文件的恢复



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12798004/viewspace-1784093/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12798004/viewspace-1784093/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值