暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

操作系统删除数据文件怎么恢复 ?

原创 大柏树 2022-11-08
525

今天在看《Oracle性能优化与诊断案例精选》的时候,发现书中一个案例还真有可能会发生,自己模拟一下。

模拟场景:

单实例数据库意外删除数据文件,但是数据库还是open状态,怎么恢复 ?

环境:

操作系统:CentOS Linux release 7.9.2009 (Core)
数据库:Oracle 11.2.0.4.0

模拟步骤:

1.在数据库open的时候,直接删除user表空间的数据文件

SQL> select name from v$datafile; NAME --------------------------------------------------------------------------- /data/app/oracle/oradata/orcl/system01.dbf /data/app/oracle/oradata/orcl/sysaux01.dbf /data/app/oracle/oradata/orcl/testtbs.dbf /data/app/oracle/oradata/orcl/users01.dbf /data/app/oracle/oradata/orcl/example01.dbf /data/app/oracle/oradata/orcl/undo2.dbf 6 rows selected [root@single fd]# ll /data/app/oracle/oradata/orcl/users01.dbf -rw-r----- 1 oracle oinstall 39329792 Nov 7 13:13 /data/app/oracle/oradata/orcl/users01.dbf [root@single fd]# rm -rf /data/app/oracle/oradata/orcl/users01.dbf [root@single fd]# ll /data/app/oracle/oradata/orcl/users01.dbf ls: cannot access /data/app/oracle/oradata/orcl/users01.dbf: No such file or directory [root@single fd]#

2.尝试在user表空间中创建表

SQL> create table scott.test2 tablespace users as select * from dba_objects; create table scott.test2 tablespace users as select * from dba_objects * ERROR at line 1: ORA-01116: error in opening database file 4 ORA-01110: data file 4: '/data/app/oracle/oradata/orcl/users01.dbf' ORA-27041: unable to open file Linux-x86_64 Error: 2: No such file or directory Additional information: 3 SQL> alert日志也报错: Errors in file /data/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_m000_21835.trc: ORA-01116: error in opening database file 4 ORA-01110: data file 4: '/data/app/oracle/oradata/orcl/users01.dbf' ORA-27041: unable to open file Linux-x86_64 Error: 2: No such file or directory Additional information: 3 Tue Nov 08 13:42:05 2022 Checker run found 1 new persistent data failures

3.检查dbwr进程的PID

[root@single fd]# ps -ef | grep dbw0 | grep -v grep oracle 127740 1 0 07:41 ? 00:00:18 ora_dbw0_orcl [root@single fd]#

4.dbwr进程会打开所有数据文件的句柄。在proc目录可以查到,目录名是进程PID。fd表示文件描述符。

[root@single fd]# cd /proc/127740/fd [root@single fd]# ls -l total 0 lr-x------ 1 oracle oinstall 64 Nov 8 13:28 0 -> /dev/null l-wx------ 1 oracle oinstall 64 Nov 8 13:28 1 -> /dev/null l-wx------ 1 oracle oinstall 64 Nov 8 13:28 10 -> /data/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log lr-x------ 1 oracle oinstall 64 Nov 8 13:28 11 -> /data/app/oracle/product/11.1.0/dbhome_1/rdbms/mesg/oraus.msb l-wx------ 1 oracle oinstall 64 Nov 8 13:28 2 -> /dev/null lrwx------ 1 oracle oinstall 64 Nov 8 13:28 256 -> /data/app/oracle/oradata/orcl/control01.ctl lrwx------ 1 oracle oinstall 64 Nov 8 13:28 257 -> /data/app/oracle/fast_recovery_area/orcl/control02.ctl lrwx------ 1 oracle oinstall 64 Nov 8 13:28 258 -> /data/app/oracle/oradata/orcl/system01.dbf lrwx------ 1 oracle oinstall 64 Nov 8 13:28 259 -> /data/app/oracle/oradata/orcl/sysaux01.dbf lrwx------ 1 oracle oinstall 64 Nov 8 13:28 260 -> /data/app/oracle/oradata/orcl/testtbs.dbf **lrwx------ 1 oracle oinstall 64 Nov 8 13:28 261 -> /data/app/oracle/oradata/orcl/users01.dbf (deleted)** lrwx------ 1 oracle oinstall 64 Nov 8 13:28 262 -> /data/app/oracle/oradata/orcl/example01.dbf lrwx------ 1 oracle oinstall 64 Nov 8 13:28 263 -> /data/app/oracle/oradata/orcl/undo2.dbf lrwx------ 1 oracle oinstall 64 Nov 8 13:28 264 -> /data/app/oracle/oradata/orcl/temp01.dbf lr-x------ 1 oracle oinstall 64 Nov 8 13:28 3 -> /dev/null lr-x------ 1 oracle oinstall 64 Nov 8 13:28 4 -> /dev/null lr-x------ 1 oracle oinstall 64 Nov 8 13:28 5 -> /data/app/oracle/product/11.1.0/dbhome_1/rdbms/mesg/oraus.msb lr-x------ 1 oracle oinstall 64 Nov 8 13:28 6 -> /proc/127740/fd lr-x------ 1 oracle oinstall 64 Nov 8 13:28 7 -> /dev/zero lrwx------ 1 oracle oinstall 64 Nov 8 13:28 8 -> /data/app/oracle/product/11.1.0/dbhome_1/dbs/hc_orcl.dat lrwx------ 1 oracle oinstall 64 Nov 8 13:28 9 -> /data/app/oracle/product/11.1.0/dbhome_1/dbs/lkORCL [root@single fd]#

可以看到,被删除的文件后面有标记为deleted

5.直接cp该句柄文件名回原来位置

[oraclet@single fd]# cp 261 /data/app/oracle/oradata/orcl/users01.dbf [oracle@single fd]# ll /data/app/oracle/oradata/orcl/users01.dbf -rw-r----- 1 oracle oinstall 39329792 Nov 8 13:57 /data/app/oracle/oradata/orcl/users01.dbf

6.进行数据文件recover

SQL> col name for a60 SQL> select file#,name from v$datafile; FILE# NAME ---------- ------------------------------------------------------------ 1 /data/app/oracle/oradata/orcl/system01.dbf 2 /data/app/oracle/oradata/orcl/sysaux01.dbf 3 /data/app/oracle/oradata/orcl/testtbs.dbf 4 /data/app/oracle/oradata/orcl/users01.dbf 5 /data/app/oracle/oradata/orcl/example01.dbf 6 /data/app/oracle/oradata/orcl/undo2.dbf 6 rows selected SQL> alter database datafile 4 offline; Database altered. SQL> recover datafile 4; Media recovery complete. SQL> alter database datafile 4 online; Database altered. SQL>

7.原理

在LINUX操作系统中,如果文件从操作系统级别被rm掉,之前打开改文件的进程仍然持有相应的文件句柄。但是要注意的是,此时如果关闭数据库,则该句柄会消失,那么除了扫描磁盘进行文件恢复之外就没有其他办法了。因此在数据库出现问题的时候,如果不确认情况的复杂程度,千万不要随便关闭数据库。重启数据库往往没有任何意义,甚至可能是致命的。

最后修改时间:2022-11-08 15:10:38
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论