a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 159|回复: 2

[其他] Oracle认证:OracleDatablock的物理结构

[复制链接]
发表于 2012-8-4 13:41:06 | 显示全部楼层 |阅读模式
自年夜在数据库中可以运行Java后,Oracle最令人感动的新特征被Java阐扬到了最年夜化,但与之呈现的问题也常困扰着开发人员,本文例出三个最常见的问题,但愿对有此困扰的伴侣有所辅佐。, t) M& P' ?- T5 C
  问题一:如保加载JDBC驱动轨范:1 }$ |% ]' m4 \
  正常我们加载驱动轨范有三个路子:5 |- a, e! z9 M! [& {2 a
  1)Class.forName(String)这想当于classLoader一个String指定的类,在装载时把该驱动轨范的静态内容都初始化,其拭魅这时驱动轨范类挪用了DriverManager.registerDriver(driver)体例。( x4 U9 A" n; u- d
  2)使用系统属性:System.getProperty().load(new FileInputStream("属性文件")); 在属性文件中指定jdbc.driver=drivername 这样的益处是可以同时加载多个JDBC,换数据库时不用访谒JAVA源代码,只是改削属性文件。
4 X# \0 y' B. V  3)直接registerDriver(driver)这种体例最靠得住,可以在任何情形下使用。 1)体例简单,但MS的JVM不能正确初始化。好比使用IE时在APPLET中就不能使用,应该用3)的体例。但3)体例在矫捷性方面不如2),可以按照情形综合考虑。
: S( q) P0 E1 ^, J( j5 l% O/ [  问题二:年夜对象存储
& c6 A$ O8 B# a  Q$ c) J  一般来说,年夜对象存储是把文件存到数据库中,当然也可以内存中的超年夜字符串。对于象图片这样的文件当然是用二进制存储,这里有良多误区,收集上的教程99%都是行欠亨的,连 SUN自己的文档都一向错误,虽然错误很小。按说二进制文件应该存为BLOB类型,但JBDC2并不能直接对BLOB存入二进制文件,如不美观你这样做,会获得一个IO而不是SQL异常,为此花了我近两个小时才弄清嚣张。
+ Q: J# S! E9 V6 p; x, t  如不美观要把一个二制文件存入ORACLE,用尺度的JDBC你就要用LONG ROW类型:# l- E8 \; z  ^* g' \3 f
  create table tb_file(name varchar(20),detail long row);5 ]% X: H0 u  G. V0 t2 ?, F  }; \
  然后$ @  u( g- l# b2 M7 D$ M- E1 s
  File file = new File("aaa.gif"); ! H  N# z2 [9 V; m2 y' S
  int fileLength =(int) file.length();
) [0 _" O. h7 S" D  InputStream fin = new FileInputStream(file);! r# ?9 o$ G6 j" x# G( R4 C
  PreparedStatement pstmt =% h. V3 _: @5 D  ~. p7 L: T
  con.prepareStatement("insert into tb_file values('aaa.gif',?)");
) ]' V7 o1 Q1 Y# }: ~/ ?  pstmt.setBinaryStream (1, fin, fileLength); pstmt.executeUpdate();1 G5 J8 K2 t) `- a: d1 ]3 I' u8 Z
  如不美观你必然要用BLOB存储,你就必需用ORACLE自己的体例:8 U4 o3 w3 O' {0 K! C9 |
  create table tb_file(name varchar(20),detail BLOB);, p1 [4 l# E( r
  con.setAutoCommit(false);' a. y+ U6 x7 m! P5 H
  stmt.executeUpdate
4 \$ v' v# C9 m, z8 J8 {7 }$ i3 t  ("insert into tb_file values('aaa.gif',empty_blob())");
% k) P3 W1 X6 T# {  下面必需SELECT获得BLOB的对象再向里写:
$ w! O& g7 E) y8 T- z  rs = stmt.executeQuery
+ V+ v) O# `( V/ @  ("select detail from tb_file where name='aaa.gif' for upfdate" );" ]4 E0 |7 Z* b3 Y! G6 _
  if(rs.next()) { Blob blob = rs.getBlob(1);
4 R$ O8 f4 s# {2 j9 y: E, G- t  BinaryOutputStream out =+ t* R6 B4 j, C. X; x$ e
  ((oracle.sql.BLOB)blob).getBinaryOutputStream();
! q0 }7 y; Z9 T' A2 O+ y  byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize];
$ s9 P# n4 F, e  InputStream fin = new FileInputStream(file);( ~, D" j- _6 g; r
  int len = 0; while( (len = fin.read(b)) != -1) out.write(b,0,len);( o* h+ n% D7 s( |& H1 I
  fin.close(); out.close(); con.commit(); }; z6 T* x, e. u0 n6 R0 X: M
  同样篡夺数据你并不能象LONG RO对data block物理结构的熟悉4 t/ u* \, ~( V5 p" Z: O( B
  1.Data Block 物理结构图:
回复

使用道具 举报

 楼主| 发表于 2012-8-4 13:41:07 | 显示全部楼层

Oracle认证:OracleDatablock的物理结构

  2.一次对block的dump过程:
" ~; S& D/ ]) K* [- o- Z% b  PHP code:+ _9 S  Y3 X* E) h1 ]# v# T
  SQL> create table t9 (a varchar(10));+ E1 M7 o! X# j  N' C2 ?+ g  P9 q
  Table created.; M" r! J. w, \
  SQL> insert into t9 values('a');
: `. ~0 f: F; }: H  1 row created.
' Z" X* l* m) i7 o. T9 z  SQL> commit;- n/ V* Z/ i/ Z5 b
  Commit complete.8 C# a' I7 O8 b( x5 N% l
  SQL> set serveroutput on
9 U5 F# _' w+ Z! ^- }: t. B  SQL> exec show_space('T9');
3 Q& O/ x) s1 @+ P# X  Free Blocks.............................1
; v& k4 w: p( T4 T% w, S5 k8 P, n& n* u  Total Blocks............................8& T3 E% J* ^* ~5 b
  Total Bytes.............................65536' K1 F/ y* U7 q) r) b6 _* w5 T# f
  Unused Blocks...........................6
$ q$ g$ L- X) Z" G  Unused Bytes............................49152% j$ ?" ]. w) g0 r# d
  Last Used Ext FileId....................3' q6 ~9 l0 z% P  `! _- ]
  Last Used Ext BlockId...................121
, ^/ l7 R3 r/ Q  Last Used Block.........................2
' K( Y5 k2 X* l2 ^4 k+ \; S  PL/SQL procedure successfully completed.( x) o7 y9 d4 Z
  SQL> alter system dump datafile 3 block 122;) W! h6 h! L1 B' `9 z) v! W
  System altered.
. s' f& a- _2 f  SQL> select * from v$tablespace;2 Y0 A9 g5 P% f, U" F! e, J
  TS# NAME INC8 _& ?! F5 h4 v0 ]
  ---------- ------------------------------ ---! r2 k% W7 n9 Q- G
  0 SYSTEM YES- B4 A2 U2 l0 C2 p2 W) }
  1 UNDOTBS1 YES! b* F$ T! b7 f5 i$ V
  8 USERS YES
, m3 I8 X1 G4 I1 G2 a  18 TEMP1/ u, L. o9 T4 e2 n) Q7 f( C5 o
  Trace 文件:
' d5 g  W" a) @9 g( Y  *** 2004-07-25 15:48:01.000
  H2 f: `' X) Q6 Y  Start dump data blocks tsn: 8 file#: 3 minblk 122 maxblk 1228 Y9 M* a% V  @8 K+ v
  buffer tsn: 8 rdba: 0x00c0007a (3/122)" V* G$ q# }4 |8 A; l+ `* z: o) ~
  scn: 0x0000.0068d716 seq: 0x01 flg: 0x02 tail: 0xd7160601
; Z3 m& Q1 A, o* Y- e/ E  frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
3 T8 W" o& J0 c8 ?& @  Block header dump: 0x00c0007a! b3 }8 t% S; g# [9 B: J; r
  Object id on Block? Y
/ [3 F8 n3 U6 {( y. K1 Y  seg/obj: 0x806d csc: 0x00.68d714 itc: 2 flg: O typ: 1 - DATA
0 `) X) q$ K, K" A, F2 x, @  fsl: 0 fnx: 0x0 ver: 0x01
3 ~: m0 J1 A+ x/ z3 {  Itl Xid Uba Flag Lck Scn/Fsc; g! G# d: S! h2 \2 l- }8 b8 g
  0x01 0x0004.00b.00000fac 0x00801885.008c.56 --U- 1 fsc 0x0000.0068d716
' K- ^7 G% N4 W" n# G% u" h  0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.000000002 O2 ?4 }( q) s+ t# l/ d
  data_block_dump,data header at 0x552105c
1 L* w0 n6 ]$ v( I  ===============) d7 b/ J+ j' \! ?  K, r& y
  tsiz: 0x1fa0* Y1 ~, V; M+ a  H  O; l
  hsiz: 0x14
; r5 k. m, m1 ?; a5 S. }  pbl: 0x0552105c
( m% B0 T0 b+ E; m% n6 ?* ^  bdba: 0x00c0007a
/ A0 A) Y. h. L" n; W+ w  76543210
" u) V; N+ d: x6 n& a  flag=--------
' s/ S& }3 k  S& v  ntab=1- R4 m% i! @! i3 M8 L
  nrow=16 Z4 c7 I' V! O0 k7 v
  frre=-1( Z% [6 c7 f4 t
  fsbo=0x14' z: L. X+ ]  z# n) I' m9 L
  fseo=0x1f9b8 M6 I: m8 w4 A  D. n/ m+ s" v/ p
  avsp=0x1f83- M8 A7 Y& N4 W+ K4 L
  tosp=0x1f836 @# O% R' G5 w  B* r/ Y% R3 z8 c
  0xe:pti[0] nrow=1 offs=0
3 N7 Q; P9 f9 P% G9 y) D  0x12:pri[0] offs=0x1f9b0 y3 U$ ]) ~' @# |8 c) O& ^
  block_row_dump:1 J- |9 Q! L% V- }8 c& S
  tab 0, row 0, @0x1f9b
& I. K+ N+ S: n7 Y1 h' z# e  tl: 5 fb: --H-FL-- lb: 0x1 cc: 1
' n% O7 R. [' d, o  col 0: [ 1] 61
# R1 p/ o  J4 m1 i  end_of_block_dump
' f( {6 p, q7 w  End dump data blocks tsn: 8 file#: 3 minblk 122 maxblk 1225 t% p: W# ]: W  `# c+ s% w
  3.先介绍数据块中搜罗的3种头信息:" V7 q2 a* e% B$ h: {, q6 m$ s
  首先,数据块是经由过程data block buffer cache完成读和写操作的,所以它供给了20bytes的Cache Header和4bytes的 Tail给Cache,用来篡夺和打点。' Z+ V3 P7 ?! J% z: ~( s  a$ F8 D
  第2部门是为Transaction层供给的Header信息。它一共占有了48bytes,搜罗24bytes的节制信息,和一系列的Interested Transaction Slot (ITS)。
( F5 F( A$ C7 L" `+ u/ \8 W7 s$ U  剩下的部门都叫Data Area,用来存储用户数据。Data Area也搜罗data header,和row data及残剩空间。可是Cluster blocks, table blocks, index block的data header,row data结构是不不异的,这里首要介绍table blocks.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:41:08 | 显示全部楼层

Oracle认证:OracleDatablock的物理结构

  4. 连系trace文件中的信息,具体介绍:+ _4 o, i$ e/ h2 ^0 w. h, @% X
  1) The Cache Header and Tail:
1 ?; |" P- [% i  {  buffer tsn: 8 rdba: 0x00c0007a (3/122)
# n- `  U* T' k4 o) p, i# ^  scn: 0x0000.0068d716 seq: 0x01 flg: 0x02 tail: 0xd7160601
8 L9 w# y- }- ]/ e' T4 _7 s  frmt: 0x02 chkval: 0x0000 type: 0x06=trans data9 A. c0 L" Q; R/ v$ P( Q( }% }
  Database block address: 占用4 bytes,暗示Tablespace relative database block address(RDBA)。搜罗tns=8,即Tablespace number (User 表空间),file#=3, block_id=1226 r6 S( ]8 H2 ^1 |1 [' e: n
  SCN: 占用6bytes,暗示最后转变的scn.搜罗2bytes的高位字节(SCN wrap),和4bytes的低位字节(SCN base)* m0 s; @! |+ t/ H% O  n
  Sequence: 占用1byte,用途不明晰,可能是辅助SCN的转变
) {4 W, H9 d' L4 y  Flag: 占用1byte" U: p/ e5 J+ v2 T
  Format: 占用1byte,应该是用来区分版本。Oracle 8之前值为1,之后为2.% A* e6 j) d, E$ J# k0 N; L# W
  Checksum: 占用2byte,跟db_block_checksum 参数有关系。
/ o* f( S% g6 F  引用oracle document 的诠释:“DB_BLOCK_CHECKSUM determines whether DBWn and the direct loader will calculate a checksum (a number calculated from all the bytes stored in the block) and store it in the cache header of every data block when writing it to disk. Checksums are verified when a block is read-only if this parameter is true and the last write of the block stored a checksum. In addition, Oracle gives every log block a checksum before writing it to the current log.
( h; C8 f" a& K. v  If this parameter is set to false, DBWn calculates checksums only for the SYSTEM tablespace, but not for user tablespaces.“) _9 Z6 H6 P  }( [
  Block type: 占用1byte,经常用到的有,1=undo segment header block; 2=undo data block; 5= data segment header block; 6=data block
" z/ P0 t! ?- n  Unused: 保留的字节,占用4bytes,用来前后兼容。
. s+ R& E% W+ G: h; \5 B  Tail 搜罗了SCN中SCN base的低位(low-order)2bytes,然后是block type,还有Sequence number.每当block 被读的时辰,都要搜检Tail与 block header 是否一致,保证了这个block不是损坏的(corrupted)。
- h& ?5 Q7 z- T" b) [- x  2) The Transaction Header:, u+ q# a) v6 ]+ I; {
  一共占有48bytes,搜罗24bytes的节制信息,和一系列的Interested Transaction Slot (ITS)。这些ITS组合在一路称为Interested Transaction List (ITL)。初始的ITL slot 数目由 INITRANS 抉择(index branch block 只有1个slot)。如不美观有足够的残剩空间,oracle会按照需要动态的分拍这些slot,直到受到空间限制或者达到了MAXTRANS.
) ?/ @" [  o% N2 X6 X! P  Block header dump: 0x00c0007a
$ r/ H/ \) V  q8 F' K- O2 \; r+ d+ T  Object id on Block? Y
$ `$ C5 A8 ^" X  seg/obj: 0x806d csc: 0x00.68d714 itc: 2 flg: O typ: 1 - DATA6 n( c+ H% _4 V
  fsl: 0 fnx: 0x0 ver: 0x01
0 t8 T: c0 n" a4 e3 k  Itl Xid Uba Flag Lck Scn/Fsc& }2 h; X% |) c; J
  0x01 0x0004.00b.00000fac 0x00801885.008c.56 --U- 1 fsc 0x0000.0068d716
7 x8 r3 f! D  {* K1 @) S4 A3 A  0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
$ H0 j  v$ e! {0 x  24bytes的节制信息搜罗:
' N+ k: E* B( s" w- T* _$ W  Object number(seg/obj): 占用4bytes,指在OBJ$中记实的segment 的 object number(0x806d=32877)1 a+ x/ U& K! ?4 q; i) n0 K$ l! Y
  Cleanout SCN(csc): 占用6bytes,最后一次 full cleanout 的scn
4 D+ m  M% I0 G$ m$ i  ITL count(itc): 占用1byte,ITL 的slot数目。+ Q+ _7 K* ~! r7 d
  Flag: 占用2bytes.O暗示这个block在freelist 上。否则flag为“-”
1 k1 R8 L/ x- U* k  c: i7 Y1 z  Block type: 占用1byte.1=data; 2=index
7 k1 z& v9 Q  I, T# W% Y4 ^  ITL freelist slot(fsl): 占用1byte.Index to the first slot on the ITL freelist# u' V& s9 V2 q( s
  Next freelist block(fnx): 占用4byte.Segment freelist中下矣闽block的RDBA
6 I# H4 G; F! N# f$ z4 f" R  Version: 1 byte# c; O! l: U# N5 b2 u5 {3 \3 K
  Unused: 4bytes,用来前后兼容。
  j, N! E. E( E2 ^! a  每个ITL entry搜罗以下的内容:$ ]* l- S" n! B4 B" a
  Transaction id(Xid): 8bytes.其中搜罗rollback segment number, transaction table中的slot number等。
/ i8 |8 n, _$ y8 C  Undo block address(Uba): 8bytes.其中搜罗rollback segment block的DBA,sequence number等。
; q  i/ O  p% b8 ]% I  Flags: 1nibble.—— = transaction is active, or committed pending cleanout C—— = transaction has been committed and locks cleaned out -B—— = this undo record contains the undo for this ITL entry——U- = transaction committed (maybe long ago); SCN is an upper bound——T = transaction was still active at block cleanout SCN& `3 `# ?) R+ H5 T2 {
  Locks: 3nibbles. 也就是所谓的行级锁(row-level locks)
! r; j4 G( J* i+ X$ X4 U/ p$ h$ h  SCN or free space credit: 6bytes. 如不美观这个事务已经clean out,这个值就是SCN;否则,前两个字节暗示由这个事务释放的此block中的空间数。
; w' e: K8 r/ l& G# ~  3)Data Area6 A9 m, i1 G. ?: {" ?; v
  搜罗14bytes的data header,4bytes/table的table dictionary,2bytes/row的row dictionary.table dictionary首要用于cluster block中,只不外table block中的table dictionary只有一个table.2 ?6 ?5 U2 ~, y- M1 K
  data_block_dump,data header at 0x552105c
0 I( b+ L5 y% M/ I: \8 h  ===============" X) f5 h6 K9 ~5 w" t7 I
  tsiz: 0x1fa0 ==> total data area size
: @4 w; s7 u! _: i* n  hsiz: 0x14 ==> data header size (14+ntabs*4 + nrows*2)# K' J9 G' U. j7 F: p
  pbl: 0x0552105c ==> pointer to buffer holding the block* b# v( ~+ L2 u: P& _
  bdba: 0x00c0007a ==> block dba / rdba
. K$ P' t' v" x2 h4 M  765432106 q& m; `# f; J2 ~/ S$ U. q
  flag=-------- ==> n=pctfree hit (clusters),f=don’t put on freelist, k=flushable cluster keys
- n& l( N' |9 O2 ?% p* ^  ntab=1 ==> number of tables (>1 so this is a cluster)5 f  u# N: ], O& U. v7 e
  nrow=1 ==> number of rows" |, _9 M" G2 J' h
  frre=-1
# P& N4 i' D8 `  fsbo=0x14 ==> free space begin offset/ Z# K" ]+ t" q. ?
  fseo=0x1f9b ==> free space end offset
  d" E# V+ C# R2 H  avsp=0x1f83 ==> available space in the block
/ ~* F  ]" i" A( ^( O  tosp=0x1f83 ==> total available space when all transactions commit$ g) `- F0 L3 Y! h6 k
  0xe:pti[0] nrow=1 offs=0! Z0 P' w, S4 e" N# i/ E
  0x12:pri[0] offs=0x1f9b2 g$ h" ?' `9 ]' B1 }7 l
  block_row_dump:
2 ~  a$ p) D  A  tab 0, row 0, @0x1f9b ==> 3bytes row header 2 W) G6 ?+ {0 L! U2 z- a3 A
  tl: 5 fb: --H-FL-- lb: 0x1 cc: 1
0 o/ b; \) O$ m: Y) }" o5 O  col 0: [ 1] 61 ==> column length(1 byte if length
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-2 02:41 , Processed in 0.382035 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表