您的位置:首页 > 数据库 > Oracle

oracle bbed恢复update数据

2018-01-25 17:09 225 查看
人生有两出悲剧。一是万念俱灰;另一是踌躇满志。------------萧伯纳



oracle修改表字段数据时,当修改数据数据长度不变时,oracle将在数据块行数据中直接修改数据。

如果修改数据长度变长或者变短,oracle将在数据块中新加入一行数据,故如若oracle数据库中数据

被修改,可以通过修改数据块row directory指针指向,找回旧值。

一、基础信息获取

1.1,查询数据

SQL> select * from vehicle;

        XH HPHM                                     HPZL   CCDJRQ

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

    430002 A88888                                   02     18-OCT-17

1.2,根据rowid获取数据所在数据文件和数据块。

SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from vehicle;

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

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

                                   5                                   12    

1.3,dump数据块信息,获取内部结构信息

SQL> oradebug setmypid         

Statement processed. 

SQL> alter system dump datafile 5 block 12;       

System altered.

SQL> 

SQL> oradebug tracefile_name

/oracle/app/oracle/admin/DB10G/udump/db10g_ora_2280.trc    

1.4,查看日志信息,获取dump信息

data_block_dump,data header at 0xdc72464

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

tsiz: 0x1f98

hsiz: 0x14

pbl: 0x0dc72464

bdba: 0x0140000c

     76543210

flag=--------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1f60

avsp=0x1f6a

tosp=0x1f6a

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

0x12:pri[0]     offs=0x1f7e

block_row_dump:

tab 0, row 0, @0x1f7e

tl: 26 fb: --H-FL-- lb: 0x1  cc: 4

col  0: [ 4]  c3 2c 01 03

col  1: [ 6]  41 38 38 38 38 38

col  2: [ 2]  30 32

col  3: [ 7]  78 75 0a 12 03 0b 24

end_of_block_dump

End dump data blocks tsn: 6 file#: 5 minblk 12 maxblk 12

二,数据修改测试(同长度修改)

2.1,bbed查看原数据

BBED> set dba 5,12

        DBA             0x0140000c (20971532 5,12)                         

BBED> p kdbr

sb2 kdbr[0]                                 @118      8062

BBED> set offset 8162

        OFFSET          8162

BBED> d /v

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12      Offsets: 8162 to 8191  Dba:0x0140000c

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

 2c010404 c32c0103 06413838 38383802 l ,....,...A88888.

 30320778 750a1203 0b240206 6525     l 02.xu....$..e%

 <16 bytes per line> 

2.2,修改数据,数据长度与原数据一样

SQL> update vehicle set hphm='A11111' where hphm='A88888';

1 row updated.

SQL> commit;

Commit complete.

2.3,使用bbed查看数据

BBED> set dba 5,12

        DBA             0x0140000c (20971532 5,12)

BBED> p kdbr

sb2 kdbr[0]                                 @118      8062

BBED> set offset 8162

        OFFSET          8162

BBED> d /v

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12      Offsets: 8162 to 8191  Dba:0x0140000c

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

 2c020404 c32c0103 06413131 31313102 l ,....,...A11111.

 30320778 750a1203 0b240206 60d7     l 02.xu....$..`.

 <16 bytes per line>

可以看到,表中还是一条数据,数据头结构中记录的kdbr[0]指针指向的地址还是8062,加上相对偏移量后

数据实际位置为8162,根据dump出来的信息,可以看到,修改的数据已经记录在数据库中了。

三、数据修改测试(不同长度数据修改)  

3.1,修改数据

SQL> update vehicle set hphm='A99999999' where hphm='A11111';

1 row updated.

SQL> commit;

Commit complete. 

3.2,使用bbed查看数据

BBED> set dba 5,12

        DBA             0x0140000c (20971532 5,12)

BBED> p kdbr

sb2 kdbr[0]                                 @118      8003

BBED> set offset 8103

        OFFSET          8103

BBED> d /v

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12      Offsets: 8103 to 8191  Dba:0x0140000c

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

 2c010404 c32c0103 09413939 39393939 l ,....,...A999999

 39390230 32077875 0a12030b 242c0004 l 99.02.xu....$,..

 04c32c01 030a4138 38383838 38383838 l ..,...A888888888

 02303207 78750a12 030b242c 000404c3 l .02.xu....$,....

 2c010306 41313131 31310230 32077875 l ,...A11111.02.xu

 0a12030b 24020652 d9                l ....$..R.

 

 <16 bytes per line>    

3.3,可以看到,数据块中,数据头结构中记录的kdbr[0]指针指向的地址变为8003,加上相对偏移量后

数据实际位置为8103,根据dump出来的信息,可以看到,修改的数据已经记录在数据库中了。

四,找回修改的数据

4.1,由上面的数据信息我们可以知道,当修改数据长度与原数据不一致时,数据其实在数据块中还是存在的,

我们通过修改数据块row directory中的指针信息,可以把原有的数据找回来。

4.2,bbed修改row directory指针信息

BBED> p kdbr

sb2 kdbr[0]                                 @118      8003

原数据所在偏移量为8162,减去一个相对值,绝对路径值为8162-100=8062

BBED> set offset 118

        OFFSET          118

BBED> d

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12               Offsets:  118 to  629           Dba:0x0140000c

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

 431f0000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

SQL> select to_number('1f43','xxxx') from dual;

TO_NUMBER('1F43','XXXX')

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

                    8003  

SQL> select to_char(8062,'XXXX') from dual;

TO_CHAR(8062,'X

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

 1F7E

BBED> modify /x 7e1f

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12               Offsets:  118 to  629           Dba:0x0140000c

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

 7e1f0000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

BBED> sum apply

Check value for File 5, Block 12:

current = 0x60a0, required = 0x60a0

BBED> verify

DBVERIFY - Verification starting

FILE = /oracle/app/data/DB10G/dt_tpc_dat01.dbf

BLOCK = 12

Block Checking: DBA = 20971532, Block Type = KTB-managed data block

data header at 0x6d02264

kdbchk: xaction header lock count mismatch

        trans=1 ilk=1 nlo=0

Block 12 failed with check code 6108

DBVERIFY - Verification complete

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 1

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0

4.3,修正错误

BBED> set offset 8103

        OFFSET          8103

BBED> d /v

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12      Offsets: 8103 to 8191  Dba:0x0140000c

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

 2c010404 c32c0103 09413939 39393939 l ,....,...A999999

BBED> set offset 8162

        OFFSET          8162

BBED> d /v

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12      Offsets: 8162 to 8191  Dba:0x0140000c

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

 2c000404 c32c0103 06413131 31313102 l ,....,...A11111.

BBED> modify /x 01 offset +1

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12               Offsets: 8163 to 8191           Dba:0x0140000c

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

 010404c3 2c010306 41313131 31310230 32077875 0a12030b 24020652 d9 

BBED> set offset 8103

        OFFSET          8103

BBED> modify /x 00 offset +1

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12               Offsets: 8104 to 8191           Dba:0x0140000c

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

 000404c3 2c010309 41393939 39393939 39023032 0778750a 12030b24 2c000404

BBED> sum apply

Check value for File 5, Block 12:

current = 0x61a1, required = 0x61a1

BBED> verify

DBVERIFY - Verification starting

FILE = /oracle/app/data/DB10G/dt_tpc_dat01.dbf

BLOCK = 12

Block Checking: DBA = 20971532, Block Type = KTB-managed data block

data header at 0x621c264

kdbchk: the amount of space used is not equal to block size

        used=46 fsc=0 avsp=8039 dtl=8088

Block 12 failed with check code 6110

DBVERIFY - Verification complete

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 1

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0

BBED> p kdbh

struct kdbh, 14 bytes                       @100     

   ub1 kdbhflag                             @100      0x00 (NONE)

   b1 kdbhntab                              @101      1

   b2 kdbhnrow                              @102      1

   sb2 kdbhfrre                             @104     -1

   sb2 kdbhfsbo                             @106      20

   sb2 kdbhfseo                             @108      8003

   b2 kdbhavsp                              @110      8039

   b2 kdbhtosp                              @112      8039

SQL> select to_char(8042,'XXXX') from dual;

TO_CHAR(8042,'X

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

 1F6A

BBED> set offset 110

        OFFSET          110   

BBED> d /v

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12      Offsets:  110 to  621  Dba:0x0140000c

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

 671f671f 00000100 7e1f0000 00000000 l g.g.....~.......

BBED> modify /x 6a1f

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12               Offsets:  110 to  621           Dba:0x0140000c

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

 6a1f671f 00000100 7e1f0000 00000000 00000000 00000000 00000000 00000000

BBED> set offset 112

        OFFSET          112

BBED> modify /x 6a1f

 File: /oracle/app/data/DB10G/dt_tpc_dat01.dbf (5)

 Block: 12               Offsets:  112 to  623           Dba:0x0140000c

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

 6a1f0000 01007e1f 00000000 00000000 00000000 00000000 00000000 00000000 

BBED> sum apply

Check value for File 5, Block 12:

current = 0x61a1, required = 0x61a1

BBED> verify

DBVERIFY - Verification starting

FILE = /oracle/app/data/DB10G/dt_tpc_dat01.dbf

BLOCK = 12

DBVERIFY - Verification complete

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 0

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0 

五,数据验证

至此,数据库数据恢复已经全部完成,我们可以查询数据,可以发现数据已经变为旧值。所有结论得到验证。

SQL> alter system flush buffer_cache;

System altered.

SQL>  select * from vehicle

        XH HPHM                                                         HPZL   CCDJRQ

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

    430002 A11111                                                       02     18-OCT-17

喜欢的朋友可以扫描以下二维码进行关注,公众号将每天更新文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bbed 恢复 update kdbchk