lsof恢复oracle误删除文件例子

[i=s] 本帖最后由 java3344520 于 2012-9-20 16:20 编辑

大家讨论下,看看还有什么误删的恢复例子,这个系统级别的恢复要求进程没有结束,如果结束了就找不到相应的信息了。
8lsof恢复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.csdn.net/java3344520/article/details/8000617


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

转载于:http://blog.itpub.net/7765728/viewspace-748680/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值