DB:Oracle 11.2.0.4
在Oracle运行时,如果误删除了数据文件,可以通过如下方式恢复。前提是不能关闭Oracle进程。因为文件在用命令删除时,并未立刻在磁盘上被删除,其句柄扔被进程访问,因此一旦进程终止,将无法找回文件。
另有一点注意,对于用户表空间(如USERS),可用如下方式恢复。但如果是SYSTEM表空间则不可以,因为删除SYSTEM表空间后,已无法使用sqlplus登录。
下面开始实验。
数据库已打开,其下有数据文件
点击(此处)折叠或打开
-
$ cd /oradata/APR/datafile/
-
[oracle@apr datafile]$ ll
-
total 4690612
-
-rw-r----- 1 oracle oinstall 597696512 Jun 6 23:04 o1_mf_sysaux_chzbv7op_.dbf
-
-rw-r----- 1 oracle oinstall 786440192 Jun 6 23:04 o1_mf_system_chzbv7mg_.dbf
-
-rw-r----- 1 oracle oinstall 30416896 Jun 6 23:06 o1_mf_temp_chzbynjn_.tmp
-
-rw-r----- 1 oracle oinstall 1073750016 Jun 6 23:06 o1_mf_temp_chzg2zy8_.tmp
-
-rw-r----- 1 oracle oinstall 94380032 Jun 6 23:04 o1_mf_undotbs1_chzbv7pc_.dbf
- -rw-r----- 1 oracle oinstall 2629312512 Jun 6 23:04 o1_mf_users_chzbv7qk_.dbf
点击(此处)折叠或打开
-
$ ll *users*
-
-rw-r----- 1 oracle oinstall 2629312512 Jun 6 23:04 o1_mf_users_chzbv7qk_.dbf
- [oracle@apr datafile]$ rm -f *users*
点击(此处)折叠或打开
-
SQL> select owner,table_name,tablespace_name from dba_tables where owner='SH' and TABLE_NAME='SALES';
-
-
OWNER TABLE_NAME
-
------------------------------ ------------------------------
-
TABLESPACE_NAME
-
------------------------------
-
SH SALES
-
USERS
-
-
SQL> connect sh/sh
-
Connected.
-
SQL> create table tt (x int);
-
-
Table created.
-
-
SQL> insert into tt values (1);
-
insert into tt values (1)
-
*
-
ERROR at line 1:
-
ORA-01116: error in opening database file 4
-
ORA-01110: data file 4: '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf'
-
ORA-27041: unable to open file
-
Linux-x86_64 Error: 2: No such file or directory
- Additional information: 3
1. 确认PID
点击(此处)折叠或打开
-
$ ps -ef | grep dbw
-
oracle 4883 1 0 23:04 ? 00:00:00 ora_dbw0_apr
- oracle 5067 5034 0 23:07 pts/4 00:00:00 grep dbw
点击(此处)折叠或打开
-
# lsof -p 4883
-
……
-
oracle 4883 oracle 258uW REG 253,2 786440192 2867203 /oradata/APR/datafile/o1_mf_system_chzbv7mg_.dbf
-
oracle 4883 oracle 259u REG 253,2 608182272 2867204 /oradata/APR/datafile/o1_mf_sysaux_chzbv7op_.dbf
-
oracle 4883 oracle 260uW REG 253,2 94380032 2867205 /oradata/APR/datafile/o1_mf_undotbs1_chzbv7pc_.dbf
-
oracle 4883 oracle 261uW REG 253,2 2629312512 2867206 /oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf (deleted)
-
oracle 4883 oracle 262uW REG 253,2 30416896 2867213 /oradata/APR/datafile/o1_mf_temp_chzbynjn_.tmp
-
oracle 4883 oracle 263uW REG 253,2 1073750016 2867214 /oradata/APR/datafile/o1_mf_temp_chzg2zy8_.tmp
- [root@apr ~]#
注意:cp后user01.dbf有可能是目录,真正的文件在改目录下。移动重命名即可。
点击(此处)折叠或打开
-
$ mkdir /oradata/neworadata
- [oracle@apr ~]$ cp /proc/4883/fd/261 /oradata/neworadata/users01.dbf
注意:在offline期间可能Oracle进程被自动强制关闭,此时需重新将Oracle启动到mount状态。
点击(此处)折叠或打开
-
alter database datafile '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf' offline;
-
-
alter database rename file '/oradata/APR/datafile/o1_mf_users_chzbv7qk_.dbf' to '/oradata/neworadata/users01.dbf';
-
-
SQL> recover datafile '/oradata/neworadata/users01.dbf';
-
Media recovery complete.
-
SQL> alter database datafile '/oradata/neworadata/users01.dbf' online;
-
-
Database altered.
-
-
SQL> alter database open;
-
- Database altered.