一、故障现象
本文介绍oracle数据库文件被加密后如何进行恢复的一个过程,最后成功打开库导出了数据重建恢复了业务;
环境:windows+11.2.0.4
1.加密的文件情况
通过以上可以看到,数据文件被加密后原文件被写了一部分后缀,同时黑客留下了一个txt的文档;
2.去掉后缀
2、1 先将后缀全部去掉
在加密的文件夹下新增一个.bat的文件,内容如下,黄色标记部分为要删除的后缀字符串
@echo off& setlocal enabledelayedexpansion
for /f "delims=" %%1 in ('dir /a /b') do (set wind=%%1
ren "%%~1" "!wind:.[C185A527].[Evilminded@privatemail.com].makop=!")
3 查看文件加密程度
通过图片可以看到每个文件基本上被加密了95个块
以SYSTEM为例,前1~31个块被加密,也就是8 * 31 = 248K
中316587 ~ 316618块被加密,也是32个,8 * 32 = 256K
尾 949729 ~ 949760 块被加密,也是32个,8 * 32 = 256K
总共加密760k
二、恢复思路
1 找一个好的同版本数据库文件dd覆盖给所有损坏的文件(只覆盖文件头损坏的块)
2 将损坏的所有文件头前200个dd出来(system传输整个文件),传输到linux再修改文件头相关信息(所有块的rdba地址、0号块文件大小、1号块相关信息)
3 由于加密的文件大小和实际占用不匹配,使用ue需要挨着删除尾部的多余字节,所以利用dd批量从尾部截断添加到8192个字节
4 确认损坏的数据库字符集;
5 确认损坏的数据库dbname;
6 修改完成后传回windows,单system起库
7 其余文件recover,再online,最后导出数据库重建
三、具体操作
1. 删除多余的文件
redo\ctl\undo\tmp
2. 生成sql处理脚本,然后UE删除掉多余的字节(或用dd补全尾部的8192字节)
通过下面的批处理批量获取文件大小和sql:
echo off & color 0A
::指定起始文件夹
set DIR="%cd%"
::echo DIR=%DIR%
:: 参数 /R 表示需要遍历子文件夹,去掉表示不遍历子文件夹
:: %%i 是一个变量,类似于迭代器,但是这个变量只能由一个字母组成,前面带上%%;%%~zi表示获取该文件大小
:: 括号中是通配符,可以指定后缀名,*.*表示所有文件
for /R %DIR% %%i in (*) do (
echo select '%%i' tsn,%%~zi osbs from dual union all
)
pause
--将上面的结果粘贴进来,然后随便找个打开的数据库执行
select --把路径修改为和linux上的路径一致,然后传到linux去join
'filename='||replace(a.tsn,'E:\oradata\orcl1\','/home/ora11g/header/')||' filesize='||replace(lpad(ltrim(to_char(trunc(osbs/8192)-1,'xxxxxxxx')),8),' ','0')||' off48='||replace(lpad(ltrim(to_char(trunc(osbs/8192)-2,'xxxxxxxx')),8),' ','0'),
'dd if=E:\app\wang\oradata\his\SYSTEM01.DBF of='||tsn|| ' bs=8192 skip=1 seek='|| trunc(osbs/8192) ||' count=1' as dd, --dd截断末尾的块到整的8192字节
trunc(osbs/8192) "包含os的块" ,
trunc(osbs/8192)-1 "不含os的块10进制" ,
to_char(trunc(osbs/8192)-1,'xxxxxxxx') "不含os的块16进制" ,
--'modify /x '|| ltrim(to_char(trunc(osbs/8192)-1,'xxxxxxxx')) ||' dba 1,1 offset 24' osheader,
--'modify /x '|| ltrim(to_char(trunc(osbs/8192)-1,'xxxxxxxx')) ||' dba 1,2 offset 44' fileheader,
trunc(osbs/8192) * 8192 "ue要修改到的位置",
--(trunc(osbs/8192) * 8192) -8192 "resize修改到的位置",
osbs-(trunc(osbs/8192) * 8192) "末尾要删除的字节数"
from
(select 'E:\oradata\orcl1\SYSAUX01.DBF' tsn,15959343104 osbs from dual union all
select 'E:\oradata\orcl1\SYSTEM01.DBF' tsn,7780450304 osbs from dual union all
select 'E:\oradata\orcl1\USERS01.DBF' tsn,28970860544 osbs from dual union all
select 'E:\oradata\orcl1\USERS02.DBF' tsn,104873984 osbs from dual union all
...
) a;
可以看到末尾多了多少212 bit,有几个文件例外,多了228bit!!!
需要删除每个文件多余的字节,保障大小和占用空间相等!!!
--由于ue每个修改比较慢,这里使用dd来截断最后一个块,补全8192k数据(dd 输出的seek必须包含os块)
--system本身要注意是否修改到;
dd if=I:\oradata\SYSAUX01.DBF of=I:\oradata\SYSTEM01.DBF bs=8192 skip=1 seek=949762 count=1
这一步执行两次,确认 "末尾要删除的字节数" 全部为0
2. 找一个好的同版本数据库文件dd覆盖给所有损坏的文件(只覆盖文件头损坏的块)
--dbf损坏目录下新建dd1.bat
@echo off
rem 指定存放文件的目录
set FolderName=E:\oradata\orcl1
for /f "delims=\" %%a in ('dir /b "%FolderName%\*.DBF"') do (
echo dd if=E:\app\wang\oradata\orcl\SYSTEM01.DBF of=%FolderName%\%%a bs=8192 count=32 conv=notrunc
)
pause
windows cmd窗口复制出来执行;
--dbf损坏目录下新建dd1_1.bat >>批量清空从3号块开始的位图
@echo off
rem 指定存放文件的目录
set FolderName=E:\oradata\orcl1
for /f "delims=\" %%a in ('dir /b "%FolderName%\*.DBF"') do (
rem 跳过50个system的位图块,写10个到坏掉的文件下覆盖
echo dd if=E:\app\wang\oradata\orcl\SYSTEM01.DBF of=%FolderName%\%%a bs=8192 skip=50 count=10 seek=3 conv=notrunc
)
pause
3.将损坏的所有文件头前200个dd出来,传输到linux再修改文件头相关信息(所有块的rdba地址、0号块文件大小、1号块相关信息)
--dbf损坏目录下新建dd2.bat
@echo off
rem 指定存放文件的目录
set FolderName=E:\oradata\orcl1
for /f "delims=\" %%a in ('dir /b "%FolderName%\*.DBF"') do (
echo dd if=%FolderName%\%%a of=e:\hb\%%a bs=8192 count=200
)
pause
windows cmd窗口复制出来执行;
再次使用块校验工具校验dd出来的文件头是否正常;(取消rdba检查)
3.上传e盘下的hb目录的文件头到linux 》/home/ora11g/header
3.1 运行1.rdba计算好的文件头的rdba地址,然后换算成块号,文件号,再写入到bbed作为参数文件;
[ora11g@ol7 sh]$ sh 1rdba.sh
输入路径: /home/ora11g/header
输入dd开始位置: 35
输入dd结束位置: 200
查看生成的bbed.par bbed.txt
3.2 由于windows是批量dd的好的system文件块,rdba都为1号文件的1号块,所以需要修改;
#从bbed.txt文件中截取文件号,循环,然后根据输入的块起始位置来换算成rdba地址
[ora11g@ol7 ~]$ sh 2file_to_rba.sh
输入开始计算的块号: 1
输入结束计算的块号: 40
生成修改 rdba的脚本,然后bbed执行;
[ora11g@ol7 ~]$ bbed parfile=/home/ora11g/sh/bbed.par cmdfile=/home/ora11g/sh/bbed_rdba.txt
查看是否有报错信息
grep BBED- log.bbd
3.3 校验rdba是否修改正确
[ora11g@ol7 sh]$ sh v_rdba.sh
输入路径: /home/ora11g/header
输入dd开始位置: 1
输入dd结束位置: 45
3.4 确认数据库名,字符集,回滚段信息;
[ora11g@ol7 header]$ dd if=SYSTEM01.DBF bs=8192 skip=801 count=1|hexdump -C
or
[ora11g@ol7 header]$ dd if=SYSTEM01.DBF of=/tmp/zfj bs=8192 skip=801 count=1
[ora11g@ol7 header]$ strings /tmp/zfj
echo "p dba 1,225 kdbr"|bbed parfile=bbed.par|grep kdbr
seq 0 20 | xargs -I{} echo 'x /rncnnnnnnnnnnnnnnn dba 1,225 offset 0 *kdbr[{}]' |bbed parfile=bbed.par|grep "_SYS"|cut -f2 -d:|sed 's/ //g'|tr "\n" ","|sed s'/.$//'
3.5 修改文件号、文件大小、scn、数据库名
[ora11g@ol7 sh]$ cat rdban.txt|cut -d ";" -f 1,4|sort -k 1
filename=/home/ora11g/header/SYSAUX01.DBF;file=2
filename=/home/ora11g/header/SYSTEM01.DBF;file=1
filename=/home/ora11g/header/USERS01.DBF;file=4
filename=/home/ora11g/header/USERS02.DBF;file=54
filename=/home/ora11g/header/ZL9BASEITEM.DBF;file=5
filename=/home/ora11g/header/ZL9CISAUDIT.DBF;file=6
--windows dd生成复制到plsql处理,再处理拷贝到linux filesize.txt
select --把路径修改为和linux上的路径一致,然后传到linux去join
'filename='||replace(a.tsn,'E:\oradata\orcl1\','/home/ora11g/header/')||' filesize='||replace(lpad(ltrim(to_char(trunc(osbs/8192)-1,'xxxxxxxx')),8),' ','0')||' off48='||replace(lpad(ltrim(to_char(trunc(osbs/8192)-2,'xxxxxxxx')),8),' ','0'),
'dd if=E:\oradata\orcl1\SYSAUX01.DBF of='||tsn|| ' bs=8192 skip=1 seek='|| trunc(osbs/8192) ||' count=1' as dd, --dd截断末尾的块到整的8192字节
trunc(osbs/8192) "包含os的块" ,
trunc(osbs/8192)-1 "不含os的块10进制" ,
to_char(trunc(osbs/8192)-1,'xxxxxxxx') "不含os的块16进制" ,
--'modify /x '|| ltrim(to_char(trunc(osbs/8192)-1,'xxxxxxxx')) ||' dba 1,1 offset 24' osheader,
--'modify /x '|| ltrim(to_char(trunc(osbs/8192)-1,'xxxxxxxx')) ||' dba 1,2 offset 44' fileheader,
trunc(osbs/8192) * 8192 "ue要修改到的位置",
--(trunc(osbs/8192) * 8192) -8192 "resize修改到的位置",
osbs-(trunc(osbs/8192) * 8192) "末尾要删除的字节数"
from
(select 'E:\oradata\orcl1\SYSAUX01.DBF' tsn,15959334912 osbs from dual union all
select 'E:\oradata\orcl1\SYSTEM01.DBF' tsn,7780442112 osbs from dual union all
select 'E:\oradata\orcl1\USERS01.DBF' tsn,28970852352 osbs from dual union all
select 'E:\oradata\orcl1\USERS02.DBF' tsn,104865792 osbs from dual
...
) a;
[ora11g@ol7 sh]$ vi filesize.txt
filename=/home/ora11g/header/SYSAUX01.DBF filesize=001dba01 off48=001dba00
filename=/home/ora11g/header/SYSTEM01.DBF filesize=000e7e01 off48=000e7e00
filename=/home/ora11g/header/USERS01.DBF filesize=0035f661 off48=0035f660
filename=/home/ora11g/header/USERS02.DBF filesize=00003201 off48=00003200
filename=/home/ora11g/header/ZL9BASEITEM.DBF filesize=001bd681 off48=001bd680
--使用linux 的join命令关联两个文件,生成一个新的txt文件;
[ora11g@ol7 sh]$ cat rdban.txt|cut -d ";" -f 1,4|sort -k 1|sed 's/;/ /g' >1.txt
[ora11g@ol7 sh]$ cat filesize.txt |sort -k 1 > 2.txt
[ora11g@ol7 sh]$ join -1 1 -2 1 1.txt 2.txt >filesizen.txt
[ora11g@ol7 sh]$ more filesizen.txt
filename=/home/ora11g/header/SYSAUX01.DBF file=2 filesize=001dba01 off48=001dba00
filename=/home/ora11g/header/SYSTEM01.DBF file=1 filesize=000e7e01 off48=000e7e00
filename=/home/ora11g/header/USERS01.DBF file=4 filesize=0035f661 off48=0035f660
filename=/home/ora11g/header/USERS02.DBF file=54 filesize=00003201 off48=00003200
filename=/home/ora11g/header/ZL9BASEITEM.DBF file=5 filesize=001bd681 off48=001bd680
filename=/home/ora11g/header/ZL9CISAUDIT.DBF file=6 filesize=00001901 off48=00001900
filename=/home/ora11g/header/ZL9CISREC.DBF file=7 filesize=00072c81 off48=00072c80
filename=/home/ora11g/header/ZL9DEVBASE.DBF file=8 filesize=00000f01 off48=00000f00
--将上面查询出来的dbname 改到这个文件3fix_size.sh
[ora11g@ol7 sh]$ sh 3fix_size.sh
bbed parfile=bbed.par cmdfile=bbed_fixsize.txt
bbed parfile=bbed.par cmdfile=bbed_dbname.txt
bbed parfile=bbed.par cmdfile=bbed_clearrootdba.txt
bbed parfile=bbed.par cmdfile=bbed_scn.txt
bbed parfile=bbed.par cmdfile=bbed_sumapply.txt
--上面脚本执行每执行完一次就查看一次bbed错误日志;
[ora11g@ol7 sh]$ grep BBED- log.bbd
3.6 处理完成后将SYSTEM文件传回windows,单system起库
--获取回滚段用于屏蔽
echo "p dba 1,225 kdbr"|bbed parfile=bbed.par|grep kdbr
seq 0 20 | xargs -I{} echo 'x /rncnnnnnnnnnnnnnnn dba 1,225 offset 0 *kdbr[{}]' |bbed parfile=bbed.par|grep "_SYS"|cut -f2 -d:|sed 's/ //g'|tr "\n" ","|sed s'/.$//'
_SYSSMU1_1880814008$,_SYSSMU2_237578013$,_SYSSMU3_3036648903$,_SYSSMU4_2554663710$,_SYSSMU5_2656872754$,_SYSSMU6_2560781624$,_SYSSMU7_362778077$,_SYSSMU8_3123962168$,_SYSSMU9_902607226$,_SYSSMU10_600653064$,_SYSSMU11_1260038185$,_SYSSMU12_242087667$,_SYSSMU13_1504978434$,_SYSSMU14_3437831284$,_SYSSMU15_2247781413$,_SYSSMU16_589156960$,_SYSSMU17_2366401286$,_SYSSMU18_1287317225$,_SYSSMU19_3322902554$,_SYSSMU20_2714089088$
[ora11g@ol7 header]$ dd if=SYSTEM01.DBF of=/tmp/system200 count=200 bs=8192
在e盘hb下新建:(用于拷贝文件头覆盖之前有问题的文件头)
@echo off
rem 指定存放文件的目录
set FolderName=E:\hb
for /f "delims=\" %%a in ('dir /b "%FolderName%\*.DBF"') do (
echo dd if=%FolderName%\%%a bs=8192 of=I:\oradata\orcl\%%a count=200 conv=notrunc
)
pause
C:\Users\wang>dd if=E:\hb\SYSTEM01.DBF of=I:\oradata\orcl\SYSTEM01.DBF count=200 conv=notrunc
新建pfileorcl1.txt
*._allow_resetlogs_corruption=TRUE
*._allow_error_simulation=TRUE
*.compatible='11.2.0.4.0'
*.control_files='I:\oradata\orcl\CONTROL01.CTL'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.diagnostic_dest='E:\app\wang'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.open_cursors=300
*.pga_aggregate_target=300M
*.processes=1000
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1g
*.undo_management='manual'
*.undo_tablespace='SYSTEM'
*._offline_rollback_segments=(_SYSSMU1_1880814008$,_SYSSMU2_237578013$,_SYSSMU3_3036648903$,_SYSSMU4_2554663710$,_SYSSMU5_2656872754$,_SYSSMU6_2560781624$,_SYSSMU7_362778077$,_SYSSMU8_3123962168$,_SYSSMU9_902607226$,_SYSSMU10_600653064$,_SYSSMU11_1908542605$,_SYSSMU12_681659328$,_SYSSMU13_2355401967$,_SYSSMU14_1898001506$,_SYSSMU15_2247781413$,_SYSSMU16_589156960$,_SYSSMU17_2366401286$,_SYSSMU18_1287317225$,_SYSSMU19_3322902554$,_SYSSMU20_2714089088$)
*._corrupted_rollback_segments=(_SYSSMU1_1880814008$,_SYSSMU2_237578013$,_SYSSMU3_3036648903$,_SYSSMU4_2554663710$,_SYSSMU5_2656872754$,_SYSSMU6_2560781624$,_SYSSMU7_362778077$,_SYSSMU8_3123962168$,_SYSSMU9_902607226$,_SYSSMU10_600653064$,_SYSSMU11_1908542605$,_SYSSMU12_681659328$,_SYSSMU13_2355401967$,_SYSSMU14_1898001506$,_SYSSMU15_2247781413$,_SYSSMU16_589156960$,_SYSSMU17_2366401286$,_SYSSMU18_1287317225$,_SYSSMU19_3322902554$,_SYSSMU20_2714089088$)
event = "10231 trace name context forever, level 10"
event = "10233 trace name context forever, level 10"
C:\Users\wang>oradim -new -sid orcl1
C:\Windows\system32>orapwd file=E:\app\wang\product\11.2.0\dbhome_1\database\PWDorcl1.ora password=his
C:\Users\wang>set oracle_sid=orcl1
SQL> startup nomount pfile='E:\oradata\pfile_rc.txt';
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'I:\oradata\orcl\REDO01.LOG' SIZE 20M BLOCKSIZE 512,
GROUP 2 'I:\oradata\orcl\REDO02.LOG' SIZE 20M BLOCKSIZE 512,
GROUP 3 'I:\oradata\orcl\REDO03.LOG' SIZE 20M BLOCKSIZE 512
DATAFILE
'I:\oradata\orcl\SYSTEM01.DBF'
CHARACTER SET ZHS16GBK
;
--做个10046看,然后打开数据库
oradebug setmypid
oradebug event 10046 trace name context forever,level 12;
oradebug tracefile_name
alter database open resetlogs;
数据库已更改。
SQL> select name from v$datafile;
3.7 临时表空间处理
select * from dba_tablespaces;
ALTER TABLESPACE TEMP ADD TEMPFILE 'E:\ORADATA\ORCL1\TEMP01.DBF' size 100m autoextend on;
ALTER TABLESPACE ZLTOOLSTMP ADD TEMPFILE 'E:\ORADATA\ORCL1\ZLTOOLSTMP.dbf' size 100m autoextend on;
3.8 位图块处理
begin dbms_space_admin.tablespace_rebuild_bitmaps('SYSTEM'); end;
3.9 undo处理
--新建undo
create undo tablespace undo_new datafile 'E:\ORADATA\ORCL1\undonew.dbf' size 10m autoextend on;
表空间已创建。
--删除老undo
drop tablespace undotbs1 including contents and datafiles;
3.10 修改参数,重启实例
--修改参数
shutdown immediate
*.compatible='11.2.0.4.0'
*.control_files='I:\oradata\orcl\CONTROL01.CTL'
*.db_block_size=8192
*.db_domain=''
*.db_name='ORCL'
*.diagnostic_dest='e:\app\wang'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.open_cursors=300
*.pga_aggregate_target=300M
*.processes=1000
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1g
undo_management='auto'
undo_tablespace='undo_new'
event="10231 trace name context forever,level 10"
--启动数据库
SQL> startup pfile='E:\oradata\pfile_nm.txt';
3.11 查询其它信息,传输到linux再次处理其它文件头
######################################
--添加sqlplus开库后生成的修改语句
select 'file='||relfile#||' filex='||x.file#||' rfile='||x.relfile||' tsnum='||x.ts#||' tslength='||x.tslength||' crscnbas='||x.crscnbas||' tsname='||x.name||' vname='||x.vname
from (
select f.relfile#,replace(lpad(ltrim(to_char(f.file# ,'xxxx')),4),' ','0') file#,
replace(lpad(ltrim(to_char(f.relfile# ,'xxxxxxxx')),8),' ','0') relfile,
replace(lpad(ltrim(to_char(ts.ts# ,'xxxx')),8),' ','0') ts#,
replace(lpad(ltrim(to_char(length(ts.name),'xxxx')),4),' ','0') tslength,
replace(lpad(ltrim(to_char(f.crscnbas,'xxxxxxxx')),8),' ','0') crscnbas,
ts.name,t.name vname
from FILE$ f,ts$ ts,V$DBFILE t
where f.ts# = ts.ts# and f.file#=t.file# and ts.name not in ('UNDOTBS1','UNDO_NEW')
) x;
[ora11g@ol7 sh]$ vi filesize1.txt
file=1 filex=0001 rfile=00000001 tsnum=00000000 tslength=0006 crscnbas=00000007 tsname=SYSTEM vname=E:\ORADATA\ORCL1\SYSTEM01.DBF
file=2 filex=0002 rfile=00000002 tsnum=00000001 tslength=0006 crscnbas=0000072b tsname=SYSAUX vname=E:\APP\WANG\PRODUCT\11.2.0\DBHOME_1\DATABASE\MISSING00002
file=4 filex=0004 rfile=00000004 tsnum=00000004 tslength=0005 crscnbas=00003e67 tsname=USERS vname=E:\APP\WANG\PRODUCT\11.2.0\DBHOME_1\DATABASE\MISSING00004
file=5 filex=0005 rfile=00000005 tsnum=00000006 tslength=000b crscnbas=000e70f7 tsname=ZL9BASEITEM vname=E:\APP\WANG\PRODUCT\11.2.0\DBHOME_1\DATABASE\MISSING00005
file=6 filex=0006 rfile=00000006 tsnum=00000007 tslength=000b crscnbas=000e720b tsname=ZL9CISAUDIT vname=E:\APP\WANG\PRODUCT\11.2.0\DBHOME_1\DATABASE\MISSING00006
file=7 filex=0007 rfile=00000007 tsnum=00000008 tslength=0009 crscnbas=000e731c tsname=ZL9CISREC vname=E:\APP\WANG\PRODUCT\11.2.0\DBHOME_1\DATABASE\MISSING00007
...
#按照第一列进行排序,然后生成到1.txt
[ora11g@ol7 sh]$ sort -k 1 filesize1.txt >1.txt
#按照第二列进行排序之前修改的这个文件
[ora11g@ol7 sh]$ head -n 5 filesizen.txt
filename=/home/ora11g/header/SYSAUX01.DBF file=2 filesize=001dba01 off48=001dba00
filename=/home/ora11g/header/SYSTEM01.DBF file=1 filesize=000e7e01 off48=000e7e00
filename=/home/ora11g/header/USERS01.DBF file=4 filesize=0035f661 off48=0035f660
filename=/home/ora11g/header/USERS02.DBF file=54 filesize=00003201 off48=00003200
filename=/home/ora11g/header/ZL9BASEITEM.DBF file=5 filesize=001bd681 off48=001bd680
[ora11g@ol7 sh]$ sort -k 2 filesizen.txt >2.txt
#将第一个1.txt的第一列file 和 第二个2.txt的第二列file进行关联,重新生成一个文件repaire.txt
[ora11g@ol7 sh]$ join -1 1 -2 2 1.txt 2.txt > repaire.txt
3.12 从repaire.txt中获取修改的信息(文件号、相对文件号、表空间号、表空间长度、创建scn、表空间名称及生成修复文件的sql脚本)
[ora11g@ol7 sh]$ sh 4fix_other.sh
[ora11g@ol7 sh]$ bbed parfile=bbed.par cmdfile=bbed_fixother.txt
查看是否有报错信息
grep BBED- log.bbd
--online1.sql需要拷贝到txt批量替换to后面的路径位置
3.13 linux 拷贝文件头回windows的路径,然后dd覆盖(system01.dbf不要覆盖,因为数据库已经用system打开了)
--e:\hb目录下新建dd3.bat
@echo off
rem 指定存放文件的目录
set FolderName=E:\hb
for /f "delims=\" %%a in ('dir /b "%FolderName%\*.DBF"') do (
echo dd if=%FolderName%\%%a bs=8192 of=E:\oradata\orcl1\%%a count=200 conv=notrunc
)
pause
执行dd命令
执行online1.sql命令
执行online2.sql命令
3.14 校验还有文件未恢复的?
select * from dba_data_files where online_status='RECOVER';
--select 'dd if='||replace(file_name,'E:\ORADATA\ORCL1\','E:\hbnew\')||' of='||file_name||' bs=8192 count=2 conv=notrunc' from dba_data_files where online_status='RECOVER';
select file#,rfile#,checkpoint_change#,status,bytes,blocks from v$datafile where status='RECOVER';
--select (94720*8192)/1024/1024 from dual;
3.15 查看和导出数据,重建数据库
select count(*) from 病人挂号记录;
select count(*) from 门诊费用记录;
select count(*) from 住院费用记录;
create directory dump as 'E:\dump\';
expdp \" / as sysdba\" directory=dump logfile=his.log dumpfile=his.dmp full=y
exp userid=system/his full=y direct=y recordlength=65535 buffer=104857600 file=E:\dump\hisnew.dmp log=e:\dump\hisnew.log feedback=10000
总结:
1、对于11g之后的库,文件头前1M丢失了,我们都可以通过重建的方式来恢复,然后open库导出数据;
2、对于11g之前的库,如果丢失了,那么只能通过dul挖掘数据恢复,然后组合数据字典方式恢复到新库中;
以上方式恢复了多个医疗行业的数据,在中勒索后不要去联系黑客和淘宝人员,大量经验告诉我们,最后人才两空;
如果有什么问题可以v-x咨询:13330288582,也可以进qq群交流:660316651