日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

oracle update 数据库恢复,ORACLE update 操作内部原理

發布時間:2024/9/19 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle update 数据库恢复,ORACLE update 操作内部原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于oracle的update操作,在數據塊中具體是如何出來,是直接更新原來值,還是通過插入新值修改指針的方法實現.下面通過證明:

模擬表插入數據

SQL> create table t_xifenfei(id number,name varchar2(10));

Table created.

SQL> insert into t_xifenfei values(1,'XFF');

1 row created.

SQL> insert into t_xifenfei values(2,'CHF');

1 row created.

SQL> commit;

Commit complete.

SQL> alter system checkpoint;

System altered.

SQL> select id,rowid,

2 dbms_rowid.rowid_relative_fno(rowid)rel_fno,

3 dbms_rowid.rowid_block_number(rowid)blockno,

4 dbms_rowid.rowid_row_number(rowid) rowno

5 from t_xifenfei;

ID ROWID REL_FNO BLOCKNO ROWNO

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

1 AAASc+AAEAAAACvAAA 4 175 0

2 AAASc+AAEAAAACvAAB 4 175 1

SQL> alter system dump datafile 4 block 175;

System altered.

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

VALUE

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

/u01/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_24625.trc

數據存儲對應16進制值

SQL> select dump(1,'16') from dual;

DUMP(1,'16')

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

Typ=2 Len=2: c1,2

SQL> select dump(2,'16') from dual;

DUMP(2,'16')

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

Typ=2 Len=2: c1,3

SQL> select dump('XFF','16') FROM DUAL;

DUMP('XFF','16')

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

Typ=96 Len=3: 58,46,46

SQL> SELECT DUMP('CHF','16') FROM DUAL;

DUMP('CHF','16')

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

Typ=96 Len=3: 43,48,46

得出第一條記錄對應值為:02c10203584646;第二條記錄對應值為:02c10303434846

dump 數據塊得到記錄

bdba: 0x010000af

data_block_dump,data header at 0xb683c064

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

tsiz: 0x1f98

hsiz: 0x16

pbl: 0xb683c064

76543210

flag=--------

ntab=1

nrow=2

frre=-1

fsbo=0x16

fseo=0x1f84

avsp=0x1f6e

tosp=0x1f6e

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

0x12:pri[0] offs=0x1f8e ---->8078

0x14:pri[1] offs=0x1f84 ---->8068

block_row_dump:

tab 0, row 0, @0x1f8e

tl: 10 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 2] c1 02

col 1: [ 3] 58 46 46

tab 0, row 1, @0x1f84

tl: 10 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 2] c1 03

col 1: [ 3] 43 48 46

end_of_block_dump

End dump data blocks tsn: 4 file#: 4 minblk 175 maxblk 175

bbed查看相關記錄

BBED> p kdbr

sb2 kdbr[0] @118 8078

sb2 kdbr[1] @120 8068

BBED> p *kdbr[0]

rowdata[10]

-----------

ub1 rowdata[10] @8178 0x2c

BBED> x /rnc

rowdata[10] @8178

-----------

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

lock@8179: 0x01

cols@8180: 2

col 0[2] @8181: 1

col 1[3] @8184: XFF

BBED> p *kdbr[1]

rowdata[0]

----------

ub1 rowdata[0] @8168 0x2c

BBED> x /rnc

rowdata[0] @8168

----------

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

lock@8169: 0x01

cols@8170: 2

col 0[2] @8171: 2

col 1[3] @8174: CHF

BBED> d

File: /u01/oracle/oradata/ora11g/users01.dbf (4)

Block: 175 Offsets: 8168 to 8191 Dba:0x010000af

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

2c010202 c1030343 48462c01 0202c102 03584646 010650e5

<32 bytes per line>

這里可以得到結論如下:

1.數據是從塊的底部開始往上存儲

2.在每一條記錄的頭部分別有flag/lock/cols對應這里的2c0102

3.這里的偏移量和dump出來的數據可以看出來兩條記錄是連續在一起(偏移量分別為:8168和8178)

更新一條記錄

SQL> update t_xifenfei set name='XIFENFEI' where id=1;

1 row updated.

SQL> commit;

Commit complete.

SQL> alter system checkpoint;

System altered.

SQL> alter system dump datafile 4 block 175;

System altered.

SQL> select dump('XIFENFEI','16') from dual;

DUMP('XIFENFEI','16')

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

Typ=96 Len=8: 58,49,46,45,4e,46,45,49

我們可以但看到值有XFF改變為XIFENFEI,存儲長度變大

dump數據塊信息

bdba: 0x010000af

data_block_dump,data header at 0xb683c064

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

tsiz: 0x1f98

hsiz: 0x16

pbl: 0xb683c064

76543210

flag=--------

ntab=1

nrow=2

frre=-1

fsbo=0x16

fseo=0x1f75

avsp=0x1f69

tosp=0x1f69

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

0x12:pri[0] offs=0x1f75 ---->8053

0x14:pri[1] offs=0x1f84 ---->8068

block_row_dump:

tab 0, row 0, @0x1f75

tl: 15 fb: --H-FL-- lb: 0x2 cc: 2

col 0: [ 2] c1 02

col 1: [ 8] 58 49 46 45 4e 46 45 49

tab 0, row 1, @0x1f84

tl: 10 fb: --H-FL-- lb: 0x0 cc: 2

col 0: [ 2] c1 03

col 1: [ 3] 43 48 46

end_of_block_dump

End dump data blocks tsn: 4 file#: 4 minblk 175 maxblk 175

通過對比第一次dump出來的數據塊發現:row 0的值和偏移量發生了變化

bbed查看相關記錄

BBED> set file 4 block 175

FILE# 4

BLOCK# 175

BBED> map

File: /u01/oracle/oradata/ora11g/users01.dbf (4)

Block: 175 Dba:0x010000af

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

KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes @0

struct ktbbh, 72 bytes @20

struct kdbh, 14 bytes @100

struct kdbt[1], 4 bytes @114

sb2 kdbr[2] @118

ub1 freespace[8031] @122

ub1 rowdata[35] @8153

ub4 tailchk @8188

BBED> p kdbr

sb2 kdbr[0] @118 8053

sb2 kdbr[1] @120 8068

BBED> p *kdbr[1]

rowdata[15]

-----------

ub1 rowdata[15] @8168 0x2c

BBED> x /rnc

rowdata[15] @8168

-----------

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

lock@8169: 0x00

cols@8170: 2

col 0[2] @8171: 2

col 1[3] @8174: CHF

BBED> p *kdbr[0]

rowdata[0]

----------

ub1 rowdata[0] @8153 0x2c

BBED> x /r

rowdata[0] @8153

----------

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

lock@8154: 0x02

cols@8155: 2

col 0[2] @8156: 0xc1 0x02

col 1[8] @8159: 0x58 0x49 0x46 0x45 0x4e 0x46 0x45 0x49

BBED> set count 64

COUNT 64

<32 bytes per line>

BBED> d /v

File: /u01/oracle/oradata/ora11g/users01.dbf (4)

Block: 175 Offsets: 8153 to 8191 Dba:0x010000af

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

2c020202 c1020858 4946454e 4645492c l ,......XIFENFEI,

000202c1 03034348 462c0002 02c10203 l ......CHF,......

58464602 068de8 l XFF....

<16 bytes per line>

從這里可以看到

1.這里可以看到三個值(XFF,CHF,XIFENFEI)均存在,但是通過p kdbr和dump block不能看到,因為row directory中無指針指定到該值上

2.也是通過row directory指針使得我們從原先看到的第一條記錄處于數據塊最底部變成了現在相對而言的數據部分最上層,

3.絕大多數情況:數據庫更新一條記錄,不是直接修改數據值,而是重新插入一條新記錄,然后修改row directory指針指定到新的offset上

4.不是直接update,而是insert+指針來實現,這樣做的好處:1)如果修改記錄update值的長度發生變化(變大或者變小)那么該值之前的數據都要發生變動,對數據庫來說成本太高.2)如果直接更新值可能導致其他數據變動,使得其他行受到影響.

5.由于是修改row directory指針,所以該處理方法的rowid值不會發生變化

總結

以上是生活随笔為你收集整理的oracle update 数据库恢复,ORACLE update 操作内部原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。