UNIX/LINUX平台ORACLE误删除数据文件恢复测试
Feb212012
年前公司同事恢复了一个客户在HP UNIX平台误删除数据文件的案例,由于年底较忙,今天有时间做了个模拟测试。
SQL> select name from v$datafile; NAME --------------------------------------------- /u01/app/oracle/oradata/stream/system01.dbf /u01/app/oracle/oradata/stream/undotbs01.dbf /u01/app/oracle/oradata/stream/sysaux01.dbf /u01/app/oracle/oradata/stream/user01.dbf /u01/app/oracle/oradata/stream/stream01.dbf
在操作系统上删除USER01.DBF文件。
SQL> !rm -rf /u01/app/oracle/oradata/stream/user01.dbf
此时如果查询这个文件内的小表,还是可以查询,但是如果在这个数据文件对应的表空间建表就会报错。
SQL> conn scott/tiger Connected. SQL> select count(*) from emp; COUNT(*) ---------- 14 SQL> create table test as select * from emp; create table test as select * from emp * ERROR at line 1: ORA-01116: error in opening database file 4 ORA-01110: data file 4: '/u01/app/oracle/oradata/stream/user01.dbf' ORA-27041: unable to open file Linux Error: 2: No such file or directory Additional information: 3
此时不要关闭数据库实例,否则这种方法将无法恢复数据库,查看DBWN在操作系统的进程号。
[oracle@dbserver1 stream]$ ps -ef | grep dbw oracle 2261 1 0 14:57 ? 00:00:11 ora_dbw0_stream
进入2261进程的目录,查看删除操作对应的信息,由于数据文件被DBWN进程使用,而且DBWN进程一直在启动状态,此时在DBWN进程对应的目录下面可以查看到被删除的数据文件信息,如果DBWN进程关闭,这种方式就无法查到。
[oracle@dbserver1 stream]$ cd /proc/2261/fd [oracle@dbserver1 fd]$ ls -lrt 总用量 0 l-wx------. 1 oracle oinstall 64 2月 14 17:10 5 -> /u01/app/oracle/admin /stream/udump/stream_ora_2253.trc lrwx------. 1 oracle oinstall 64 2月 14 17:10 9 -> /u01/app/oracle/product /10.2.0/db_1/dbs/hc_stream.dat l-wx------. 1 oracle oinstall 64 2月 14 17:10 8 -> /u01/app/oracle/admin /stream/bdump/alert_stream.log lrwx------. 1 oracle oinstall 64 2月 14 17:10 7 -> /u01/app/oracle/product /10.2.0/db_1/dbs/lkinststream (deleted) l-wx------. 1 oracle oinstall 64 2月 14 17:10 6 -> /u01/app/oracle/admin /stream/bdump/alert_stream.log lr-x------. 1 oracle oinstall 64 2月 14 17:10 25 - > /u01/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb lrwx------. 1 oracle oinstall 64 2月 14 17:10 24 -> /u01/app/oracle/oradata /stream/temp01.dbf lrwx------. 1 oracle oinstall 64 2月 14 17:10 23 -> /u01/app/oracle/oradata /stream/stream01.dbf lrwx------. 1 oracle oinstall 64 2月 14 17:10 22 -> /u01/app/oracle/oradata /stream/user01.dbf (deleted) ...... lr-x------. 1 oracle oinstall 64 2月 14 17:10 12 -> /dev/zero lr-x------. 1 oracle oinstall 64 2月 14 17:10 11 -> /dev/zero lrwx------. 1 oracle oinstall 64 2月 14 17:10 10 -> /u01/app/oracle/admin/ stream/adump/ora_2253.aud
此时可以直接将被删除的数据文件拷贝回去,如下:
[oracle@dbserver1 fd]$ cp 22 /u01/app/oracle/oradata/stream/user01.dbf
关闭数据库,重启后提示需要对误删除的数据文件做恢复操作。
SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 285212672 bytes Fixed Size 1218992 bytes Variable Size 100664912 bytes Database Buffers 180355072 bytes Redo Buffers 2973696 bytes Database mounted. ORA-01113: file 4 needs media recovery ORA-01110: data file 4: '/u01/app/oracle/oradata/stream/user01.dbf'
对误删除的数据文件做恢复后,数据库可以打开。
SQL> recover database; Media recovery complete. SQL> alter database open; Database altered.
在数据库实例没有关闭的情况下,误删除数据文件可以通过这种方法很简单的恢复回来。