基于文件描述符的恢复(转载)

转载自http://blog.itpub.net/29320885/viewspace-1212801/
基于文件描述符的恢复
原创 Oracle 作者:静以致远√团团 时间:2014-07-08 17:38:45 6176 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/,如需转载,请注明出处,否则将追究法律责任。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值