数据库文件被误删的恢复

[复制链接]
查看11 | 回复9 | 2014-4-5 19:53:18 | 显示全部楼层 |阅读模式
一、通过文件文件描述符(file descriptor)进行恢复(rm删除数据文件没备份)
 场景:误操作删除数据文件tp10.dbf
rm -rf /u01/app/oracle/oradata/bxdb/tp10.dbf 
select ts#,file#,name,bytes,status from v$datafile;
ps -ef |grep dbw |grep -v grep
cd /proc/12308/fd
1、方法一 :在线恢复
cp /proc/13979/fd/264  /u01/app/oracle/oradata/ocp/newtp12.dbf
alter database datafile 7 offline;
alter database rename file '/u01/app/oracle/oradata/oca/tp12.dbf' to '/u01/app/oracle/oradata/ocp/newtp12.dbf';
recover datafile 7;
alter database datafile online;

2、方法二:离线恢复
cp /proc/13979/fd/264  /u01/app/oracle/oradata/ocp/newtp12.dbf
shutdown immediate;
 shutdown abort;
startup
recover database;
 alter database open;

二、获得文件号
1、方法一:bbed获得文件号
set filename '/proc/13979/fd/264'
set blocksize 8192
set filename '/proc/13979/fd/264'
p kcvfh      --在bbed中看位置
p kcvfh.kcvfhrfn --显示相对文件号信息(print)
exit

2、方法二:通过od命令得文件号信息
9i文件号的偏移量是280,再加上数据文件头上一个操作系统块8192,od跳过8472即可获得文件号
od -j 8472-t x1 262|head -1--十六进制输出
od -j 8472-t d2 262|head -1  --十进制输出

10g/11g文件号的偏移量是368,再加上数据文件头上一个操作系统块8192,od跳过8560即可获得文件号
od -j 8560-t x1 264|head -1 --十六进制输出
od -j 8560-t d2 264|head -1  --十进制输出


回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
如果关闭数据库,这个方法不灵了。
只能使用extundelete这样的工具恢复。
回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
lfree 发表于 2013-3-27 08:20
如果关闭数据库,这个方法不灵了。
只能使用extundelete这样的工具恢复。

所以说在不小心rm误操时,这时最好不要急着关闭库。


回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
版主在这里获取了文件号是干嘛用的?
回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
guoyJoe 发表于 2013-3-27 09:00
所以说在不小心rm误操时,这时最好不要急着关闭库。

版主您好:
在模拟您的数据文件被误删的操作中,在/proc/8978/fd目录下,请问您是如何确定编号是264的? 我在模拟过程中,fd的目录下有19和266是红色闪烁状态,请问如何确定是哪个编号呢?谢谢您。
回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
haoge0205 发表于 2013-11-25 11:12
版主您好:
在模拟您的数据文件被误删的操作中,在/proc/8978/fd目录下,请问您是如何确定编号是264的? ...

在linux中首先8978肯定是oracle进程dbwn或lgwr的pid,ls -al会看到红色闪烁并带(delete)标识,
lrwx------ 1 oracle oinstall 64 Sep4 09:41 24 -> /oradata/orcl2/SG01.dbf (deleted)
这种方法应该是通过linux句柄来找到被删除的数据文件
回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
guoyJoe 发表于 2013-3-27 09:00
所以说在不小心rm误操时,这时最好不要急着关闭库。

版主您好,我又做了几次,就没那种情况了,只有一个编号了,呵呵。
回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
Seven_Ginna 发表于 2013-11-25 11:29
在linux中首先8978肯定是oracle进程dbwn或lgwr的pid,ls -al会看到红色闪烁并带(delete)标识,
lrwx-- ...

THKS 之前模拟的时候红色闪烁的有2个文件,因此不知道是哪个,后来再次模拟数次的时候,红色闪烁的只有一个了,可能之前有误操作吧。 感谢
回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
2、方法二:离线恢复
cp /proc/13979/fd/264  /u01/app/oracle/oradata/ocp/newtp12.dbf
这个地方楼主可能有些笔误,应该是tp12.dbf才对。
回复

使用道具 举报

千问 | 2014-4-5 19:53:18 | 显示全部楼层
打打酱油,路过学习下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行