惊心动魄的数据拯救:当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;select * from v$datafile;也不能看到数据文件需要recover,状态均为正常。
select * from v$datafile_header;查看数据文件头,是有报错的,而且相关信息信息无法识别。
恢复过程
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.dbf5、查看系统视图状态,没有异样,但是,往下
select file_name,tablespace_name,status from dba_data_files;6、控制文件scn一直,但是,往下
select * from v$datafile;控制文件头scn一致,但是文件头部scn不一致,
7、数据文件头信息可以识别,但是SCN不一致
select file#,status,error,recover,tablespace_name,checkpoint_change#,name from v$datafile_header;虽然状态是Online的,但是其实数据文件头部scn是不一致的,即使做了checkpoint。
8、这种情况下还没有解决问题
尝试做一致性关库,也是不行的。这块只是做个演示,正常情况不要去关库。
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;可以看到数据文件头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]$bbedPassword: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后查看数据文件状态,均正常。
二、操作系统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
查看句柄对应的数据文件
11g linux 安装bbed方法
oracle 11g编译安装bbed
1、进入到目录
cd $ORACLE_HOME/rdbms/lib2、编译,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包里
将文件复制到一个地方,用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>