使用文件描述符恢复误删除的数据文件

OS:Oracle Linux 5u8 x64
DB:Oracle 11.2.0.4

在Oracle运行时,如果误删除了数据文件,可以通过如下方式恢复。前提是不能关闭Oracle进程。因为文件在用命令删除时,并未立刻在磁盘上被删除,其句柄扔被进程访问,因此一旦进程终止,将无法找回文件。

另有一点注意,对于用户表空间(如USERS),可用如下方式恢复。但如果是SYSTEM表空间则不可以,因为删除SYSTEM表空间后,已无法使用sqlplus登录。

下面开始实验。

数据库已打开,其下有数据文件

点击(此处)折叠或打开

  1. $ cd /oradata/APR/datafile/
  2. [oracle@apr datafile]$ ll
  3. total 4690612
  4. -rw-r----- 1 oracle oinstall 597696512 Jun 6 23:04 o1_mf_sysaux_chzbv7op_.dbf
  5. -rw-r----- 1 oracle oinstall 786440192 Jun 6 23:04 o1_mf_system_chzbv7mg_.dbf
  6. -rw-r----- 1 oracle oinstall 30416896 Jun 6 23:06 o1_mf_temp_chzbynjn_.tmp
  7. -rw-r----- 1 oracle oinstall 1073750016 Jun 6 23:06 o1_mf_temp_chzg2zy8_.tmp
  8. -rw-r----- 1 oracle oinstall 94380032 Jun 6 23:04 o1_mf_undotbs1_chzbv7pc_.dbf
  9. -rw-r----- 1 oracle oinstall 2629312512 Jun 6 23:04 o1_mf_users_chzbv7qk_.dbf
删除USERS表空间数据文件

点击(此处)折叠或打开

  1. $ ll *users*
  2. -rw-r----- 1 oracle oinstall 2629312512 Jun 6 23:04 o1_mf_users_chzbv7qk_.dbf
  3. [oracle@apr datafile]$ rm -f *users*
此时,可能仍然能查询该表空间内的数据,但应无法执行DML语句。

点击(此处)折叠或打开

  1. SQL> select owner,table_name,tablespace_name from dba_tables where owner='SH' and TABLE_NAME='SALES';

  2. OWNER TABLE_NAME
  3. ------------------------------ ------------------------------
  4. TABLESPACE_NAME
  5. ------------------------------
  6. SH SALES
  7. USERS

  8. SQL> connect sh/sh
  9. Connected.
  10. SQL> create table tt (x int);

  11. Table created.

  12. SQL> insert into tt values (1);
  13. insert into tt values (1)
  14.             *
  15. ERROR at line 1:
  16. ORA-01116: error in opening database file 4
  17. ORA-01110: data file 4: '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf'
  18. ORA-27041: unable to open file
  19. Linux-x86_64 Error: 2: No such file or directory
  20. Additional information: 3
下面开始尝试恢复。

1. 确认PID

点击(此处)折叠或打开

  1. $ ps -ef | grep dbw
  2. oracle 4883 1 0 23:04 ? 00:00:00 ora_dbw0_apr
  3. oracle 5067 5034 0 23:07 pts/4 00:00:00 grep dbw
2. 确认FD

点击(此处)折叠或打开

  1. # lsof -p 4883
  2. ……
  3. oracle 4883 oracle 258uW REG 253,2 786440192 2867203 /oradata/APR/datafile/o1_mf_system_chzbv7mg_.dbf
  4. oracle 4883 oracle 259u REG 253,2 608182272 2867204 /oradata/APR/datafile/o1_mf_sysaux_chzbv7op_.dbf
  5. oracle 4883 oracle 260uW REG 253,2 94380032 2867205 /oradata/APR/datafile/o1_mf_undotbs1_chzbv7pc_.dbf
  6. oracle 4883 oracle 261uW REG 253,2 2629312512 2867206 /oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf (deleted)
  7. oracle 4883 oracle 262uW REG 253,2 30416896 2867213 /oradata/APR/datafile/o1_mf_temp_chzbynjn_.tmp
  8. oracle 4883 oracle 263uW REG 253,2 1073750016 2867214 /oradata/APR/datafile/o1_mf_temp_chzg2zy8_.tmp
  9. [root@apr ~]#
3. 复制相关文件到新路径
注意:cp后user01.dbf有可能是目录,真正的文件在改目录下。移动重命名即可。

点击(此处)折叠或打开

  1. $ mkdir /oradata/neworadata
  2. [oracle@apr ~]$ cp /proc/4883/fd/261 /oradata/neworadata/users01.dbf
4. 将问题数据文件离线、重命名、恢复、在线;
注意:在offline期间可能Oracle进程被自动强制关闭,此时需重新将Oracle启动到mount状态。

点击(此处)折叠或打开

  1. alter database datafile '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf' offline;

  2. alter database rename file '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf' to '/oradata/neworadata/users01.dbf';

  3. SQL> recover datafile '/oradata/neworadata/users01.dbf';
  4. Media recovery complete.
  5. SQL> alter database datafile '/oradata/neworadata/users01.dbf' online;

  6. Database altered.

  7. SQL> alter database open;

  8. Database altered.
完成!


请使用浏览器的分享功能分享到微信等