误删除数据文件又没有可用备份的情况下,可以使用操作系统文件描述符恢复误删除的数据文件。必须的限制,是数据库不能启停。之前一直觉得非归档模式下是行不通的,今天再看到这篇文章,突然觉得未必不能。模拟删除非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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




