1 概述

1. 作用
   (1) 屏蔽了不同 '操作系统(Windows、Linux、Unix)的差异',全部数据操作采用对 Oracle 块的操作

2. 特性
   (1) 数据块 'block' 是 Oracle '最小的存储单元',也是 '最小的 I/O 单元'
   (2) 目前有五种大小:2KB、4KB、8KB(默认)、16KB、32KB -- 必须是倍数增加
   (3) 不可更改,除非重新创建数据库
       
3. 常用命令
   (1) show parameter db_block_size -- 数据块大小 8192 = 8 * 1024
   (2) show parameter db_cache_size -- 缓存
   (3) show parameter db_file_multiblock_read_count; -- 一次从物理文件中读取数据块的数量   

示例:(文件、块、块地址等信息)

select t.*,
       rowid,
       dbms_rowid.rowid_relative_fno(rowid) 文件,
       dbms_rowid.rowid_block_number(rowid),
       -- dbms_utility.make_data_block_address('文件', '块') 数据块地址,
       -- dbms_utility.data_block_address_file('数据块地址') 文件,
       -- dbms_utility.data_block_address_block('数据块地址') 块,
       rownum,
       dbms_rowid.rowid_row_number(rowid) row_num, -- 等同 rownum
       dbms_rowid.rowid_object(rowid) 对象 -- dba_objects.object_id
  from scott.emp t;

2 组成

在这里插入图片描述

概述说明:

1. "块头": 存放 '块' 的基本信息,如:'块的物理地址',块所属类型('数据段' 还是 '索引段'(1) rdba: 0x03000086 (12/134) -- block_address=0x03000086 ,file=12,block = 134
   (2) type: 0x06 -- 数据段
   
2. "表目录": 存放表的信息
   (1) ntab=1 -- 表数:这个块的数据在 1 张表里面

3. "行目录":存放行的信息,如:行的地址
   (1) nrow=3 -- 行数:这个表有 3 行数据
   
4. "行数据": 真正存放表数据和索引数据的地方
   (1) col  0: [ 2]  c1 02 -- 1 (16 进制 -> 10 进制)
   
5. "空闲空间": 可用的,用于新行的插入和已存在的列更新  
   (1) avsp=0x1f5f -- avaliable space for new entries (空闲空间)
   (2) tosp=0x1f5f -- total space (最终空闲空间))

3 示例

-- 为了更好观察数据块信息,请在 pl/sql 中按下列操作
1. 创建表空间
   create tablespace BLOCKTEST -- 大小写敏感
   datafile 'E:\TableSpace\BLOCKTEST.dbf' size 10m;

2. 创建用户并授权
   create user blocktest identified by blocktest
   default tablespace blocktest;
   grant dba to blocktest;   

3. 登录 blocktest,创建表并插入数据
   create table block_test(
      tno   number(3),
      tname varchar2(30)
   );

   insert into block_test(tno, tname) values(1, '瑶瑶');
   insert into block_test(tno, tname) values(2, '优优');
   insert into block_test(tno, tname) values(3, '倩倩');
   commit;   

4. 查询数据所在的文件号和块号
   select t.tno,
          t.tname,
          dbms_rowid.rowid_relative_fno(rowid) file#,
          dbms_rowid.rowid_block_number(rowid) block#
     from block_test t;

	TNO	TNAME	FILE#	BLOCK#
	1	瑶瑶		12		134
	2	优优		12		134
	3	倩倩		12		134

   -- 可选操作
   -- alter system checkpoint; -- 手动发生一个检查点,使上述数据写入到 "数据文件"
   -- select * from dba_data_files t where t.file_id = 12; -- 查询 "数据文件"
   
5. 转储 12 号文件 134 号块  
   alter system dump datafile 12 block 134;
   
6. 找到转储的文件(命令行)
   SQL> show parameter dump

   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- ------------------------------
   background_core_dump                 string      partial
   background_dump_dest                 string      f:\app\yoyo\diag\rdbms\orcl\orcl\trace

我本地路径:
在这里插入图片描述

7. 分析数据块结构 -- 内容很多,以下介绍主要的,全部的见附件
   (1) "块头":
	Block header dump:  0x03000086 -- [4 块头]
	 Object id on Block? Y
	 seg/obj: 0x1256e  csc: 0x00.1aa42f  itc: 2  flg: E  typ: 1 - DATA
	     brn: 0  bdba: 0x3000080 ver: 0x01 opc: 0
	     inc: 0  exflg: 0
	 
	 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
	0x01   0x0001.020.00000472  0x00c00b19.0120.30  --U-    3  fsc 0x0000.001aa431
	0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 
    --  Itl 事务槽
    
   (2) "用户数据" -- 16 进制
   block_row_dump: -- [6 用户数据]
	tab 0, row 0, @0x1f8d
	tl: 11 fb: --H-FL-- lb: 0x1  cc: 2
	col  0: [ 2]  c1 02
	col  1: [ 4]  d1 fe d1 fe

   -- select dump(t.tno, 16) tno, dump(t.tname, 16) tname from block_test t where t.tno = 1;
   -- TNO 			 		TNAME
   -- Typ=2 Len=2: c1,2		Typ=1 Len=4: d1,fe,d1,fe 

附件 - 数据块结构信息

Trace file f:\app\yoyo\diag\rdbms\orcl\orcl\trace\orcl_ora_4444.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Windows NT Version V6.2  
CPU                 : 4 - type 8664, 2 Physical Cores
Process Affinity    : 0x0x0000000000000000
Memory (Avail/Total): Ph:2428M/7767M, Ph+PgF:4489M/12040M 
Instance name: orcl
Redo thread mounted by this instance: 1
Oracle process number: 45
Windows thread id: 4444, image: ORACLE.EXE (SHAD)


*** 2020-11-19 22:00:38.492
*** SESSION ID:(71.7009) 2020-11-19 22:00:38.492
*** CLIENT ID:() 2020-11-19 22:00:38.492
*** SERVICE NAME:(orcl.168.0.102) 2020-11-19 22:00:38.492
*** MODULE NAME:(PL/SQL Developer) 2020-11-19 22:00:38.492
*** ACTION NAME:(命令窗口 - 新建) 2020-11-19 22:00:38.492
 
Start dump data blocks tsn: 18 file#:12 minblk 134 maxblk 134
Block dump from cache: -- [1 块,缓存]
Dump of buffer cache at level 4 for tsn=18, rdba=50331782
BH (0x00007FFC03FE6B38) file#: 12 rdba: 0x03000086 (12/134) class: 1 ba: 0x00007FFC03D8E000
  set: 9 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 37,28
  dbwrid: 0 obj: 75118 objn: 75118 tsn: 18 afn: 12 hint: f
  hash: [0x00007FFC32FF1228,0x00007FFC62B0EAA8] lru: [0x00007FFC03FE6AF0,0x00007FFC03FF2690]
  ckptq: [NULL] fileq: [NULL] objq: [0x00007FFC03FE6B18,0x00007FFC5B48ADD0]
  st: XCURRENT md: NULL tch: 7
  flags: block_written_once redo_since_read
  LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [1]
  cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk: -- [2 磁盘]
buffer tsn: 18 rdba: 0x03000086 (12/134)
scn: 0x0000.001aa431 seq: 0x01 flg: 0x06 tail: 0xa4310601
frmt: 0x02 chkval: 0xafc6 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1 -- [3 块,16 进制]
Dump of memory from 0x0000000022892400 to 0x0000000022894400
022892400 0000A206 03000086 001AA431 06010000  [........1.......]
022892410 0000AFC6 00000001 0001256E 001AA42F  [........n%../...]
022892420 00000000 0032F802 03000080 00200001  [......2....... .]
022892430 00000472 00C00B19 00300120 00002003  [r....... .0.. ..]
022892440 001AA431 00000000 00000000 00000000  [1...............]
022892450 00000000 00000000 00000000 00000000  [................]
022892460 00000000 00030100 0018FFFF 1F5F1F77  [............w._.]
022892470 00001F5F 1F8D0003 1F771F82 00000000  [_.........w.....]
022892480 00000000 00000000 00000000 00000000  [................]
        Repeat 500 times
0228943D0 00000000 00000000 2C000000 C1020201  [...........,....]
0228943E0 BBD90404 012CBBD9 03C10202 D3C5D304  [......,.........]
0228943F0 02012CC5 0402C102 FED1FED1 A4310601  [.,............1.]
Block header dump:  0x03000086 -- [4 块头]
 Object id on Block? Y
 seg/obj: 0x1256e  csc: 0x00.1aa42f  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x3000080 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0001.020.00000472  0x00c00b19.0120.30  --U-    3  fsc 0x0000.001aa431
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x03000086
data_block_dump,data header at 0x22892464 -- [5 用户数据头]
===============
tsiz: 0x1f98 -- top of size
hsiz: 0x18 -- header size
pbl: 0x22892464
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18 -- free space begin offset
fseo=0x1f77 -- free space end offset
avsp=0x1f5f -- avaliable space for new entries (空闲空间)
tosp=0x1f5f -- total space (最终空闲空间)
0xe:pti[0]	nrow=3	offs=0
0x12:pri[0]	offs=0x1f8d
0x14:pri[1]	offs=0x1f82
0x16:pri[2]	offs=0x1f77
block_row_dump: -- [6 用户数据]
tab 0, row 0, @0x1f8d
tl: 11 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [ 4]  d1 fe d1 fe
tab 0, row 1, @0x1f82
tl: 11 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 03
col  1: [ 4]  d3 c5 d3 c5
tab 0, row 2, @0x1f77
tl: 11 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 04
col  1: [ 4]  d9 bb d9 bb
end_of_block_dump
End dump data blocks tsn: 18 file#: 12 minblk 134 maxblk 134
Logo

更多推荐