ITPub博客

首页 > 数据库 > Oracle > 基于文件描述符的恢复

基于文件描述符的恢复

原创 Oracle 作者:静以致远√团团 时间:2014-07-08 17:38:45 0 删除 编辑

基于文件描述符的恢复

    在nuix当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录条目。该文件占用的存储空间并不会被其他应用程序所覆盖,通过df命令查看,剩余空间没有发生改变。因此,切记操作系统中误删文件,不要急着关闭应用程序,此时根据文件描述符很可以将误删的文件恢复至原来位置。

 部分数据文件丢失的恢复:

查看一下数据库的数据文件路径

SQL> select FILE#,NAME,STATUS from v$datafile;

 

     FILE# NAME                                            STATUS

---------- ----------------------------------------------- -------

         1 /u01/app/oracle/oradata/orcl_dup/system01.dbf   SYSTEM

         3 /u01/app/oracle/oradata/orcl_dup/sysaux01.dbf   ONLINE

         4 /u01/app/oracle/oradata/orcl_dup/users01.dbf    ONLINE

         5 /u01/app/oracle/oradata/orcl_dup/example01.dbf  ONLINE

         6 /u01/app/oracle/oradata/orcl_dup/tts01.dbf      ONLINE

         7 /u01/app/oracle/oradata/orcl_dup/tts02.dbf      ONLINE

         8 /u01/app/oracle/oradata/orcl_dup/undotbs001.dbf ONLINE

 

模拟损坏,删除user01.dbf数据文件

SQL> !rm -rf /u01/app/oracle/oradata/orcl_dup/users01.dbf

用scott登入用户测试:(该数据库中scott用户默认表空间是users)

SQL> conn scott/oracle

Connected.

SQL> select username,default_tablespace from user_users;

 

USERNAME                       DEFAULT_TABLESPACE

------------------------------ ------------------------------

SCOTT                          USERS

 

 

SQL> create table test_user01 as select * from dept;

create table test_user01 as select * from dept

                                          *

ERROR at line 1:

ORA-01116: error in opening database file 4

ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl_dup/users01.dbf'

ORA-27041: unable to open file

Linux Error: 2: No such file or directory

Additional information: 3

 

此时不要关闭数据库,操作系统查找lgwr进程:

[root@node1 rman_dest]# ps -ef|grep lgwr|grep -v grep

oracle    4675     1  0 10:24 ?        00:00:00 ora_lgwr_orcl_dup

 

[root@node1 rman_dest]# lsof -a -p 4675|grep deleted

根据进程号,列出4675进程打开的文件

oracle  4675 oracle    7u   REG  253,0         0  820408 /u01/app/oracle/10.2.0/db_1/dbs/lkinstorcl_dup (deleted)

oracle  4675 oracle   24u   REG  253,0 191373312  688599 /u01/app/oracle/oradata/orcl_dup/users01.dbf (deleted)

 

[root@node1 rman_dest]# cd /proc/4675/fd/

复制文件描述符,恢复数据文件

[root@node1 fd]# cp 24 /u01/app/oracle/oradata/orcl_dup/users01.dbf

[root@node1 fd]# cd /u01/app/oracle/oradata/orcl_dup/

 

修改一下被恢复文件的权限和用户组

[root@node1 orcl_dup]# ll users01.dbf

-rw-r----- 1 root   root     191373312 Jul  8 15:53 users01.dbf

 

[root@node1 orcl_dup]# chown oracle:oinstall users01.dbf 

 

[root@node1 orcl_dup]# ll users01.dbf 

-rw-r----- 1 oracle oinstall 191373312 Jul  8 15:53 users01.dbf

 

登入数据库进行恢复:

SQL> conn / as sysdba

Connected.

SQL> alter database datafile 4 offline;

 

Database altered.

 

SQL> recover datafile 4;

Media recovery complete.

SQL> alter database datafile 4 online;

 

Database altered.

 

恢复完成,用scott用户进行测试

SQL> conn scott/oracle

Connected.

SQL> create table test_user01 as select * from dept;

 

Table created.

 

SQL> commit;

Commit complete.

所有数据文件都丢失:

如若system表空间中的数据文件丢失,需关闭数据库进行恢复,为安全起见,再做该测试前请做有效的数据库完全备份,本次测试将控制文件和REDO日志一并删除,不影响测试结果。

模拟损坏

[root@node1 ~]# rm -rf  /u01/app/oracle/oradata/orcl_dup/*

 

SQL> select FILE#,NAME,STATUS from v$datafile;

 

     FILE# NAME                                            STATUS

---------- ----------------------------------------------- -------

         1 /u01/app/oracle/oradata/orcl_dup/system01.dbf   SYSTEM

         3 /u01/app/oracle/oradata/orcl_dup/sysaux01.dbf   ONLINE

         4 /u01/app/oracle/oradata/orcl_dup/users01.dbf    ONLINE

         5 /u01/app/oracle/oradata/orcl_dup/example01.dbf  ONLINE

         6 /u01/app/oracle/oradata/orcl_dup/tts01.dbf      ONLINE

         7 /u01/app/oracle/oradata/orcl_dup/tts02.dbf      ONLINE

         8 /u01/app/oracle/oradata/orcl_dup/undotbs001.dbf ONLINE

 

7 rows selected.

 

查看lgwr进程号

[oracle@node1 ~]$ ps -ef | grep lgwr | grep -v grep

oracle    5843     1  0 16:54 ?        00:00:00 ora_lgwr_orcl_dup

 

根据进程号找到相应的文件描述符,拷贝恢复

[root@node1 ~]# lsof  -a -p 5843 | grep deleted

oracle  5843 oracle    7u   REG  253,0         0  820408 /u01/app/oracle/10.2.0/db_1/dbs/lkinstorcl_dup (deleted)

oracle  5843 oracle   16u   REG  253,0   7389184  688483 /u01/app/oracle/oradata/orcl_dup/control01.ctl (deleted)

oracle  5843 oracle   17u   REG  253,0   7389184  688484 /u01/app/oracle/oradata/orcl_dup/control02.ctl (deleted)

oracle  5843 oracle   18u   REG  253,0   7389184  688485 /u01/app/oracle/oradata/orcl_dup/control03.ctl (deleted)

oracle  5843 oracle   19u   REG  253,0  20972032  688486 /u01/app/oracle/oradata/orcl_dup/redo01.log (deleted)

oracle  5843 oracle   20u   REG  253,0  20972032  688488 /u01/app/oracle/oradata/orcl_dup/redo03.log (deleted)

oracle  5843 oracle   21u   REG  253,0  20972032  688487 /u01/app/oracle/oradata/orcl_dup/redo02.log (deleted)

oracle  5843 oracle   22u   REG  253,0 524296192  688489 /u01/app/oracle/oradata/orcl_dup/system01.dbf (deleted)

oracle  5843 oracle   23u   REG  253,0 346038272  688490 /u01/app/oracle/oradata/orcl_dup/sysaux01.dbf (deleted)

oracle  5843 oracle   24u   REG  253,0 104865792  688491 /u01/app/oracle/oradata/orcl_dup/example01.dbf (deleted)

oracle  5843 oracle   25u   REG  253,0  20979712  688471 /u01/app/oracle/oradata/orcl_dup/tts01.dbf (deleted)

oracle  5843 oracle   26u   REG  253,0  20979712  688492 /u01/app/oracle/oradata/orcl_dup/tts02.dbf (deleted)

oracle  5843 oracle   27u   REG  253,0 104865792  688493 /u01/app/oracle/oradata/orcl_dup/undotbs001.dbf (deleted)

 

 

[root@node1 ~]# cd /proc/5843/fd/

[root@node1 fd]# ls

0  10  12  14  16  18  2   21  23  25  27  3  5  7  9

1  11  13  15  17  19  20  22  24  26  28  4  6  8

 

[root@node1 fd]# cp 16 /u01/app/oracle/oradata/orcl_dup/control01.ctl

[root@node1 fd]# cp 17 /u01/app/oracle/oradata/orcl_dup/control02.ctl

[root@node1 fd]# cp 18 /u01/app/oracle/oradata/orcl_dup/control03.ctl

[root@node1 fd]# cp 19 /u01/app/oracle/oradata/orcl_dup/redo01.log

^[[A[root@node1 fcp 20 /u01/app/oracle/oradata/orcl_dup/redo03.log

[root@node1 fd]# cp 20 /u01/app/oracle/oradata/orcl_dup/redo03.log

[root@node1 fd]# cp 21 /u01/app/oracle/oradata/orcl_dup/redo02.log

[root@node1 fd]# cp 22 /u01/app/oracle/oradata/orcl_dup/system01.dbf

[root@node1 fd]# cp 23 /u01/app/oracle/oradata/orcl_dup/sysaux01.dbf

[root@node1 fd]# cp 24 /u01/app/oracle/oradata/orcl_dup/example01.dbf

[root@node1 fd]# cp 25 /u01/app/oracle/oradata/orcl_dup/tts01.dbf

[root@node1 fd]# cp 26 /u01/app/oracle/oradata/orcl_dup/tts02.dbf

[root@node1 fd]# cp 27 /u01/app/oracle/oradata/orcl_dup/undotbs001.dbf

 

注意观察,发现user01.dbf并未找到,因为当前测试数据库并未有用户读写数据,user表空间没有活跃的事物,即使数据文件user01.dbf被删除,数据库并未开始读写数据,所以user01.dbf的数据文件并不在lgwr进程进程锁定的文件描述符内,需查找dbw进程

 

[root@node1 fd]# ps -ef | grep dbw | grep -v grep

root      5981  4616  0 17:04 pts/1    00:00:00 grep dbw

 

[root@node1 fd]# lsof -a -p 5841| grep deleted

oracle  5841 oracle    7u   REG  253,0         0  820408 /u01/app/oracle/10.2.0/db_1/dbs/lkinstorcl_dup (deleted)

oracle  5841 oracle   16u   REG  253,0   7389184  688483 /u01/app/oracle/oradata/orcl_dup/control01.ctl (deleted)

oracle  5841 oracle   17u   REG  253,0   7389184  688484 /u01/app/oracle/oradata/orcl_dup/control02.ctl (deleted)

oracle  5841 oracle   18u   REG  253,0   7389184  688485 /u01/app/oracle/oradata/orcl_dup/control03.ctl (deleted)

oracle  5841 oracle   19uW  REG  253,0 524296192  688489 /u01/app/oracle/oradata/orcl_dup/system01.dbf (deleted)

oracle  5841 oracle   20uW  REG  253,0 346038272  688490 /u01/app/oracle/oradata/orcl_dup/sysaux01.dbf (deleted)

oracle  5841 oracle   21uW  REG  253,0 104865792  688491 /u01/app/oracle/oradata/orcl_dup/example01.dbf (deleted)

oracle  5841 oracle   22uW  REG  253,0  20979712  688471 /u01/app/oracle/oradata/orcl_dup/tts01.dbf (deleted)

oracle  5841 oracle   23uW  REG  253,0  20979712  688492 /u01/app/oracle/oradata/orcl_dup/tts02.dbf (deleted)

oracle  5841 oracle   24uW  REG  253,0 104865792  688493 /u01/app/oracle/oradata/orcl_dup/undotbs001.dbf (deleted)

oracle  5841 oracle   25uW  REG  253,0  22028288  688514 /u01/app/oracle/oradata/orcl_dup/temp01.dbf (deleted)

oracle  5841 oracle   27uW  REG  253,0 191373312  688500 /u01/app/oracle/oradata/orcl_dup/users01.dbf (deleted)

[root@node1 fd]# lsof -a -p 5841| grep deleted

[root@node1 fd]# cd /proc/5841/fd/

[root@node1 fd]# ls

0  10  12  14  16  18  2   21  23  25  27  4  6  8

1  11  13  15  17  19  20  22  24  26  3   5  7  9

 

[root@node1 fd]# cp 27 /u01/app/oracle/oradata/orcl_dup/users01.dbf

 

[root@node1 fd]# cd /u01/app/oracle/oradata/orcl_dup/

 

修改相应的用户组和权限

[root@node1 orcl_dup]# ll

total 1367108

-rw-r----- 1 root root   7389184 Jul  8 16:57 control01.ctl

-rw-r----- 1 root root   7389184 Jul  8 16:58 control02.ctl

-rw-r----- 1 root root   7389184 Jul  8 16:58 control03.ctl

-rw-r----- 1 root root 104865792 Jul  8 17:02 example01.dbf

-rw-r----- 1 root root  20972032 Jul  8 16:58 redo01.log

-rw-r----- 1 root root  20972032 Jul  8 16:59 redo02.log

-rw-r----- 1 root root  20972032 Jul  8 16:59 redo03.log

-rw-r----- 1 root root 346038272 Jul  8 17:02 sysaux01.dbf

-rw-r----- 1 root root 524296192 Jul  8 17:00 system01.dbf

-rw-r----- 1 root root  20979712 Jul  8 17:02 tts01.dbf

-rw-r----- 1 root root  20979712 Jul  8 17:02 tts02.dbf

-rw-r----- 1 root root 104865792 Jul  8 17:03 undotbs001.dbf

-rw-r----- 1 root root 191373312 Jul  8 17:06 users01.dbf

 

[root@node1 orcl_dup]# chown oracle:oinstall *

 

[root@node1 orcl_dup]# ll

total 1367108

-rw-r----- 1 oracle oinstall   7389184 Jul  8 16:57 control01.ctl

-rw-r----- 1 oracle oinstall   7389184 Jul  8 16:58 control02.ctl

-rw-r----- 1 oracle oinstall   7389184 Jul  8 16:58 control03.ctl

-rw-r----- 1 oracle oinstall 104865792 Jul  8 17:02 example01.dbf

-rw-r----- 1 oracle oinstall  20972032 Jul  8 16:58 redo01.log

-rw-r----- 1 oracle oinstall  20972032 Jul  8 16:59 redo02.log

-rw-r----- 1 oracle oinstall  20972032 Jul  8 16:59 redo03.log

-rw-r----- 1 oracle oinstall 346038272 Jul  8 17:02 sysaux01.dbf

-rw-r----- 1 oracle oinstall 524296192 Jul  8 17:00 system01.dbf

-rw-r----- 1 oracle oinstall  20979712 Jul  8 17:02 tts01.dbf

-rw-r----- 1 oracle oinstall  20979712 Jul  8 17:02 tts02.dbf

-rw-r----- 1 oracle oinstall 104865792 Jul  8 17:03 undotbs001.dbf

-rw-r----- 1 oracle oinstall 191373312 Jul  8 17:06 users01.dbf

 

重启数据库(重启前一定确定自己数据库中被删除的文件已经全部被复制至原路径下,复制数据库一旦关闭,释放锁定状态,被删除的文件将不再存在,只能通过其他方式进行恢复数据库)

SQL> shutdown abort;

ORACLE instance shut down.

 

SQL> startup

ORACLE instance started.

 

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              71305460 bytes

Database Buffers           92274688 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

 

Scott用户测试

SQL> conn scott/oracle

Connected.

 

SQL> drop table test_user01 purge;

 

Table dropped.

 

SQL> commit;

 

Commit complete.

 

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

上一篇: 为PHP配置GD库
请登录后发表评论 登录
全部评论
每个人都有梦想,去实现吧!

注册时间:2013-11-14

  • 博文量
    164
  • 访问量
    2103521