oracle操作错误还原,Oracle delete误操作数据恢复(BBED)

Oracle delete误操作数据恢复(BBED)

在Oracle中,表数据被错误执行了delete,并

提交,如何找回数据呢?

常规的修复方法可以想到

闪回、Rman、impdp

DG

......

如果这些方法均失效了,也可以考虑使用

BBED

工具找回数据。

Oracle在执行delete操作时,并没有把数据块内的数据马上清除掉,而是将块标记为已删除,表示可以重用。

那么在数据块内容没有被覆盖之前,理论上数据时可以找回的。

理论上,在数据块没有被覆盖之前,将数据块上的标志位的已删除标记去掉,就可以找回数据了。

修复过程如下:

修复数据需要知道如下信息:

执行误操作表对应的:

1 数据文件号(

dba_objects

)

select object_id, object_name, owner from dba_objects where object_name = 'T1' and owner = 'CJC';

2 块号(bbed)

假设块号范围1到200,查找sid=object_id的数据块号

BBED> p /d dba 13,

1..200

ktbbh.ktbbhsid.ktbbhod1

3 offset(bbed)

BBED> set dba 13,131

BBED> x /rnc *kdbr[1]

4 每行标识符(dump)

alter system dump datafile 13 block 131;

通过对比某一数据块删除数据前、后两次转储信息,可以知道

块中行

存在数据时标志位是fb: --H-FL--,

行数据

被删除后标志位变成fb: --HDFL--

,换行成16进制,标志位改成0x2c表示存在数据。

5 修复数据

下面是修复131号块中第二行数据,将标志位改成0x2c

BBED>

assign /x dba 13, 131 offset 8083 = 0x2c

BBED>

sum apply dba 13,131

SQL> alter system flush buffer_cache;

实验如下:

一:数据库版本

---数据库19C,相当于12.2.0.3版本

SQL> select banner_full from v$version;

BANNER_FULL

---------------------------------------------------------------------

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.3.0.0.0

SQL> show pdbs

CON_ID CON_NAME

OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

2 PDB$SEED

READ ONLY  NO

3 CJCPDB

READ WRITE NO

二:创建测试数据

SQL> conn cjc/cjc@cjcpdb

SQL> create table t1 as select * from dba_objects where object_id <=1000;

Table created.

三:查看测试数据基本信息

---1 测试表t1的OBJECT_ID = 73216

SQL> set line 150

SQL> col object_name for a20

SQL> select object_id,object_name from user_objects where object_name='T1';

OBJECT_ID OBJECT_NAME

---------- --------------------

73216 T1

---2 测试表t1所在数据文件号=13

SQL> col file_name for a65

SQL> select file_name,file_id  from dba_data_files where tablespace_name = 'CJCTBS';

FILE_NAME

FILE_ID

----------------------------------------------------------------- ----------

/u01/app/oracle/oradata/CJCDB/cjcpdb/cjctbs01.dbf

13

---3 测试表t1数据存储在13号数据文件,131-148号数据块里(数据分布在17个数据块里)

SQL> select distinct dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) from t1 order by 2;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)

------------------------------------ ------------------------------------

13

131

13

132

13

133

13

134

13

135

13

136

13

137

13

138

13

139

13

140

13

141

13

142

13

143

13

145

13

146

13

147

13

148

17 rows selected.

四:查看误删除前数据块信息

---

转储

T1表的第一个块(131块),查看删除之前的内容

SQL> alter system dump datafile 13 block 131;

System altered.

SQL> select value from v$diag_info where name ='Default Trace File';

VALUE

-------------------------------------------------------------------

/u01/app/oracle/diag/rdbms/cjcdb/cjcdb/trace/cjcdb_ora_18805.trc

[oracle@cjcos ~]$ vim /u01/app/oracle/diag/rdbms/cjcdb/cjcdb/trace/cjcdb_ora_18805.trc

Trace file /u01/app/oracle/diag/rdbms/cjcdb/cjcdb/trace/cjcdb_ora_18805.trc

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.3.0.0.0

Build label:    RDBMS_19.3.0.0.0DBRU_LINUX.X64_190417

ORACLE_HOME:    /u01/app/oracle/product/19.0.0/dbhome_1

System name:    Linux

Node name:      cjcos

Release:        4.1.12-112.16.4.el7uek.x86_64

Version:        #2 SMP Mon Mar 12 23:57:12 PDT 2018

Machine:        x86_64

Instance name: cjcdb

Redo thread mounted by this instance: 1

Oracle process number: 51

Unix process pid: 18805, image: oracle@cjcos

......

Block header dump:  0x03400083

Object id on Block? Y

seg/obj: 0x11e00  csc:  0x0000000000276a70  itc: 3  flg: E  typ: 1 - DATA

brn: 0  bdba: 0x3400080 ver: 0x01 opc: 0

inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn  0x0000000000276a70

0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

bdba: 0x03400083

---nrow=68  表示datafile 13 block 131块中包含68行数据

data_block_dump,data header at 0x8bcca07c

===============

tsiz: 0x1f80

hsiz: 0x9a

pbl: 0x8bcca07c

76543210

flag=--------

ntab=1

nrow=68

frre=-1

fsbo=0x9a

fseo=0x3ca

avsp=0x330

tosp=0x330

0xe:pti[0]      nrow=68 offs=0

0x12:pri[0]     offs=0x1f17

......

---fb: --H-FL-- 表示数据删除前的标志位,32+8+4 = 44 转换成16进制为2c

block_row_dump:

tab 0, row 0, @0x1f17

tl: 105 fb: --H-FL-- lb: 0x0  cc: 22

col  0: [ 3]  53 59 53

col  1: [ 6]  43 5f 4f 42 4a 23

col  2: *NULL*

col  3: [ 2]  c1 03

col  4: [ 2]  c1 03

col  5: [ 7]  43 4c 55 53 54 45 52

col  6: [ 7]  78 77 04 11 01 39 0f

col  7: [ 7]  78 77 04 11 01 39 0f

col  8: [19]  32 30 31 39 2d 30 34 2d 31 37 3a 30 30 3a 35 36 3a 31 34

col  9: [ 5]  56 41 4c 49 44

col 10: [ 1]  4e

col 11: [ 1]  4e

col 12: [ 1]  4e

col 13: [ 2]  c1 06

col 14: *NULL*

col 15: [13]  4d 45 54 41 44 41 54 41 20 4c 49 4e 4b

col 16: *NULL*

col 17: [ 1]  59

col 18: [ 1]  4e

col 19: *NULL*

col 20: [ 1]  4e

col 21: [ 1]  4e

tab 0, row 1, @0x1eb9

tl: 94 fb: --H-FL-- lb: 0x0  cc: 22

通过bbed查看删除之前

131

的信息

---b

bed

(

Oracle Block Browerand EDitor Tool

)

---BBED工具的安装方法见我的另一篇博客结尾部分

---http://blog.itpub.net/29785807/viewspace-2128326/

[oracle@cjcos ~]$ cat bbed.par

blocksize=8192

listfile=/home/oracle/filelist.txt

mode=edit

[oracle@cjcos ~]$ bbed parfile=bbed.par

Password: blockedit

BBED: Release 2.0.0.0.0 - Limited Production on Sun Feb 9 15:44:21 2020

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED> set dba 13,131

DBA

0x03400083 (54526083 13,131)

BBED> p

kcbh.type_kcbh

--------------

ub1 type_kcbh                               @0        0x06

---kdbr[68] 表示

131块包含

68行数据

BBED> map

File: /u01/app/oracle/oradata/CJCDB/cjcpdb/cjctbs01.dbf (13)

Block: 131                                   Dba:0x03400083

------------------------------------------------------------

KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes                      @0

struct ktbbh, 96 bytes                     @20

struct kdbh, 14 bytes                      @124

struct kdbt[1], 4 bytes                    @138

sb2

kdbr[68]                             @142

ub1 freespace[816]                         @278

ub1 rowdata[7094]                          @1094

ub4 tailchk                                @8188

BBED> p kdbt

struct kdbt[0], 4 bytes                     @138

sb2 kdbtoffs                             @138      0

sb2 kdbtnrow                             @140      68

---0x2c 表示标志位是--H-FL--(32+8+4 = 44 转换成16进制为2c)

BBED> p *kdbr[1]

rowdata[6895]

-------------

ub1 rowdata[6895]                           @7989     0x2c

查看第二行数据

BBED> x /rnc *kdbr[1]

rowdata[6895]                               @7989

-------------

flag@7989: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@7990: 0x00

cols@7991:   22

col    0[3] @7992: #########################################

col    1[6] @7996: I_OBJ#

col    2[0] @8003: *NULL*

col    3[2] @8004: ○

col    4[2] @8007: ○

col    5[5] @8010: INDEX

col    6[7] @8016: xw...9.

col    7[7] @8024: xw...9.

col   8[19] @8032: 2019-04-17:00:56:14

col    9[5] @8052: VALID

col   10[1] @8058: N

col   11[1] @8060: N

col   12[1] @8062: N

col   13[2] @8064: ○

col   14[0] @8067: *NULL*

col   15[4] @8068: NONE

col   16[0] @8073: *NULL*

col   17[1] @8074: Y

col   18[1] @8076: N

col   19[0] @8078: *NULL*

col   20[1] @8079: N

col   21[1] @8081: N

通过SQL查看第二行数据:

SELECT * FROM (select rownum no, t1.* from t1) A WHERE NO = 2;

75485a8effe58f670d88428ff81ec0ec.png

五:删除T1表数据,模拟误删除操作

SQL> show user

USER is "CJC"

SQL> show user con_name

USER is "CJC"

CON_NAME

------------------------------

CJCPDB

SQL> delete t1;

998 rows deleted.

SQL> commit;

Commit complete.

SQL> alter system flush buffer_cache;

System altered.

转储

T1表的第一个块(131块),查看删除后的内容

SQL> conn / as sysdba

Connected.

SQL> alter system flush buffer_cache;

System altered.

SQL> alter system dump datafile 13 block 131;

System altered.

SQL> oradebug setmypid

Statement processed.

SQL> oradebug tracefile_name

/u01/app/oracle/diag/rdbms/cjcdb/cjcdb/trace/cjcdb_ora_21476.trc

[oracle@cjcos ~]$ vim /u01/app/oracle/diag/rdbms/cjcdb/cjcdb/trace/cjcdb_ora_21476.trc

---fb: --HDFL--   该标志位从原来的--H-FL--变成了--HDFL--, 其中D就代表删除的意思

......

Block header dump:  0x03400083

Object id on Block? Y

seg/obj: 0x11e00  csc:  0x0000000000276a70  itc: 3  flg: E  typ: 1 - DATA

brn: 0  bdba: 0x3400080 ver: 0x01 opc: 0

inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn  0x0000000000276a70

0x02   0x0001.01d.000002e6  0x02400631.011c.01  --U-   68  fsc 0x1b2e.002773fc

0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

bdba: 0x03400083

---nrow=68 表示有68行数据

data_block_dump,data header at 0x7f491a40a07c

===============

tsiz: 0x1f80

hsiz: 0x9a

pbl: 0x7f491a40a07c

76543210

flag=--------

ntab=1

nrow=68

frre=-1

fsbo=0x9a

fseo=0x3ca

avsp=0x330

tosp=0x1ee6

......

---fb: --HDFL-- 表示每行数据标志位已经改成已删除标志

block_row_dump:

tab 0, row 0, @0x1f17

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 1, @0x1eb9

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 2, @0x1e46

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 3, @0x1dd3

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 4, @0x1d6b

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 5, @0x1d0e

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 6, @0x1c9d

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 7, @0x1c37

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 8, @0x1bcd

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 9, @0x1b6e

tl: 2 fb: --HDFL-- lb: 0x2

通过bbed查看删除之后的

信息

BBED> set dba 13,131

DBA

0x03400083 (54526083 13,131)

BBED> map

File: /u01/app/oracle/oradata/CJCDB/cjcpdb/cjctbs01.dbf (13)

Block: 131                                   Dba:0x03400083

------------------------------------------------------------

KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes                      @0

struct ktbbh, 96 bytes                     @20

struct kdbh, 14 bytes                      @124

struct kdbt[1], 4 bytes                    @138

sb2 kdbr[

68

]                               @142

ub1 freespace[816]                         @278

ub1 rowdata[7094]                          @1094

ub4 tailchk                                @8188

---

查看

第二行没有数据

BBED> x /rnc *kdbr[1]

rowdata[6895]                               @7989

-------------

flag@7989: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)

lock@7990: 0x02

cols@7991:    0

数据

已经被删除,需要找到表T1对应的数据块有哪些

SQL> conn cjc/cjc@cjcpdb

SQL> col object_name for a15

SQL> col owner for a10

SQL> set line 100

SQL> select object_id, object_name, owner from dba_objects where object_name = 'T1' and owner = 'CJC';

OBJECT_ID OBJECT_NAME

OWNER

---------- --------------- ----------

73216 T1

CJC

---找表T1所在的块信息

---由于数据已经被删除,这种方式已经用不了了。

SQL> select distinct dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) from t1 order by 2;

no rows selected

已知表T1的object_id是73216,数据文件号是13,求T1表对应的块号?

预估块号范围在1到200(主要是为了找到object_id=73216的块号);

BBED> p ktbbh

struct ktbbh, 96 bytes                      @20

ub1 ktbbhtyp                             @20       0x01 (KDDBTDATA)

union

ktbbhsid

, 4 bytes                  @24

ub4 ktbbhsg1                          @24       0x00011e00

ub4 ktbbhod1                          @24       0x00011e00

struct ktbbhcsc, 8 bytes                 @28

ub4 kscnbas                           @28       0x00276a70

ub2 kscnwrp                           @32       0x8000

ub2 kscnwrp2                          @34       0x0000

......

---

-

表T1的sid

=73216,查找数据文件号13,假设块号范围1到200,查看块号1到200哪些sid=73216,即是T1对应的数据块。

BBED> p /d dba 13,1 ktbbh.ktbbhsid.ktbbhod1

BBED-00207: invalid offset specifier (ktbbh.ktbbhsid.ktbbhod1)

......

BBED> p /d dba 13,131 ktbbh.ktbbhsid.ktbbhod1

ub4 ktbbhod1                                @24       73216

BBED> p /d dba 13,132 ktbbh.ktbbhsid.ktbbhod1

ub4 ktbbhod1                                @24       73216

......

手动执行速度较慢,可以通过如下脚本批量生成T1表对应的数据块

---脚本如下

[oracle@cjcos ~]$ cat sandata.sh

#!/bin/sh

. ~/.bash_profile

for ((i=1; i<=200; i ++))

do

objectid=`echo p /d dba 13,$i ktbbh.ktbbhsid.ktbbhod1 | bbed parfile=bbed.par password=blockedit | grep 'ktbbhod1' | awk '{print $5}'`

if [ "$objectid" = "73216" ];then

echo $i;

fi;

done

6a13597ae8a051917f64b0cb95ba1fe4.png

---执行脚本,获取

T1表对应的

数据

块号

[oracle@cjcos ~]$ chmod a+x sandata.sh

[oracle@cjcos ~]$ ./sandata.sh > sh.out

[oracle@cjcos ~]$ cat sh.out

131

132

133

134

135

136

137

138

139

140

141

142

143

145

146

147

148

:修复数据

修复数据需要知道几个信息:

1 数据文件号

2 块号

3 offset

前面已经知道这三个信息,文件号3,块号131到148,查看单个数据块的offset,例如查看第二行的offset:

BBED> set dba 13,131

BBED> x /rnc *kdbr[1]

rowdata[6895]                               @7989

即第二行数据offset是7989

知道这些信息后就可以修复第二行数据了,修复方法如下:

BBED>

assign /x dba 13, 131 offset 7989 = 0x2c

BBED>

sum apply dba 13,131

这样已修复了第一个数据块的第二行数据,t1表一共有998条数据,一条一条执行速度较慢,可以通过下面脚本批量生成修复脚本:

---

脚本如下:

---将上一步查出的17个块的

行数据0x3c修改成0x2c(--HDFL--修改成--H-FL--)

[oracle@cjcos ~]$ vim repir.sh

#!/bin/sh

. ~/.bash_profile

cat sh.out | while read i

do

len=`echo p /d dba 13,$i offset 0 kdbt[0] | bbed parfile=bbed.par password=blockedit | grep 'kdbtnrow' | awk '{print $4}'`

if [ -n "$len" ];then

for ((j=0; j

do

offset=`echo p dba 13, $i *kdbr[$j]| bbed parfile=bbed.par password=blockedit | grep '^ub1*.*rowdata' | awk '{print $3}' |sed 's/@//g'`

echo "assign /x dba 13, $i offset $offset = 0x2c"

done

fi

echo "sum apply dba 13,$i"

done

77e4454a51e06a8bc8e94b5ec5eed1f2.png

[oracle@cjcos ~]$ chmod a+x repir.sh

[oracle@cjcos ~]$ ./repir.sh > repir.txt

[oracle@cjcos ~]$ cat repir.txt

assign /x dba 13, 131 offset 8083 = 0x2c

assign /x dba 13, 131 offset 7989 = 0x2c

assign /x dba 13, 131 offset 7874 = 0x2c

assign /x dba 13, 131 offset 7759 = 0x2c

assign /x dba 13, 131 offset 7655 = 0x2c

assign /x dba 13, 131 offset 7562 = 0x2c

assign /x dba 13, 131 offset 7449 = 0x2c

assign /x dba 13, 131 offset 7347 = 0x2c

assign /x dba 13, 131 offset 7241 = 0x2c

assign /x dba 13, 131 offset 7146 = 0x2c

assign /x dba 13, 131 offset 7031 = 0x2c

assign /x dba 13, 131 offset 6916 = 0x2c

assign /x dba 13, 131 offset 6801 = 0x2c

assign /x dba 13, 131 offset 6685 = 0x2c

assign /x dba 13, 131 offset 6571 = 0x2c

assign /x dba 13, 131 offset 6455 = 0x2c

assign /x dba 13, 131 offset 6340 = 0x2c

assign /x dba 13, 131 offset 6225 = 0x2c

assign /x dba 13, 131 offset 6109 = 0x2c

assign /x dba 13, 131 offset 5994 = 0x2c

assign /x dba 13, 131 offset 5878 = 0x2c

assign /x dba 13, 131 offset 5756 = 0x2c

assign /x dba 13, 131 offset 5655 = 0x2c

assign /x dba 13, 131 offset 5528 = 0x2c

assign /x dba 13, 131 offset 5420 = 0x2c

assign /x dba 13, 131 offset 5312 = 0x2c

assign /x dba 13, 131 offset 5197 = 0x2c

assign /x dba 13, 131 offset 5091 = 0x2c

assign /x dba 13, 131 offset 4996 = 0x2c

assign /x dba 13, 131 offset 4880 = 0x2c

assign /x dba 13, 131 offset 4764 = 0x2c

assign /x dba 13, 131 offset 4670 = 0x2c

assign /x dba 13, 131 offset 4575 = 0x2c

assign /x dba 13, 131 offset 4480 = 0x2c

assign /x dba 13, 131 offset 4386 = 0x2c

assign /x dba 13, 131 offset 4292 = 0x2c

assign /x dba 13, 131 offset 4198 = 0x2c

assign /x dba 13, 131 offset 4104 = 0x2c

assign /x dba 13, 131 offset 4010 = 0x2c

assign /x dba 13, 131 offset 3916 = 0x2c

assign /x dba 13, 131 offset 3821 = 0x2c

assign /x dba 13, 131 offset 3726 = 0x2c

assign /x dba 13, 131 offset 3631 = 0x2c

assign /x dba 13, 131 offset 3538 = 0x2c

assign /x dba 13, 131 offset 3443 = 0x2c

assign /x dba 13, 131 offset 3348 = 0x2c

assign /x dba 13, 131 offset 3254 = 0x2c

assign /x dba 13, 131 offset 3160 = 0x2c

assign /x dba 13, 131 offset 3066 = 0x2c

assign /x dba 13, 131 offset 2972 = 0x2c

assign /x dba 13, 131 offset 2878 = 0x2c

assign /x dba 13, 131 offset 2783 = 0x2c

assign /x dba 13, 131 offset 2688 = 0x2c

assign /x dba 13, 131 offset 2593 = 0x2c

assign /x dba 13, 131 offset 2498 = 0x2c

assign /x dba 13, 131 offset 2403 = 0x2c

assign /x dba 13, 131 offset 2308 = 0x2c

assign /x dba 13, 131 offset 2187 = 0x2c

assign /x dba 13, 131 offset 2067 = 0x2c

assign /x dba 13, 131 offset 1948 = 0x2c

assign /x dba 13, 131 offset 1850 = 0x2c

assign /x dba 13, 131 offset 1752 = 0x2c

assign /x dba 13, 131 offset 1639 = 0x2c

assign /x dba 13, 131 offset 1537 = 0x2c

assign /x dba 13, 131 offset 1418 = 0x2c

assign /x dba 13, 131 offset 1317 = 0x2c

assign /x dba 13, 131 offset 1196 = 0x2c

assign /x dba 13, 131 offset 1094 = 0x2c

sum apply dba 13,131

......

省略其他15个数据块内容......

assign /x dba 13, 148 offset 8056 = 0x2c

assign /x dba 13, 148 offset 7945 = 0x2c

assign /x dba 13, 148 offset 7813 = 0x2c

assign /x dba 13, 148 offset 7702 = 0x2c

assign /x dba 13, 148 offset 7567 = 0x2c

assign /x dba 13, 148 offset 7455 = 0x2c

sum apply dba 13,148

---把运行的结果在bbed中运行

先修复第一个数据块dba 13, 131的数据

(68行数据)

,看下效果

BBED>

assign /x dba 13, 131 offset 8083 = 0x2c

assign /x dba 13, 131 offset 7989 = 0x2c

assign /x dba 13, 131 offset 7874 = 0x2c

assign /x dba 13, 131 offset 7759 = 0x2c

assign /x dba 13, 131 offset 7655 = 0x2c

assign /x dba 13, 131 offset 7562 = 0x2c

assign /x dba 13, 131 offset 7449 = 0x2c

assign /x dba 13, 131 offset 7347 = 0x2c

assign /x dba 13, 131 offset 7241 = 0x2c

assign /x dba 13, 131 offset 7146 = 0x2c

assign /x dba 13, 131 offset 7031 = 0x2c

assign /x dba 13, 131 offset 6916 = 0x2c

assign /x dba 13, 131 offset 6801 = 0x2c

assign /x dba 13, 131 offset 6685 = 0x2c

assign /x dba 13, 131 offset 6571 = 0x2c

assign /x dba 13, 131 offset 6455 = 0x2c

assign /x dba 13, 131 offset 6340 = 0x2c

assign /x dba 13, 131 offset 6225 = 0x2c

assign /x dba 13, 131 offset 6109 = 0x2c

assign /x dba 13, 131 offset 5994 = 0x2c

assign /x dba 13, 131 offset 5878 = 0x2c

assign /x dba 13, 131 offset 5756 = 0x2c

assign /x dba 13, 131 offset 5655 = 0x2c

assign /x dba 13, 131 offset 5528 = 0x2c

assign /x dba 13, 131 offset 5420 = 0x2c

assign /x dba 13, 131 offset 5312 = 0x2c

assign /x dba 13, 131 offset 5197 = 0x2c

assign /x dba 13, 131 offset 5091 = 0x2c

assign /x dba 13, 131 offset 4996 = 0x2c

assign /x dba 13, 131 offset 4880 = 0x2c

assign /x dba 13, 131 offset 4764 = 0x2c

assign /x dba 13, 131 offset 4670 = 0x2c

assign /x dba 13, 131 offset 4575 = 0x2c

assign /x dba 13, 131 offset 4480 = 0x2c

assign /x dba 13, 131 offset 4386 = 0x2c

assign /x dba 13, 131 offset 4292 = 0x2c

assign /x dba 13, 131 offset 4198 = 0x2c

assign /x dba 13, 131 offset 4104 = 0x2c

assign /x dba 13, 131 offset 4010 = 0x2c

assign /x dba 13, 131 offset 3916 = 0x2c

assign /x dba 13, 131 offset 3821 = 0x2c

assign /x dba 13, 131 offset 3726 = 0x2c

assign /x dba 13, 131 offset 3631 = 0x2c

assign /x dba 13, 131 offset 3538 = 0x2c

assign /x dba 13, 131 offset 3443 = 0x2c

assign /x dba 13, 131 offset 3348 = 0x2c

assign /x dba 13, 131 offset 3254 = 0x2c

assign /x dba 13, 131 offset 3160 = 0x2c

assign /x dba 13, 131 offset 3066 = 0x2c

assign /x dba 13, 131 offset 2972 = 0x2c

assign /x dba 13, 131 offset 2878 = 0x2c

assign /x dba 13, 131 offset 2783 = 0x2c

assign /x dba 13, 131 offset 2688 = 0x2c

assign /x dba 13, 131 offset 2593 = 0x2c

assign /x dba 13, 131 offset 2498 = 0x2c

assign /x dba 13, 131 offset 2403 = 0x2c

assign /x dba 13, 131 offset 2308 = 0x2c

assign /x dba 13, 131 offset 2187 = 0x2c

assign /x dba 13, 131 offset 2067 = 0x2c

assign /x dba 13, 131 offset 1948 = 0x2c

assign /x dba 13, 131 offset 1850 = 0x2c

assign /x dba 13, 131 offset 1752 = 0x2c

assign /x dba 13, 131 offset 1639 = 0x2c

assign /x dba 13, 131 offset 1537 = 0x2c

assign /x dba 13, 131 offset 1418 = 0x2c

assign /x dba 13, 131 offset 1317 = 0x2c

assign /x dba 13, 131 offset 1196 = 0x2c

assign /x dba 13, 131 offset 1094 = 0x2c

BBED>

sum apply dba 13,131

Check value for File 13, Block 131:

current = 0x4aca, required = 0x4aca

SQL> alter system flush buffer_cache;

System altered.

SQL> select count(*) from t1;

COUNT(*)

----------

68

可以看到第一个数据块里的68条数据已经恢复成功。

同理,恢复剩下16个数据块的数据

......

SQL> alter system flush buffer_cache;

System altered.

SQL> select count(*) from t1;

COUNT(*)

----------

998

a322e9caa2bc9dfc445bf2a51b2953f9.png

注意:

尝试向恢复的表里插入数据:

报如下错误,

并且自动中断了实例

,看来使用bbed直接修改数据块是有一定风险的,

产环境需谨慎使用

SQL> insert into t1 select *from t1;

insert into t1 select *from t1

*

ERROR at line 1:

ORA-00603: ORACLE server session terminated by fatal error

ORA-00600: internal error code, arguments: [2032], [54526098], [1225216857],

[8192], [3], [255], [1162101599], [4134602241], [], [], [], []

ORA-00600: internal error code, arguments: [2032], [54526098], [1225216857],

[8192], [3], [255], [1162101599], [4134602241], [], [], [], []

ORA-00600: internal error code, arguments: [2032], [54526098], [1225216857],

[8192], [3], [255], [1162101599], [4134602241], [], [], [], []

Process ID: 3081

Session ID: 390 Serial number: 12672

6c58b005a628867bd17d4b7c17f23f40.png

[oracle@cjcos trace]$ pwd

/u01/app/oracle/diag/rdbms/cjcdb/cjcdb/trace

[oracle@cjcos trace]$ vim alert_cjcdb.log

321c54b73f5e117b9641b134e950ff0c.png

......

005343c296da2474ed21cee0480af31a.png

通过BBED

恢复完

T1

表后,最好马上执行

CTAS

T1

数据备份到

T2

表中:

SQL> conn / as sysdba

SQL> startup

SQL> alter session set container=cjcpdb;

SQL> startup

SQL> conn cjc/cjc@cjcpdb

SQL> create table t2 as select *from t1;

备份完成后删除T1

表,并将

T2

表名改成

T1

SQL> drop table t1 purge;

SQL> rename t2 to t1;

Table renamed.

再次插入数据就正常了

SQL> insert into t1 select * from t1;

998 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from t1;

COUNT(*)

----------

1996

---

本文参考 qxy0503---表删除恢复脚本(bbed脚本恢复删除的表数据)

欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!

e173bbefb4b28265fba89e2a27adeff3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值