一、建表空間
SQL>create tablespace tp1 datafile '/oradata/bxocp/tp01.dbf' size 10M;
二、建使用者及授權
SQL>create user gyj identified by gyj default tablespace tp1;
SQL>grant dba to gyj;
三、建表
SQL>conn gyj/gyj
SQL>create table t1 (id int,name varchar2(100));
四、插入一行資料
SQL>insert into t1 values(1,'AAAAA');
SQL>commit;
五、手動發生一個檢查點,使上面一行資料寫到資料檔案
alter system checkpoint;
六、查這行資料所在的檔案号和塊号
SQL>col name for a10
SQL>select id,name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from t1;
ID NAME FILE# BLOCK#
---------- --------- ---------- ----------
1 AAAAA 6 135
七、轉儲6号檔案135号塊,新開個視窗
[oracle@guoyj ~]$ sqlplus / as sysdba
SQL> alter system dump datafile 6 block 135;
八、找到轉儲的檔案
SQL> show parameter dump
NAME TYPE VALUE
background_core_dump string partial
background_dump_dest string /u01/app/oracle/diag/rdbms/bxo
cp/bxocp/trace
再開一新視窗
[oracle@guoyj ~]$ cd /u01/app/oracle/diag/rdbms/bxocp/bxocp/trace
[oracle@guoyj trace]$ ls -lFtr
下面這個跟蹤日志就是6号檔案135号塊轉儲出來的資料塊資訊
-rw-r----- 1 oracle oinstall 3363 Dec 11 18:02 bxocp_ora_5429.trc -
九、分析資料塊結構
[oracle@guoyj trace]$ vi bxocp_ora_5429.trc
Trace file /u01/app/oracle/diag/rdbms/bxocp/bxocp/trace/bxocp_ora_5429.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0
System name: Linux
Node name: guoyj
Release: 2.6.18-128.el5
Version: #1 SMP Wed Dec 17 11:41:38 EST 2008
Machine: x86_64
VM name: VMWare Version: 6
Instance name: bxocp
Redo thread mounted by this instance: 1
Oracle process number: 28
Unix process pid: 5429, image: oracle@guoyj (TNS V1-V3)
* 2012-12-11 18:02:31.307
* SESSION ID:(29.15) 2012-12-11 18:02:31.307
* CLIENT ID:() 2012-12-11 18:02:31.307
* SERVICE NAME:(SYS$USERS) 2012-12-11 18:02:31.307
* MODULE NAME:(sqlplus@guoyj (TNS V1-V3)) 2012-12-11 18:02:31.307
* ACTION NAME:() 2012-12-11 18:02:31.307
Start dump data blocks tsn: 7 file#:6 minblk 135 maxblk 135
Block dump from cache:
Dump of buffer cache at level 4 for tsn=7 rdba=25165959
BH (0x7f3f6958) file#: 6 rdba: 0x01800087 (6/135) class: 1 ba: 0x7f33a000
set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 103,28
dbwrid: 0 obj: 76987 objn: 76987 tsn: 7 afn: 6 hint: f
hash: [0x908b5100,0x908b5100] lru: [0x7f3f6910,0x7f3f6b70]
ckptq: [NULL] fileq: [NULL] objq: [0x7f3f6938,0x8d148e00] objaq: [0x7f3f6948,0x8d148df0]
st: XCURRENT md: NULL fpin: 'ktspbwh2: ktspfmdb' tch: 3
flags: block_written_once redo_since_read
LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [1]
Block dump from disk:
1、資料塊頭部分
buffer tsn: 7 rdba: 0x01800087 (6/135)
scn: 0x0000.0015a3eb seq: 0x01 flg: 0x06 tail: 0xa3eb0601frmt: 0x02 chkval: 0xec19 type: 0x06=trans data
flg:0x01 (建立塊)0x2(資料塊延遲清洗推進scn和seq) 0X04(設定校驗和) 0x08(臨時塊)
type:0x06(表/索引塊)
frmt: 0x01(v7) 0x02(v8)
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00002B70E9566A00 to 0x00002B70E9568A00
2B70E9566A00 0000A206 01800087 0015A3EB 06010000 [................]
2B70E9566A10 0000EC19 00000001 00012CBB 0015A3EA [.........,......]
2B70E9566A20 00000000 0032F802 01800080 000F0004 [......2.........]
2B70E9566A30 00000346 00C00793 002200BB 00002001 [F.........".. ..]
2B70E9566A40 0015A3EB 00000000 00000000 00000000 [................]
2B70E9566A50 00000000 00000000 00000000 00000000 [................]
2B70E9566A60 00000000 00010100 0014FFFF 1F781F8C [..............x.]
2B70E9566A70 00001F78 1F8C0001 00000000 00000000 [x...............]
2B70E9566A80 00000000 00000000 00000000 00000000 [................]
Repeat 502 times
2B70E95689F0 0202012C 410502C1 41414141 A3EB0601 [,......AAAAA....]
2.ITL
Block header dump: 0x01800087
Object id on Block? Y
seg/obj: 0x12cbb csc: 0x00.15a3ea itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1800080 ver: 0x01 opc: 0
inc: 0 exflg: 0
seg/obj: 0x12cbb --16進制轉成10進制76987
SQL> select object_id from dba_objects where object_name='T1' and owner='GYJ';
OBJECT_ID
76987
csc: 0x00.15a3ea --cleanoutSCN,塊清除時的SCN
itc: 2 --ITL槽的數量
flg: E --指用的是ASSM,如果是O表示用的是free list
typ: 1 - DATA --事務型的資料塊(并且:資料塊頭的type:0x06),存放表和索引資料。
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.00f.00000346 0x00c00793.00bb.22 --U- 1 fsc 0x0000.0015a3eb
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
Itl: ITL事務槽号的流水編号
Xid:transac[X]tion identified(事務ID),由und的段号+undo的槽号+undo槽号的覆寫次數三部分組成
Uba:undo block address記錄了最近一次的該記錄的前鏡像(修改前的值)
Flag:C是送出,U是快速送出,---是未送出(Flg C=Committed U=Commit Upper Bound T=Active at CSC)
Lck:鎖住了幾行資料,對應有幾個行鎖
Scn/Fsc:Scn=SCN of commited TX; Fsc=Free space credit(bytes)
這裡fsc 0x0000.0015a3eb是指送出的scn,這個值大于上次清除塊時的scn=csc: 0x00.15a3ea(此scn是這個塊中最小的SCN of commited)
SCN WRAP:如果事務已送出并完成清洗,該字段儲存事務送出SCN的SCN WRAP部分,否則該字段儲存空閑預支位元組數(FSC).比如我删除了一行資料10個位元組,在事務提前前,這10個位元組就屬于fsc(即會寫到SCN WRAP),隻有事務送出後,才能正式傳回到空閑空間。
3.使用者資料頭
bdba: 0x01800087
data_block_dump,data header at 0x2b70e9566a64
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x2b70e9566a64
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f8c
avsp=0x1f78
tosp=0x1f78
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f8c
bdba: 0x01800087 -- 資料塊的位址:16進制轉成2進制取前10位二進制為檔案号0000 0001 1000 ..... 0000000110=5号檔案,後面剩于的部分表示塊号,0X87轉成10進制為135号塊
tsiz: 0x1f98 --top of size 塊的總大小即8088個位元組
hsiz: 0x14 --Data header size 資料頭大小即20個位元組
pbl: 0x2b70e9566a64 --Pointer to buffer holding the block
76543210
flag=-------- N=pcrfree hit(clusters);F=do not put on free list;K=flushable cluster keys
ntab=1 --叫表數:表示這個塊的資料在一個表(如果是聚簇表就有可能是2或2以上)
nrow=1 --叫行數:表示這個表有一行資料
frre=-1 -- The first free row entry in the row directory=you have to add one
fsbo=0x14 -- Free space begin offset 叫起始空間:可以存放資料空間的起始位置(即定義了資料層中空閑空間的起始offset)
fseo=0x1f8c -- Free space end offset 叫結束空間:可以存放資料空間的結束位置(即定義了資料層中空閑空間的結束offset)
avsp=0x1f78 --Available space for new entries 叫空閑空間:定義了資料層中空閑空間的位元組數
tosp=0x1f78 --Total space 叫最終空閑空間:定義了ITL中事務送出後,資料層中空閑空間的位元組數
0xe:pti[0] nrow=1 offs=0 --Table directory,整個表的開始,共一行資料 ,定義了該表在行索引中使用的插槽數
0x12:pri[0] offs=0x1f8c --Row index,叫行索引,定義了該塊中包含的所有行資料的位置
4.使用者資料
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 5] 41 41 41 41 41
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 135 maxblk 135
tab 0, row 0, @0x1f8c --第一個表第一行的位置 ,定義了該表在行索引中的起始插槽号
tl: 12 fb: --H-FL-- lb: 0x1 cc: 2 --行頭,tl: 12行長度12個位元組,
fb: (Flag byte)--H-FL指H(Head piece of row)F(First data piece) L(Last data piece)
lb: 0x1 --Lock byte和上面的ITL的lck相對應,表示這行是否被lock了
cc: 2 --表示有兩列,即這個表有兩個字段
col 0: [ 2] c1 02 --第一行的第一個字段長度和值
col 1: [ 5] 41 41 41 41 41 --第一行的第二個字段長度和值
資料塊的最後四位元組tail: 0xa3eb0601=scnBASE+flg+seq,如果不相等會報塊損壞!!!
5、下面對這些資料用SQL語句做互相轉換
(1)把表中的資料轉成16進制(即在ORACLE内部資料塊看到的資料),用以下sql語句:
gyj@OCM> select id,name,dump(01,'16'), dump('AAAAA','16') from t1;
ID NAME DUMP(01,'16') DUMP('AAAAA','16')
1 AAAAA Typ=2 Len=2: c1,2 Typ=96 Len=5: 41,41,41,41,41
(2)反過來把16進制轉成表中的資料(當然我這邊的資料類型隻考慮了number和varchar類型),用以sql下語句:
ggyj@OCM> col id for 999gyj@OCM> col id1 for 999
gyj@OCM> col name for a10
gyj@OCM> col name1 for a10
gyj@OCM> select id,UTL_RAW.CAST_TO_NUMBER(replace(' c1 02 ',' ')) id1,
2 name,UTL_RAW.CAST_TO_VARCHAR2(replace('41 41 41 41 41',' ')) name1
3 from t1;
ID ID1 NAME NAME1
1 1 AAAAA AAAAA
一、對于我上面講的: 1、資料塊頭部分中講的flg标志再做一些詳細的補充0x01 (建立塊)
0x2 (資料塊延遲清洗推進scn和seq)
0X04 (設定校驗和)
0x08 (臨時塊)
對于 flg标志的值是由上面一些位做組合運算的,下面我們來看幾下例子:
1、先來看看0x01 (建立塊)和0X04 (設定校驗和) 的組合
我的版本是11gr2
gyj@OCM> select * from v$version;
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
由于11gr2在建立表的時侯有個延遲段參數的控制,預設不配置設定EXTNETS空間
gyj@OCM> show show parameter deferred_segment_creation
showmode OFF
deferred_segment_creation boolean TRUE
那麼我在建表的同時要立馬配置設定EXTENTS,好我馬上建個表,操作如下:
gyj@OCM> create table t20(id int ,name varchar2(10)) SEGMENT CREATION IMMEDIATE;
Table created.
查配置設定的區号,檔案号,塊号
gyj@OCM> select extent_id,file_id,block_id from dba_extents where segment_name='T20';
EXTENT_ID FILE_ID BLOCK_ID
0 3 152
對3号檔案的152号塊做DUMP,做dump時最好新打會一個會話,避免産生不必要的日志,操作如下
[oracle@ocm ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon Mar 18 07:40:55 2013
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
sys@OCM> alter system dump datafile 3 block 152;
System altered.
好,現在馬上到找到跟蹤日志
sys@OCM> show parameter dump
background_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/trace
core_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/cdump
max_dump_file_size string unlimited
shadow_core_dump string partial
user_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/trace
[oracle@ocm trace]$ cd /u01/app/oracle/diag/rdbms/ocm/ocm/trace
[oracle@ocm trace]$ ls -lFtr
[oracle@ocm trace]$ more ocm_ora_12910.trc
貼出資料塊頭的資訊:
scn: 0x0000.00000000 seq: 0x01 flg: 0x05 tail: 0x00000001
frmt: 0x02 chkval: 0xa798 type: 0x00=unknown
從上面看出flg是flg: 0x05,就是0x01 +0x04的組合,
0x01說明這是一個建立的塊,因為我的表的是剛剛建立的,沒有向塊中插入資料。
0x04說明有設定校驗,chkval: 0xa798這個就是校驗和,這個與參數db_block_checksum有關
gyj@OCM> show parameter db_block_checksum
db_block_checksum string TYPICAL
預設設定了db_block_checksum,就會啟動校驗和檢查資料塊的一緻性。另外資料塊尾部的4個位元組也是配合資料塊頭來驗證資料塊的一緻性。
如果一個塊頭被辨別成軟損壞,那麼塊頭的序列号為0xff,标志為0x00