Oracle使用句柄实现特定场景的无备份恢复(2)

[ora11g@rac1 proc]$ ps -ef|grep ora_dbw
 ora11g    938    1  0 Nov20 ?        00:00:07 ora_dbw0_TEST01
 ora11g    7819  5794  0 06:04 pts/0    00:00:00 grep ora_dbw

然后在/proc/938/fd里面查看
[ora11g@rac1 proc]$ ll /proc/938/fd   
 total 0
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 0 -> /dev/null
 l-wx------ 1 ora11g dba 64 Nov 21 05:36 1 -> /dev/null
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 10 -> /dev/zero
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 11 -> /dev/zero
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 12 -> /u03/ora11g/product/11.2.0/dbhome_1/dbs/hc_TEST01.dat
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 13 -> /u03/ora11g/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 14 -> /proc/938/fd
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 15 -> /dev/zero
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 16 -> /u03/ora11g/product/11.2.0/dbhome_1/dbs/hc_TEST01.dat
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 17 -> /u03/ora11g/product/11.2.0/dbhome_1/dbs/lkTEST01
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 18 -> /u03/ora11g/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
 lrwx------ 1 ora11g dba 64 Nov 21 06:05 19 -> socket:[1434598]
 l-wx------ 1 ora11g dba 64 Nov 21 05:36 2 -> /dev/null
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 256 -> /u03/ora11g/oradata/TEST01/control01.ctl
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 257 -> /u03/ora11g/oradata/TEST01/control02.ctl
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 258 -> /u03/ora11g/oradata/TEST01/system01.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 259 -> /u03/ora11g/oradata/TEST01/sysaux01.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 260 -> /u03/ora11g/oradata/TEST01/undotbs01.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 261 -> /u02/ora11g/testdata1.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 262 -> /u03/ora11g/oradata/TEST01/pool_data03.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 263 -> /u03/ora11g/oradata/TEST01/pool_data01.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 264 -> /u03/ora11g/oradata/TEST01/pool_data02.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 265 -> /u03/ora11g/oradata/TEST01/pool_data04.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 266 -> /u03/ora11g/oradata/TEST01/pool_data05.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 267 -> /u01/ora11g/pool_data06.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 268 -> /u01/ora11g/pool_data07.dbf
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 269 -> /u03/ora11g/oradata/TEST01/temp01.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:55 270 -> /u01/ora11g/test_delete.dbf (deleted)
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 3 -> /dev/null
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 4 -> /dev/null
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 5 -> /dev/null
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 6 -> /dev/null
 lrwx------ 1 ora11g dba 64 Nov 21 05:36 7 -> /u03/ora11g/product/11.2.0/dbhome_1/dbs/hc_TEST01.dat
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 8 -> /dev/null
 lr-x------ 1 ora11g dba 64 Nov 21 05:36 9 -> /dev/null

可以看到句柄的信息,删除的数据文件状态已经在/proc/xx/fd里面有所体现了。
 这个时候我们手动拷贝数据文件到目标目录。

[ora11g@rac1 fd]$ cp 270 /u01/ora11g/test_delete.dbf
 [ora11g@rac1 fd]$
拷贝完成之后,使用测试用户来做一些简单的验证。发现创建一个新表的操作顺利完成了。

SQL> conn test_delete/test_delete
 Connected.
 SQL> create table test4 as select *from cat;
 Table created.
来看看在数据文件恢复之前的情况。
SQL> select count(*)from test;  --数据没有问题,条数和预期一致。
  COUNT(*)
 ----------
      5660

SQL> select count(*)from test1 where object_name='a';  --这个部分,事务已经做了提交。可以说明变更的数据已经写入了数据文件。期望应该是0条。
  COUNT(*)
 ----------
        99


然后我们来尝试做数据文件的恢复。

SQL> conn / as sysdba
 Connected.
 SQL> alter database datafile '/u01/ora11g/test_delete.dbf' offline;
 Database altered.
 SQL> recover datafile '/u01/ora11g/test_delete.dbf';
 Media recovery complete.
 SQL> alter database datafile '/u01/ora11g/test_delete.dbf' online;
 Database altered.
来看看数据文件恢复之后的情况

SQL> select count(*)from test;  --数据没有问题,条数和预期一致。
  COUNT(*)
 ----------
      5660

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a4a4dbaad4caf564bbf984b5e9186135.html