非常幸运的是,在数据文件删除的情况下,数据库没有重启,使得这次的恢复变的较为简单,基于这次的恢复,我在我得实验设备上进行了重演,记录了完整的数据文件删除和恢复的完整步骤,如下:
一、准备测试环境,创建新的表空间及数据文件:
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
五、将该文件句柄拷贝到原文件位置:
- 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/