参考戴老板博客实验:
http://blog.csdn.net/tianlesoftware/article/details/44082283
环境:
数据库版本:11.2.0.4(归档模式)
操作系统:oracle linux 6.3
创建测试表空间,测试数据
SQL> create tablespace test datafile '/opt/oracle/oradata/orcl/test01.dbf' size 100M;
Tablespace created.
SQL> create user test identified by test default tablespace test;
User created.
SQL> grant dba to test;
Grant succeeded.
SQL> conn test/test;
Connected.
SQL> create table test1 as select * from all_users;
Table created.
SQL> create table test2 as select * from all_users;
Table created.
SQL> create table test3 as select * from all_users;
Table created.
故障模拟
在操作系统直接删除数据文件
# cd /opt/oracle/oradata/
# rm -rf test01.dbf
此时
SQL> select count(1) from test1;
COUNT(1)
----------
31
SQL> select count(2) from test2;
COUNT(2)
----------
31
SQL> insert into test1 select * from test2;
31 rows created.
SQL> commit;
Commit complete.
对表的查询插入并没有感觉到影响,因为我们的操作系统是Linux,当数据文件从操作系统级别被rm掉,但之前打开该文件的进程仍然持有相应的文件句柄,所以指向的文件仍然可以读写,并且该文件的文件描述符可以从/proc目录中获得,也可以利用这个句柄恢复文件。
恢复
dbwr进程会打开所有数据文件的句柄,在proc目录中可以查到这些数据文件的信息,目录名是进程PID,fd表示文件描述符。
检查dbwr的进程PID:
[root@localhost orcl]# ps -ef|grep dbw
oracle 4216 1 0 Mar15 ? 00:00:02 ora_dbw0_orcl
root 7353 7308 0 09:00 pts/3 00:00:00 grep dbw
[root@localhost orcl]# cd /proc/4216/fd
[root@localhost fd]# ls -l
total 0
lr-x------. 1 oracle oinstall 64 Mar 16 09:00 0 -> /dev/null
l-wx------. 1 oracle oinstall 64 Mar 16 09:00 1 -> /dev/null
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 10 -> /opt/oracle/product/11.2.0/db_1/dbs/lkORCL
lr-x------. 1 oracle oinstall 64 Mar 16 09:00 11 -> /opt/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb
l-wx------. 1 oracle oinstall 64 Mar 16 09:00 2 -> /dev/null
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 256 -> /opt/oracle/oradata/orcl/control01.ctl
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 257 -> /opt/oracle/fast_recovery_area/orcl/control02.ctl
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 258 -> /opt/oracle/oradata/orcl/system01.dbf
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 259 -> /opt/oracle/oradata/orcl/sysaux01.dbf
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 260 -> /opt/oracle/oradata/orcl/undotbs01.dbf
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 261 -> /opt/oracle/oradata/orcl/users01.dbf
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 262 -> /opt/oracle/oradata/orcl/temp01.dbf
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 263 -> /opt/oracle/oradata/orcl/test01.dbf (deleted)
lr-x------. 1 oracle oinstall 64 Mar 16 09:00 3 -> /dev/null
lr-x------. 1 oracle oinstall 64 Mar 16 09:00 4 -> /dev/null
lr-x------. 1 oracle oinstall 64 Mar 16 09:00 5 -> /dev/null
lr-x------. 1 oracle oinstall 64 Mar 16 09:00 6 -> /opt/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb
lr-x------. 1 oracle oinstall 64 Mar 16 09:00 7 -> /proc/4216/fd
lr-x------. 1 oracle oinstall 64 Mar 16 09:00 8 -> /dev/zero
lrwx------. 1 oracle oinstall 64 Mar 16 09:00 9 -> /opt/oracle/product/11.2.0/db_1/dbs/hc_orcl.dat
可以看到有一条263delete的记录,就是被删除的数据文件
直接cp该句柄文件名回原位置
# cp 263 /opt/oracle/oradata/orcl/test01.dbf
因为数据库一直是open的,那么SCN也会不断的变化,我们cp出来的数据文件和数据库当前的信息不一致,所以我们需要进行recover:
SQL> alter database datafile '/opt/oracle/oradata/orcl/test01.dbf' offline;
Database altered.
SQL> recover datafile '/opt/oracle/oradata/orcl/test01.dbf' ;
ORA-00283: recovery session canceled due to errors
ORA-01110: data file 5: '/opt/oracle/oradata/orcl/test01.dbf'
ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/opt/oracle/oradata/orcl/test01.dbf'
查看alert日志
Fri Mar 16 09:09:57 2018
Errors in file /opt/oracle/diag/rdbms/orcl/orcl/trace/orcl_dbw0_4216.trc:
ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/opt/oracle/oradata/orcl/test01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied
Additional information: 9
Media Recovery failed with error 1110
怀疑是权限问题查看数据文件归属
[oracle@localhost orcl]$ ll -lrt
total 1639468
-rw-r-----. 1 oracle oinstall 52429312 Mar 15 22:00 redo01.log
-rw-r-----. 1 oracle oinstall 30416896 Mar 15 22:00 temp01.dbf
-rw-r-----. 1 oracle oinstall 52429312 Mar 15 22:05 redo02.log
-rw-r-----. 1 oracle oinstall 5251072 Mar 15 22:10 users01.dbf
-rw-r-----. 1 oracle oinstall 775954432 Mar 16 09:05 system01.dbf
-rw-r-----. 1 root root 104865792 Mar 16 09:07 test01.dbf
-rw-r-----. 1 oracle oinstall 545267712 Mar 16 09:11 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 78651392 Mar 16 09:11 undotbs01.dbf
-rw-r-----. 1 oracle oinstall 52429312 Mar 16 09:11 redo03.log
-rw-r-----. 1 oracle oinstall 9748480 Mar 16 09:12 control01.ctl
果然,在cp回删除数据文件的时候是在root用户下操作的,造成了恢复过来的数据文件权限问题,修改权限
[root@localhost orcl]# chown -R oracle:oinstall test01.dbf
[root@localhost orcl]# ll -lrt
total 1639468
-rw-r-----. 1 oracle oinstall 52429312 Mar 15 22:00 redo01.log
-rw-r-----. 1 oracle oinstall 30416896 Mar 15 22:00 temp01.dbf
-rw-r-----. 1 oracle oinstall 52429312 Mar 15 22:05 redo02.log
-rw-r-----. 1 oracle oinstall 5251072 Mar 15 22:10 users01.dbf
-rw-r-----. 1 oracle oinstall 104865792 Mar 16 09:07 test01.dbf
-rw-r-----. 1 oracle oinstall 545267712 Mar 16 09:11 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 78651392 Mar 16 09:16 undotbs01.dbf
-rw-r-----. 1 oracle oinstall 775954432 Mar 16 09:16 system01.dbf
-rw-r-----. 1 oracle oinstall 52429312 Mar 16 09:16 redo03.log
-rw-r-----. 1 oracle oinstall 9748480 Mar 16 09:17 control01.ctl
重新做recover恢复
SQL> recover datafile '/opt/oracle/oradata/orcl/test01.dbf' ;
Media recovery complete.
SQL> alter database datafile '/opt/oracle/oradata/orcl/test01.dbf' online;
Database altered.
恢复完成,备份,进行一起正常启停
版权声明:本文为博主原创文章,未经博主允许不得转载。
恢复






