今天在看《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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




