青年数据库学习互助会

惊心动魄的数据拯救:当Oracle 11g 遇上误删除危机

概述:

1、删除普通数据文件后,只要库没有关闭或宕机,可以找回。

2、如果删除了system数据文件这种导致宕库的数据文件,进程已经消失,无法找回

3、不一定删除了数据文件,alert日志立刻就会报错,告警日志暴露有时间滞后性。


模拟故障

1、模拟删除了一个表空间的数据文件

rm -rf /oracle/app/oracle/oradata/aloneorcl/test1.dbf 

删除数据文件后,立刻做alter system switch logfile和alter system checkpoint;alert中没有告警。

过了一会alert日志才会有告警,告警识别出来存在一定的滞后性

Errors in file /oracle/app/oracle/diag/rdbms/aloneorcl/orcl/trace/orcl_m000_3208.trc:ORA-01116: error in opening database file 7ORA-01110: data file 7: '/oracle/app/oracle/oradata/aloneorcl/test1.dbf'ORA-27041: unable to open fileLinux-x86_64 Error: 2: No such file or directoryAdditional information: 3

查看dba_data_files视图

select file_name,tablespace_name,status from dba_data_files;
Image
select * from v$datafile;

也不能看到数据文件需要recover,状态均为正常。

Image
select * from v$datafile_header;

查看数据文件头,是有报错的,而且相关信息信息无法识别。

Image


恢复过程

Image

1、找到dbwr进程Pid

[oracle@dg-alone:/home/oracle]$ps -ef | grep dbw | grep -v greporacle   2975     1  0 08:32 ?       00:00:00 ora_dbw0_orcl[oracle@dg-alone:/home/oracle]$

2、找到文件句柄

[oracle@dg-alone:/home/oracle]$ls /proc/2975/fd0  1  10  11  2  256  257  258  259  260  261  262  263  264  265  266  3  4  5  6  7  8  9[oracle@dg-alone:/home/oracle]$

3、查看相关信息,可以看到,被删除的数据文件最后有(deleted)字样

[oracle@dg-alone:/home/oracle]$ls -l /proc/2975/fd/ | grep oraclelr-x------. 1 oracle oinstall 64 Dec  1 09:00 0 -> /dev/nulll-wx------. 1 oracle oinstall 64 Dec  1 09:00 1 -> /dev/nulllrwx------. 1 oracle oinstall 64 Dec  1 09:00 10 -> /oracle/app/oracle/product/11.2.0/db_1/dbs/lkALONEORCLlr-x------. 1 oracle oinstall 64 Dec  1 09:00 11 -> /oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msbl-wx------. 1 oracle oinstall 64 Dec  1 09:00 2 -> /dev/nulllrwx------. 1 oracle oinstall 64 Dec  1 09:00 256 -> /oracle/app/oracle/oradata/aloneorcl/control01.ctllrwx------. 1 oracle oinstall 64 Dec  1 09:00 257 -> /oracle/app/oracle/oradata/aloneorcl/control02.ctllrwx------. 1 oracle oinstall 64 Dec  1 09:00 258 -> /oracle/app/oracle/oradata/aloneorcl/system01.dbflrwx------. 1 oracle oinstall 64 Dec  1 09:00 259 -> /oracle/app/oracle/oradata/aloneorcl/sysaux01.dbflrwx------. 1 oracle oinstall 64 Dec  1 09:00 260 -> /oracle/app/oracle/oradata/aloneorcl/undotbs01.dbflrwx------. 1 oracle oinstall 64 Dec  1 09:00 261 -> /oracle/app/oracle/oradata/aloneorcl/users01.dbflrwx------. 1 oracle oinstall 64 Dec  1 09:00 262 -> /oracle/app/oracle/oradata/aloneorcl/undotbs02.dbflrwx------. 1 oracle oinstall 64 Dec  1 09:00 263 -> /oracle/app/oracle/oradata/aloneorcl/system02.dbflrwx------. 1 oracle oinstall 64 Dec  1 09:00 264 -> /oracle/app/oracle/oradata/aloneorcl/temp01.dbflrwx------. 1 oracle oinstall 64 Dec  1 09:00 265 -> /oracle/app/oracle/oradata/aloneorcl/test1.dbf (deleted)lrwx------. 1 oracle oinstall 64 Dec  1 09:00 266 -> /oracle/app/oracle/oradata/aloneorcl/test2.dbflr-x------. 1 oracle oinstall 64 Dec  1 09:00 3 -> /dev/nulllr-x------. 1 oracle oinstall 64 Dec  1 09:00 4 -> /dev/nulllr-x------. 1 oracle oinstall 64 Dec  1 09:00 5 -> /dev/nulllr-x------. 1 oracle oinstall 64 Dec  1 09:00 6 -> /oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msblr-x------. 1 oracle oinstall 64 Dec  1 09:00 7 -> /proc/2975/fdlr-x------. 1 oracle oinstall 64 Dec  1 09:00 8 -> /dev/zerolrwx------. 1 oracle oinstall 64 Dec  1 09:00 9 -> /oracle/app/oracle/product/11.2.0/db_1/dbs/hc_orcl.dat[oracle@dg-alone:/home/oracle]$

4、CP到数据文件目录

[oracle@dg-alone:/home/oracle]$cp /proc/2975/fd/265 /oracle/app/oracle/oradata/aloneorcl/test1.dbf

5、查看系统视图状态,没有异样,但是,往下

select file_name,tablespace_name,status from dba_data_files;
Image

6、控制文件scn一直,但是,往下

select * from v$datafile;

控制文件头scn一致,但是文件头部scn不一致,

Image

7、数据文件头信息可以识别,但是SCN不一致

select file#,status,error,recover,tablespace_name,checkpoint_change#,name from v$datafile_header;

虽然状态是Online的,但是其实数据文件头部scn是不一致的,即使做了checkpoint。

Image

8、这种情况下还没有解决问题

尝试做一致性关库,也是不行的。这块只是做个演示,正常情况不要去关库。

Image

9、继续处理,offline数据文件。

offline数据文件

SQL> alter database datafile 7 offline;Database altered.

10、recover数据文件

SQL> recover datafile 7;Media recovery complete.

11、online数据文件

SQL> alter database datafile 7 online;Database altered.

12、做完操作后,做一个alter system checkpoint操作

select file#,status,error,recover,tablespace_name,checkpoint_change#,name from v$datafile_header;
Image

可以看到数据文件头scn一致,做相关测试也正常,到此问题解决。

还有两个方法确认文件归属

一、使用BBED来找回文件

《oracle DBA手记4 数据安全警示录》书中,写过一个案例,在使用ls -l /proc/2975/fd/ | grep oracle是无法看到具体路径指向的,只能看到文件的描述符。数据库版本书中看是10g,操作系统可能是unix。类似如下,假设我是看不到了,来实际操作一下。

[oracle@dg-alone:/home/oracle]$ls -l /proc/2975/fd0  1  10  11  2  256  257  258  259  260  261  262  263  264  265  266  3  4  5  6  7  8  9

那如果看不到详细信息,如何判断是哪个数据文件,比如在删除了多个数据文件后,怎么能确定哪个数据文件,对应哪个表空间。这个时候需要使用bbed.

在ORACLE数据库中文件第一个块(头文件),有数据文件信息,通过信息和数据文件建立联系。

linux  11g 编译 安装bbed

[oracle@dg-alone:/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib]$make -f ins_rdbms.mk /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/bbedLinking BBED utility (bbed)rm -f /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/bbedgcc -o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/bbed -m64 -z noexecstack -L/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ -L/oracle/app/oracle/product/11.2.0/db_1/lib/ -L/oracle/app/oracle/product/11.2.0/db_1/lib/stubs/  /oracle/app/oracle/product/11.2.0/db_1/lib/s0main.o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ssbbded.o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/sbbdpt.o `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh  `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnnz11 -lzt11 -lztkg11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11 -lmm -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11   -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11 -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11  `cat /oracle/app/oracle/product/11.2.0/db_1/lib/sysliblist` -Wl,-rpath,/oracle/app/oracle/product/11.2.0/db_1/lib -lm    `cat /oracle/app/oracle/product/11.2.0/db_1/lib/sysliblist` -ldl -lm   -L/oracle/app/oracle/product/11.2.0/db_1/lib[oracle@dg-alone:/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib]$

bbed默认密码blockedit

这个方法就是不清楚具体对应的是哪个文件,需要挨个确认。

[oracle@dg-alone:/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib]$bbed Password: BBED: Release2.0.0.0.0 - Limited Production on Fri Dec110:25:132023Copyright (c) 1982, 2011, Oracleand/or its affiliates.  All rights reserved.************* !!! ForOracle Internal Useonly !!! ***************BBED> set filename '/proc/2975/fd/261'        FILENAME       /proc/2975/fd/261BBED> setblocksize8192BLOCKSIZE8192BBED> p  kcvfh.kcvfhrfnub4 kcvfhrfn                                @3680x00000004BBED> set filename '/proc/2975/fd/266'        FILENAME       /proc/2975/fd/266BBED> p  kcvfh.kcvfhrfnub4 kcvfhrfn                                @3680x00000008BBED> 
  • kcvfh 表示 Kernel Cache recoVery component File Header

  • p为打印,print的缩写

  • kcv 表示是 Oracle 的内核层次代码,是恢复相关的组件,具体内容就是文件头信息。Kcvfhrfn 表示相对文件号。

  • @368是文件号偏移量,9I是280,10g和11g都是368.

  • 0x00000004和0x00000008就是数据文件号,需要16进制转10进制。转完以后分别对应4和8.

确认完以后对文件进行cp,文件名通过系统视图就可以查询。

cp /proc/2975/fd/261 /oracle/app/oracle/oradata/aloneorcl/users01.dbfcp /proc/2975/fd/266 /oracle/app/oracle/oradata/aloneorcl/test2.dbf

离线数据文件

SQL> alter database datafile 4 offline;alter database datafile 8 offline;Database altered.SQL> Database altered.SQL> 

recover数据文件

SQL> recover datafile 4;Media recovery complete.SQL> recover datafile 8;Media recovery complete.

在线数据文件

SQL> alter database datafile 4 online;Database altered.SQL> alter database datafile 8 online;Database altered.

做一个检查点alter system checkpoint后查看数据文件状态,均正常。

Image
Image

二、操作系统od命令确认文件

偏移量,9I是280,10g和11g都是368.最好还是用bbed看下文件偏移量信息,参考方法一。

以当前为例,11g文件偏移量是368,所以使用od命令,加上第一个块大小,一般是8192,8192+368偏移量=8560

写法:od -j块大小+偏移量 -t d2 句柄号 | head -1

如下来看,第二列分别是7和8,其实分别对应的是数据文件号,通过下面两个图可以看到

[oracle@dg-alone:/proc/18740/fd]$od -j 8560 -t d2 264 |head -10020560     7     0     0     0     0     0     0     0[oracle@dg-alone:/proc/18740/fd]$od -j 8560 -t d2 265 |head -10020560     8     0     0     0     0     0  12347  17615

查看句柄对应的数据文件

Image
Image

11g linux 安装bbed方法

oracle 11g编译安装bbed

1、进入到目录

cd $ORACLE_HOME/rdbms/lib

2、编译,oracle 11g bbed默认缺少编译文件,编译文件可以从oracle 10g同系统架构的库中获取,或者从安装包获取。否则会报错。如下:

[oracle@dg-alone:/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib]$make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbedLinking BBED utility (bbed)rm -f /oracle/app/oracle/product/11.2.0/db_1/bin/bbedgcc -o /oracle/app/oracle/product/11.2.0/db_1/bin/bbed -m64 -z noexecstack -L/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ -L/oracle/app/oracle/product/11.2.0/db_1/lib/ -L/oracle/app/oracle/product/11.2.0/db_1/lib/stubs/  /oracle/app/oracle/product/11.2.0/db_1/lib/s0main.o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ssbbded.o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/sbbdpt.o `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh  `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnnz11 -lzt11 -lztkg11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11 -lmm -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11   -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11 -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11  `cat /oracle/app/oracle/product/11.2.0/db_1/lib/sysliblist` -Wl,-rpath,/oracle/app/oracle/product/11.2.0/db_1/lib -lm    `cat /oracle/app/oracle/product/11.2.0/db_1/lib/sysliblist` -ldl -lm   -L/oracle/app/oracle/product/11.2.0/db_1/libgcc: /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ssbbded.o: No such file or directorygcc: /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/sbbdpt.o: No such file or directorymake: *** [/oracle/app/oracle/product/11.2.0/db_1/bin/bbed] Error 1[oracle@dg-alone:/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib]$

3、获取文件方式,现有已安装的环境获取或者从安装包文件中获取。本次从安装包获取

#所需的三个文件

ssbbded.osbbdpt.obbedus.msb

4、上传解压好的oracle 10g安装包到服务器,并进入到软件安装目录

使用如下命令,期中sbbd是要查找的文件模糊名,直接在安装包里是找不到需要的文件的,需要先找到包含文件的jar包,然后解压,过程如下。

for jar in $(find . -type f -name "*.jar"|grep rdbms);dojar -tvf $jar | grep sbbd && echo $jardone

如下图,所需的三个文件在下面两个jar包里

Image

将文件复制到一个地方,用unzip解压

[root@dg-alone p6810189_10204_Linux-x86-64(1)]# cp Disk1/stage/Patches/oracle.rdbms.util/10.2.0.4.0/1/DataFiles/filegroup6.1.1.jar /root/[root@dg-alone p6810189_10204_Linux-x86-64(1)]# cp Disk1/stage/Patches/oracle.rdbms/10.2.0.4.0/1/DataFiles/filegroup44.1.1.jar /root/

将解压后的所需文件复制到指定目录如下

[root@dg-alone ~]# cp ssbbded.o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/[root@dg-alone ~]# cp sbbdpt.o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ [root@dg-alone ~]# cp bbedus.msb /oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/

授权3个文件权限

[root@dg-alone ~]# chown oracle:oinstall /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ssbbded.o [root@dg-alone ~]# chown oracle:oinstall /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/sbbdpt.o [root@dg-alone ~]# chown oracle:oinstall /oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/bbedus.msb 

编译bbed

[oracle@dg-alone:/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib]$make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbedLinking BBED utility (bbed)rm -f /oracle/app/oracle/product/11.2.0/db_1/bin/bbedgcc -o /oracle/app/oracle/product/11.2.0/db_1/bin/bbed -m64 -z noexecstack -L/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ -L/oracle/app/oracle/product/11.2.0/db_1/lib/ -L/oracle/app/oracle/product/11.2.0/db_1/lib/stubs/  /oracle/app/oracle/product/11.2.0/db_1/lib/s0main.o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/ssbbded.o /oracle/app/oracle/product/11.2.0/db_1/rdbms/lib/sbbdpt.o `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh  `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnnz11 -lzt11 -lztkg11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11 -lmm -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/app/oracle/product/11.2.0/db_1/lib/ldflags`   -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11   -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11 -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11  `cat /oracle/app/oracle/product/11.2.0/db_1/lib/sysliblist` -Wl,-rpath,/oracle/app/oracle/product/11.2.0/db_1/lib -lm    `cat /oracle/app/oracle/product/11.2.0/db_1/lib/sysliblist` -ldl -lm   -L/oracle/app/oracle/product/11.2.0/db_1/lib[oracle@dg-alone:/oracle/app/oracle/product/11.2.0/db_1/rdbms/lib]$

使用bbed

密码:blockedit

[oracle@dg-alone:/oracle/app/oracle/product/11.2.0/db_1/bin]$./bbedPassword: BBED: Release 2.0.0.0.0 - Limited Production on Fri Dec 1 09:08:02 2023Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.************* !!! For Oracle Internal Use only !!! ***************BBED>