暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

非归档模式下使用文件描述符恢复误删除数据文件

1915

误删除数据文件又没有可用备份的情况下,可以使用操作系统文件描述符恢复误删除的数据文件。必须的限制,是数据库不能启停。之前一直觉得非归档模式下是行不通的,今天再看到这篇文章,突然觉得未必不能。模拟删除非system表空间的情况下,非归档模式的恢复(如果是全库都被删除的情况下,也就无所谓归档不归档了,如果数据库没有abort,通过dbw进程找到fd拷贝,然后数据库shut abort再启库)。

归档模式

通过dbw进程找到文件fd,然后拷贝到指定目录,通过rename recover进行恢复
ps -ef | grep dbw 
lsof -p dbw_pid
cp /proc/dbw_pid/fd/fd_id
alter database datafile 'old_datafile' offline;
alter database rename file 'old_file' to 'new_datafile';
recover datafile 'new_datafile';
alter database datafile 'new_datafile' online;

非归档模式

SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /arch
Oldest online log sequence     17
Current log sequence           19
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/ORCL/datafile/o1_mf_oggtbs_j15d3b74_.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/t1.dbf
/u01/app/oracle/oradata/orcl/users01.dbf

6 rows selected.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
[oracle@rhel7 trace]$ rm -rf /u01/app/oracle/oradata/orcl/t1.dbf

[oracle@rhel7 trace]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Mon Mar 22 09:31:34 2021

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> select * from  t1.cm02;

        ID NAME
---------- --------------------
         1 hhh
         1 hahsdff
         1 hhhsdf
         1 hwhqqqq
         1 hhwwsah
         1 hhhadf
         1 hhaaadsh

7 rows selected.

SQL> alter system switch logfile;

System altered.

SQL> select * from  t1.cm02;

        ID NAME
---------- --------------------
         1 hhh
         1 hahsdff
         1 hhhsdf
         1 hwhqqqq
         1 hhwwsah
         1 hhhadf
         1 hhaaadsh

7 rows selected.

SQL> insert into t1.cm01 values(1,'sss');
insert into t1.cm01 values(1,'sss')
               *
ERROR at line 1:
ORA-01116: error in opening database file 5
ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/t1.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
##此时仍可进行switch logfile动作,select语句由于刷新到内存中,仍然可以查询。dml操作无法执行。

ps -ef|grep dbw
lsof -p 6263
ora_dbw0_ 6263 oracle  262uW  REG  253,0 104865792  7436484  /u01/app/oracle/oradata/orcl/t1.dbf (deleted)

cp /proc/6263/fd/262 /u01/app/oracle/oradata/orcl/t2.dbf

alter database datafile '/u01/app/oracle/oradata/orcl/t1.dbf' offline;

ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled

加offline drop:
alter database datafile '/u01/app/oracle/oradata/orcl/t1.dbf' offline drop;
Database altered.

alter database rename file '/u01/app/oracle/oradata/orcl/t1.dbf' to '/u01/app/oracle/oradata/orcl/t2.dbf';
Database altered.

SQL> recover datafile '/u01/app/oracle/oradata/orcl/t2.dbf';
Media recovery complete.
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/t2.dbf' online;

Database altered.

恢复完成。此时使用t1用户进行读写正常。

注意

  • 非归档模式下,datafile offline需要指定 drop
  • 非归档模式下,在误删除文件后,需尽快的停止业务,避免引起redo 切换。如误删除后的redo切换超过数据库的redo组数,数据库实例abort,文件连接就会释放。
SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /
alter system switch logfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 6287
Session ID: 32 Serial number: 54799

  • 误删除数据文件后,尽量减少不必要的操作。如手工flush cache操作,会导致数据库实例abort,文件连接释放。
SQL> alter system flush FLASH_CACHE;

System altered.
SQL> select * from  t1.cm01;
select * from  t1.cm01
*
ERROR at line 1:
ORA-03135: connection lost contact
Process ID: 7510
Session ID: 57 Serial number: 37229

##aler日志:
Additional information: 7
2021-03-22T09:34:14.224309+08:00
USER (ospid: 6971): terminating the instance due to error 1242
2021-03-22T09:34:14.330621+08:00
System state dump requested by (instance=1, osid=6971 (CKPT)), summary=[abnormal instance termination].
System State dumped to trace file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_diag_6951_20210322093414.trc
2021-03-22T09:34:15.633521+08:00
Dumping diagnostic data in directory=[cdmp_20210322093414], requested by (instance=1, osid=6971 (CKPT)), summary=[abnormal instance termination].
2021-03-22T09:34:16.980916+08:00
Instance terminated by USER, pid = 6971
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论