clob类型数据的内部存储格式解析.docx
- 文档编号:11484501
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:15
- 大小:19.85KB
clob类型数据的内部存储格式解析.docx
《clob类型数据的内部存储格式解析.docx》由会员分享,可在线阅读,更多相关《clob类型数据的内部存储格式解析.docx(15页珍藏版)》请在冰豆网上搜索。
clob类型数据的内部存储格式解析
clob类型数据的内部存储格式解析
Clob类型字段的内部存储初步探索
前言:
本篇文章仅供参考,此为一家之言,仅代表个人观点,欢迎有有此爱好的同行门拍砖,其中部分结构还没有搞清除。
我google/baidu了n多次,目前尚未在web上发现关于此类的文章。
本人有幸从WEB上得到了一些关于oracle数据类型内部存储的介绍类的文章,于是尝试解析lob类型字段。
废话来来。
开始干活。
:
)
1。
Dsi中介绍的LOB类型的内部结构。
TherearethreestructuresforinternalLOBs:
–LOBLocator:
kolbl(20bytes)
–LOBInode:
kdlinode(16bytesminimum)
–Dataarray
•Thephysicallocationofthesethreecomponents
couldbeuptothreedifferentsegments:
len
(2),vsn
(2),flg(4),bytl
(2),lobid(10),inode(16),
data
len=maximumlengthoftheLOBlocatorexcludingthesetwolenbytes
vsn=versionoftheLOBlocatorstructure
flg=4flagbytes
bytl=bytelength(1forBLOB/CLOB/BFILE.ValueforNCLOB)
lobid=2bytesforindexfollowedby8byteLOBOID.KeyintoLOBindex
inode=kdlinodestructure
data=actualLOBdata
InternalLOBlocatorwithoutinode:
len
(2),vsn
(2),flg(4),bytl
(2),lobid(10)
Len=maximumlengthoftheLOBlocatorexcludingthesetwolenbytes
vsn=versionoftheLOBlocatorstructure
flg=4flagbytes
bytl=bytelength(1forBLOB/CLOB/BFILE.ValueforNCLOB)
lobid=2bytesforindexfollowedby8byteLOBOID.KeyintoLOBindex
SQL*Plus:
Release10.2.0.3.0-ProductiononÐÇÆÚ¶þ5ÔÂ2704:
46:
432008
Copyright(c)1982,2006,Oracle.AllRightsReserved.
Connectedto:
OracleDatabase10gEnterpriseEditionRelease10.2.0.3.0-64bitProduction
WiththePartitioning,OLAPandDataMiningoptions
SQL>dropuserlsliangcascade;
Userdropped.
SQL>droptablespacetest;
Tablespacedropped.
SQL>createtablespacetestdatafile'/oracle/oradata/sunha5/test01.dbf'size1mreuse;
Tablespacecreated.
SQL>createuserlsliangidentifiedbylsliang;
Usercreated.
SQL>grantdbatolsliang;
Grantsucceeded.
SQL>connlsliang/lsliang;
Connected.
SQL>createtabletest(idnumber,namevarchar2(10),textclob)tablespacetest;
Tablecreated.
SQL>insertintotestvalues(1,'lsl','aaaaa');
1rowcreated.
SQL>commit;
Commitcomplete.
SQL>altersystemcheckpoint;
Systemaltered.
SQL>
SQL>selectrowidfromtest;
ROWID
------------------
AAAPIoAAVAAAAAQAAA
SQL>
[oracle@sunha2baby]$perlrowid.plAAAPIoAAVAAAAAQAAA
ForthisRowid:
AAAPIoAAVAAAAAQAAA
Thedba_objets--data_object_id=61992
Thedata_file--datafile#=21
Thedata_block--data_block#=16
ThisRecordinthedatablockis0
##rowid.pl是一个解析rowid的perl脚本,具体rowid如何解析请参考网络上的文章。
[oracle@sunha5sunha5]$./a.outtest01.dbf16
file#:
21
block#:
16
type:
0X6
fmt:
0Xa2--0X02
rdba:
0X5400010
basSCN:
0Xf4a9a73
wrapSCN:
0X0000
flag:
0X6
chk:
0Xb6e0
数据块的块头的信息。
A.out为解析数据文件块头的c程序,具体请参考网络上数据块的结构。
Via1
***2008-05-2705:
44:
53.154
***ACTIONNAME:
()2008-05-2705:
44:
53.153
***MODULENAME:
(SQL*Plus)2008-05-2705:
44:
53.153
***SERVICENAME:
(SYS$USERS)2008-05-2705:
44:
53.153
***SESSIONID:
(1652.49666)2008-05-2705:
44:
53.153
Startdumpdatablockstsn:
22file#:
21minblk16maxblk16
buffertsn:
22rdba:
0x05400010(21/16)
scn:
0x0000.0f4a9a73seq:
0x03flg:
0x06tail:
0x9a730603
frmt:
0x02chkval:
0xb6e0type:
0x06=transdata
Hexdumpofblock:
st=0,typ_found=1
Hexdumpofblock:
st=0,typ_found=1
Dumpofmemoryfrom0x0000000106768C00to0x000000010676AC00
106768C0006A20000054000100F4A9A7300000306[.....@...J.s....]
106768C10B6E00000012700190000F2280F4A99DE[.....'.....(.J..]
106768C20000000001F0232000540000900370026[......2..@...7.&]
106768C30000006190080038401052D0020010000[..........-....]
......................
......................
10676AB90010078D02C000FFF00000000FFFFFFFF[..x.,...........]
10676ABA07FFEEEB8000000041E629308003E002C[.........b...>.,]
10676ABB00000800000000027C20F3F4BC5162F24[.......'..?
K../$]
10676ABC0154A062C010302C102036C736C2E0054[.J.,......lsl..T]
10676ABD00001020C800000020000000100000038[...............8]
10676ABE0EF33001A090000000000000A00000000[.3..............]
10676ABF00001006100610061006100619A730603[...a.a.a.a.a.s..]
Blockheaderdump:
0x05400010
ObjectidonBlock?
Y
seg/obj:
0xf228csc:
0x00.f4a99deitc:
2flg:
Etyp:
1-DATA
brn:
0bdba:
0x5400009ver:
0x01opc:
0
inc:
0exflg:
0
ItlXidUbaFlagLckScn/Fsc
0x010x0037.026.000006190x00800384.0105.2d--U-1fsc0x0000.0f4a9a73
0x020x0000.000.000000000x00000000.0000.00----0fsc0x0000.00000000
data_block_dump,dataheaderat0x106768c64
===============
tsiz:
0x1f98
hsiz:
0x14
pbl:
0x106768c64
bdba:
0x05400010
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f5f
avsp=0x1f4b
tosp=0x1f4b
0xe:
pti[0]nrow=1offs=0
0x12:
pri[0]offs=0x1f5f
block_row_dump:
tab0,row0,@0x1f5f
tl:
57fb:
--H-FL--lb:
0x1cc:
3
col0:
[2]c102
col1:
[3]6c736c
col2:
[46]
00540001020c800000020000000100000038ef33001a090000
000000000a00000000000100610061006100610061
end_of_block_dump
Enddumpdatablockstsn:
22file#:
21minblk16maxblk16
解说:
对于数据长度小于4000的情况,lob列的数据存放在行内,如上图,数据的存储格式是ascii码存放。
Lob数据的结构,头部最大为84字节,最小为36字节
对于本例:
2E0054[.J.,......lsl..T]
10676ABD00001020C800000020000000100000038[...............8]
10676ABE0EF33001A090000000000000A00000000[.3..............]
10676ABF00001006100610061006100619A730603[...a.a.a.a.a.s..]
2E:
列的长度46--col2:
[46]
0054lobhead的最大长度,
0001vsn
020c8000flag
0002数据的单位长度为2个字节。
0000000100000038ef33lob_id
001a090000000000000a000000000001inodeid
00610061006100610061data数据:
我们插入的那5个a.
经过我的测试对inodeid最后一位是一个开关变量(01,02)
01表示数据在行内存放,
02表示数据存储在log段中。
SQL>@a.sql;
PL/SQLproceduresuccessfullycompleted.
SQL>altersystemcheckpoint;
Systemaltered.
SQL>commit;
Commitcomplete.
Morea.sql;
--------------------------
declare
aclob;
bvarchar2(32000);
begin
b:
=lpad('a',4000,'a');
a:
=a||b;
--a:
=a||a;
--a:
=a||a;
--a:
=a||a;
--a:
=a||a;
--a:
=a||a;
--a:
=a||a;
updatelsliang.testsettext=a;
commit;
end;
/
---------------------------------
##a.sql用来更新lob字段。
OracleDatabase10gEnterpriseEditionRelease10.2.0.3.0-64bitProduction
WiththePartitioning,OLAPandDataMiningoptions
SQL>altersystemdumpdatafile21block16;
Systemaltered.
SQL>
Blockheaderdump:
0x05400010
ObjectidonBlock?
Y
seg/obj:
0xf228csc:
0x00.f4b132citc:
2flg:
Etyp:
1-DATA
brn:
0bdba:
0x5400009ver:
0x01opc:
0
inc:
0exflg:
0
ItlXidUbaFlagLckScn/Fsc
0x010x0037.026.000006190x00800384.0105.2dC---0scn0x0000.0f4a9a73
0x020x0017.026.00000ae00x00801869.01b9.3c--U-1fsc0x0006.0f4b132d
data_block_dump,dataheaderat0x106768c64
===============
tsiz:
0x1f98
hsiz:
0x14
pbl:
0x106768c64
bdba:
0x05400010
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f2c
avsp=0x1f4b
tosp=0x1f51
0xe:
pti[0]nrow=1offs=0
0x12:
pri[0]offs=0x1f2c
block_row_dump:
tab0,row0,@0x1f2c
tl:
51fb:
--H-FL--lb:
0x2cc:
3
col0:
[2]c102
col1:
[3]6c736c
col2:
[40]
00540001020c800000020000000100000038ef340014050000
0000001f4000000000000205400018
end_of_block_dump
Enddumpdatablockstsn:
22file#:
21minblk16maxblk16
0054lobhead的最大长度,
0001vsn
020c8000flag
0002数据的单位长度为2个字节。
0000000100000038ef34lob_id
00140500000000001f40000000000002inodeid
05400018data部分没有了,取而代之的是rdba
我们来看看ox05400018放的是什么东西。
SQL*Plus:
Release10.2.0.3.0-ProductiononÐÇÆÚ¶þ5ÔÂ2707:
00:
182008
Copyright(c)1982,2006,Oracle.AllRightsReserved.
Connectedto:
OracleDatabase10gEnterpriseEditionRelease10.2.0.3.0-64bitProduction
WiththePartitioning,OLAPandDataMiningoptions
SQL>altersystemdumpdatafile21block24;
Systemaltered.
SQL>
[oracle@sunha5sunha5]$./a.outtest01.dbf24
file#:
21
block#:
24
type:
0X28
fmt:
0Xa2--0X02
rdba:
0X5400018
basSCN:
0Xf4b132c
wrapSCN:
0X0000
flag:
0X4
chk:
0X10c3
***2008-05-2707:
00:
32.904
***SERVICENAME:
(SYS$USERS)2008-05-2707:
00:
32.904
***SESSIONID:
(510.3928)2008-05-2707:
00:
32.904
Startdumpdatablockstsn:
22file#:
21minblk24maxblk24
buffertsn:
22rdba:
0x05400018(21/24)
scn:
0x0000.0f4b132cseq:
0x02flg:
0x04tail:
0x132c2802
frmt:
0x02chkval:
0x10c3type:
0x28=PAGETABLEMANAGEDLOBBLOCK
Hexdumpofblock:
st=0,typ_found=1
Dumpofmemoryfrom0x0000000106768C00to0x000000010676AC00
106768C0028A20000054000180F4B132C00000204[(....@...K.,....]
106768C1010C300000000F2290000000100000038[.......).......8]
106768C20EF340000000000010000000000000000[.4..............]
106768C3005400011000000000061006100610061[.@.......a.a.a.a]
106768C4000610061006100610061006100610061[.a.a.a.a.a.a.a.a]
Repeat498times
10676AB7000610061006100610020002000200020[.a.a.a.a....]
10676AB8000200020002000200020002000200020[........]
Repeat6times
10676ABF0002000200020002000200020132C2802[.......,(.]
Longfieldblockdump:
ObjectId61993
LobId:
000100038EF34PageNo0
Version:
0x0000.00000001pdba:
88080401
006100610061006100610061006100610061006100610061
006100610061006100610061006100610061006100610061
006100610061006100610061006100610061006100610061
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
006100610061006100610061006100610061006100610061
006100610061006100610061006100610061006100610061
006100610061006100610061006100610061006100610061
006100610061006100200020002000200020002000200020
002000200020002000200020002000200020002000200020
002000200020002000200020002000200020002000200020
002000200020002000200020002000200020
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- clob 类型 数据 内部 存储 格式 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)