大家讨论下,看看还有什么误删的恢复例子,这个系统级别的恢复要求进程没有结束,如果结束了就找不到相应的信息了。
8、lsof恢复oracle误删除文件例子 8.1 查看ORACLE运行的进程
[oracle@xml-ora1 ~]$ uname -a
Linux xml-ora1 2.6.18-194.el5 #1 SMP TueMar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
[oracle@xml-ora1 ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.5(Tikanga)
[oracle@xml-ora1 ~]$ ps -ef | grep ora_
oracle 23923 23896 0 09:43 pts/3 00:00:00 grep ora_
oracle 25342 1 0 Aug06 ? 00:00:52 ora_pmon_xmlgis
oracle 25344 1 0 Aug06 ? 00:00:00 ora_psp0_xmlgis
oracle 25346 1 0 Aug06 ? 00:00:00 ora_mman_xmlgis
oracle 25348 1 0Aug06 ? 00:00:13 ora_dbw0_xmlgis
8.2 创建测试环境创建表空间、表、数据以及数据文件:
SQL> create tablespace test_del datafile '/u01/app/oracle/oradata/xmlgis/test_del.dbf'size 50m;
Tablespace created.
SQL> select file_name from dba_data_files where file_name like'%del%';
FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/xmlgis/test_del.dbf
SQL> select name from v$datafile where name like '%del%';
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/xmlgis/test_del.dbf
SQL> create table test_del tablespace test_del as select * from dba_objects;
Table created.
SQL> commit;
Commit complete.
SQL> alter system checkpoint;
System altered.
SQL> select count(*) from test_del;
COUNT(*)
----------
51459
SQL>select OWNER,OBJECT_NAME from test_del WHERE OWNER<>'SYS' AND ROWNUM<3;
OWNER OBJECT_NAME
--------------------------------------------------------------------------------
PUBLIC DUAL
PUBLIC SYSTEM_PRIVILEGE_MAP
[oracle@xml-ora1 ~]$ strings/u01/app/oracle/oradata/xmlgis/test_del.dbf | grep"SYSTEM_PRIVILEGE_MAP"
SYSTEM_PRIVILEGE_MAP
I_SYSTEM_PRIVILEGE_MAP
SYSTEM_PRIVILEGE_MAP
8.3 查看dbwr0打开的数据文件[oracle@xml-ora1 ~]$ lsof -a -p 25348 -d ^txt | egrep"COMMAND|dbf"
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
oracle 25348 oracle 18uW REG 8,8 566239232 105186656 /u01/app/oracle/oradata/xmlgis/system01.dbf
…..省略其它文件…..
oracle 25348 oracle 48uW REG 8,8 52436992 21364739 /u01/app/oracle/oradata/xmlgis/test_del.dbf
8.4 删除test_del.dbf数据文件SQL> !
[oracle@xml-ora1 ~]$ ll/u01/app/oracle/oradata/xmlgis/test_del.dbf
-rw-r----- 1 oracle oinstall 52436992 Sep20 14:17 /u01/app/oracle/oradata/xmlgis/test_del.dbf
[oracle@xml-ora1 ~]$ rm/u01/app/oracle/oradata/xmlgis/test_del.dbf
[oracle@xml-ora1 ~]$ ll/u01/app/oracle/oradata/xmlgis/test_del.dbf
ls:/u01/app/oracle/oradata/xmlgis/test_del.dbf: No such file or directory
[oracle@xml-ora1 ~]$ exit
Exit
SQL> select file_name from dba_data_files where file_name like'%del%';
FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/xmlgis/test_del.dbf
SQL> select name from v$datafile where name like '%del%';
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/xmlgis/test_del.dbf
SQL> insert into test_del select * from dba_objects;
51459 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from test_del;
COUNT(*)
----------
102918
SQL> alter system checkpoint;
System altered.
SQL> create table test_del_new tablespace test_del as select * from dba_objects;
Table created.
操作正常,说明数据文件虽然被删除,但是可以继续写入,说明可以恢复。但是注意,不能关掉DBWR0进行,重新启动后将丢失文件描述符,则无法恢复。
8.5 删除文件描述符查找[oracle@xml-ora1 ~]$ lsof | grep test_del
oracle 25348 oracle 48uW REG 8,8 52436992 21364739 /u01/app/oracle/oradata/xmlgis/test_del.dbf (deleted)
oracle 25350 oracle 30u REG 8,8 52436992 21364739 /u01/app/oracle/oradata/xmlgis/test_del.dbf (deleted)
oracle 25356 oracle 45u REG 8,8 52436992 21364739 /u01/app/oracle/oradata/xmlgis/test_del.dbf (deleted)
oracle 25358 oracle 44u REG 8,8 52436992 21364739 /u01/app/oracle/oradata/xmlgis/test_del.dbf (deleted)
oracle 32244 oracle 15u REG 8,8 52436992 21364739 /u01/app/oracle/oradata/xmlgis/test_del.dbf (deleted)
oracle 32244 oracle 19u REG 8,8 52436992 21364739 /u01/app/oracle/oradata/xmlgis/test_del.dbf (deleted)
注意:/u01/app/oracle/oradata/xmlgis/test_delete.dbf(deleted)说明该数据库文件被删除了,但是却出现了这么多是描述符号。仔细看了下其中的信息,发现PID为25348的才是DBWR0进行写入的文件,同时48uW也说明了是原来删除的文件,那其它信息呢,根据PID去查找进程。得到如下信息
[oracle@xml-ora1 ~]$ ps -ef | egrep"25348|25350|25356|25358|32244" | grep -v egrep
oracle 25348 1 0Aug06 ? 00:00:13 ora_dbw0_xmlgis
oracle 25350 1 0 Aug06 ? 00:00:22 ora_dbw1_xmlgis
oracle 25356 1 0 Aug06 ? 00:02:29 ora_ckpt_xmlgis
oracle 25358 1 0 Aug06 ? 00:01:33 ora_smon_xmlgis
oracle 32244 32243 0 12:58 ? 00:00:03 oraclexmlgis(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
原来除了DBWR0对该进程进行读写,还包括DBWR1,CKPT,SMON以及我当前连接的session进行读写。哪个才是要恢复的文件呢?
8.6 查看/proc文件系统Cd /proc/819/fd/ 就可以得到所要查找的数据
[oracle@xml-ora1 ~]$ ll /proc/25348/fd/* | grep test_del
lrwx------ 1 oracle oinstall 64 Sep 2014:15 /proc/25348/fd/48-> /u01/app/oracle/oradata/xmlgis/test_del.dbf (deleted)
看来他们都是对同一个文件进行打开,只是返回的值不同而且,而真正打开该文件的是DBWR0,恢复该文件即可。
验证文件内容:
[oracle@xml-ora1 ~]$ strings /proc/25348/fd/48 | grep"TEST_DEL"
TEST_DEL
TEST_DEL
TEST_DEL
TEST_DEL_NEW
TEST_DEL
8.7 恢复误删除文件[oracle@xml-ora1 ~]$ cat /proc/25348/fd/48>/u01/app/oracle/oradata/xmlgis/test_del.dbf
[oracle@xml-ora1 ~]$ ll/u01/app/oracle/oradata/xmlgis/test_del.dbf
-rw-r--r-- 1 oracle oinstall 52436992 Sep20 14:45 /u01/app/oracle/oradata/xmlgis/test_del.dbf
8.8 验证文件恢复新建表在此表空间:
SQL> create table test_del_recover tablespace test_del as select * from dba_objects;
Table created.
SQL> alter system checkpoint;
System altered.
SQL> !
[oracle@xml-ora1 ~]$ ll/u01/app/oracle/oradata/xmlgis/test_del.dbf
-rw-r--r-- 1 oracle oinstall 52436992 Sep20 14:45 /u01/app/oracle/oradata/xmlgis/test_del.dbf
[oracle@xml-ora1 ~]$ strings /proc/25348/fd/48 | grep"TEST_DEL"
TEST_DEL
TEST_DEL
TEST_DEL
TEST_DEL_NEW
TEST_DEL
TEST_DEL_RECOVER
TEST_DEL_NEW
TEST_DEL
附:全文链接:http://blog.youkuaiyun.com/java3344520/article/details/8000617
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7765728/viewspace-748680/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7765728/viewspace-748680/