ITPub博客

首页 > Linux操作系统 > Linux操作系统 > lsof恢复oracle误删除文件

lsof恢复oracle误删除文件

原创 Linux操作系统 作者:jst143 时间:2013-02-28 17:47:21 0 删除 编辑
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.csdn.net/java3344520/article/details/8000617

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23577591/viewspace-754985/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-05-06

  • 博文量
    109
  • 访问量
    137565