【DB笔试面试393】rm -rf误操作删除了数据文件后如何快速恢复?_数据文件

 

 

Q题目

 

 

rm -rf误操作删除了数据文件后如何快速恢复?

 

     A答案

 

 

 

 

如果执行了rm -rf操作删除了所有的基于FS的数据文件,但是数据库还处于OPEN状态,那么,在这种情况下如何快速地恢复数据库呢?这里的前提条件是没有任何可用的RMAN备份、数据库冷备份等,也就是说,没有任何备份。在这种情况下可以通过系统的文件句柄号来恢复数据文件。整个恢复过程可以简单分为如下几步:

(1)找到被删除文件的文件句柄所在的目录

首先通过命令“ps -ef|grep ora_lgwr”找到LGWR的进程号。假设这里的进程号为31863,则被删除的文件句柄在/proc/31863/fd目录下。

(2)采用操作系统cp命令拷贝文件句柄到原数据库文件路径

假设这里看到的是如下的情况,被删除的文件末尾一般都有deleted标识。

[root@orclalhr fd]# ll | grep deleted

lrwx------ 1 oracle oinstall 64 May  5 14:48 256 -> /u02/app/oracle/oradata/oratest/control01.ctl (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 257 -> /u02/app/oracle/flash_recovery_area/oratest/control02.ctl (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 258 -> /u02/app/oracle/oradata/oratest/redo01.log (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 259 -> /u02/app/oracle/oradata/oratest/redo02.log (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 260 -> /u02/app/oracle/oradata/oratest/redo03.log (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 261 -> /u02/app/oracle/oradata/oratest/system01.dbf (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 262 -> /u02/app/oracle/oradata/oratest/sysaux01.dbf (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 263 -> /u02/app/oracle/oradata/oratest/undotbs01.dbf (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 264 -> /u02/app/oracle/oradata/oratest/users01.dbf (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 265 -> /u02/app/oracle/oradata/oratest/example01.dbf (deleted)

lrwx------ 1 oracle oinstall 64 May  5 14:48 266 -> /u02/app/oracle/oradata/oratest/temp01.dbf (deleted)

执行cp命令,拷贝数据文件到原路径:

cp 256 /u02/app/oracle/oradata/oratest/control01.ctl

cp 257 /u02/app/oracle/flash_recovery_area/oratest/control02.ctl

cp 258 /u02/app/oracle/oradata/oratest/redo01.log

cp 259 /u02/app/oracle/oradata/oratest/redo02.log

cp 260 /u02/app/oracle/oradata/oratest/redo03.log

cp 261 /u02/app/oracle/oradata/oratest/system01.dbf

cp 262 /u02/app/oracle/oradata/oratest/sysaux01.dbf

cp 263 /u02/app/oracle/oradata/oratest/undotbs01.dbf

cp 264 /u02/app/oracle/oradata/oratest/users01.dbf

cp 265 /u02/app/oracle/oradata/oratest/example01.dbf

cp 266 /u02/app/oracle/oradata/oratest/temp01.dbf

需要注意的是,最好使用Oracle用户去执行cp命令。如果使用root用户执行cp命令的话,那么Oracle进程是没有权限操作的。当然也可以在使用root用户拷贝完数据文件后,再执行赋权操作,命令如下所示:

[root@ora10g fd]# chown oracle.oinstall /u02/app/oracle -R

但是一定要注意,必须要等全部数据文件恢复后才可以执行chown操作。因为一旦执行了该操作,原来的ora_进程就会停止,那么就不能恢复所有的数据文件了。

(3)其它检查工作,例如数据检查、备份等

最后需要特别注意的是,当执行操作系统命令rm的时候,切记不可随意加-rf参数,就算一定要用,也要确定再三后才能执行,否则对于数据库而言,可以说是灾难性的。由于rm操作是在数据库OPEN状态下直接进行了破坏性操作,对于Redo Buffer还来不及写入Online Redo Logfile的那部分操作,肯定是会丢失的。因为通过文件句柄号恢复出来的日志文件中,并不一定包含数据库的最新变更。即便如此,本小节对于rm -rf误操作的恢复,还是有一定意义的,至少可以在没有任何备份的情况下,多了一根救命稻草来拯救数据库。最后再次强调一下,执行rm -rf后,千万不要着急地关闭数据库重启,否则在没有任何备份的情况下基本上是很难恢复数据文件的。

 

 

【DB笔试面试393】rm -rf误操作删除了数据文件后如何快速恢复?_数据文件_02