暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORACLE文件勒索恢复-实操

原创 wangx 2023-04-10
332

一、故障现象

本文介绍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
















最后修改时间:2023-04-10 12:20:33
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论