数据库的逻辑结构包括:数据块,区,段,表空间。

oracle数据块是oracle数据库存储基础,有磁盘空间的若干字节组成,数据块是oracle数据库的最小逻辑单元,可以定义数据块为2k、4k、8k、16k、32k甚至更大,默认oracle块大小是8k,通常我们称为oracle块。当然正常情况下oracle块应该是os块的整数倍,当然具有标准大小的块叫做标准块,和标准块不同的块叫做非标准块。同一个数据库中,当然指的是9i以后,支持同一个数据中同时使用标准块和非标准块。

oracle数据块详解_数据块

Oracle块大小设置在初始化参数文件里面(init.ora)中的db_block_size中设置,块是处理update、insert、select数据事务的最小单位,当用户从表中选择数据时,将在oracle块上读取或是提取数据。意思就是说:os每次执行i/o时候,是以os的块为单位;oracle每次执行i/o时候,是以oracle块为单位。


总结为一下几点:

最小的 I/O单元

包含一个或多个 OS块

DB_BLOCK_SIZE

数据库创建时设置,数据库创建后不能更改


Oracle数据块的大小设置意见:

1、 如果行较小且访问随机,则选择小的块尺寸

2、 如果行小且访问连续的,或者有较大的行,则选择较大尺寸的块。

就是说看我们的业务系统。


数据块结构

1、基本组成


oracle数据块详解_数据块

块结构说明如下:

块头:存放一些基本信息,如物理位置,块所属的段类型(数据段、索引段、回滚段等)

表目录:如果块中存储的数据为表数据,则表目录中保存这个表的相关信息

行目录:如果块中存储的数据为表数据,则行目录中保存数据行的相关信息。

块头、表目录和行目录组成块的头部信息(overhead),这部分不存数据库中实际的数据,而是用来记录该块的逻辑结构,而且这部分占用的空间不是固定的,大约在84-107字节之间。

行记录:真正存放数据的区域,这部分空间已被使用。

空闲空间:未使用的区域,用于新行的插入或者已经存在行的更新。(这里有个概念行迁移:就是当update操作时,块中空闲的空间不够保存修改的数据,那么记录就将保存到另一个拥有足够空间的块中,而只在原块上保留一条指向新块的rowid,这就是行迁移row migration)

2、自由空间

空闲空间的使用

Insert这时候块的自由空间会减少,

update的时候块的自由空间也会减少

当使用DELETE语句删除块中的记录或者使用UPDATE语句把列的值更改成一个更小值的时候,Oracle会释放出一部分自由空间。释放出的自由空间并不一定是连续的,常情况下,Oracle不会对块中不连续的自由空间进行合并。因为合并数据块中不连续的自由空间会影响数据库的性能。只有当用户进行数据插入(INSERT)或者更新(UPDATE)操作,却找不到连续的自由空间的时候,Oracle才会合并数据块中不连续的自由空间。


3、空闲空间的管理

对于块中的自由空间,Oracle提供两种管理方式:自动管理,手动管理


行链接和行迁移(Row Chaining and Migrating)


行链接(Row Chaining):如果我们往数据库中插入(INSERT)一行数据,这行数据很大,以至于一个数据块存不下一整行,Oracle就会把一行数据分作几段存在几个数据块中,这个过程叫行链接(Row Chaining)。

oracle数据块详解_数据块

如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。

   行迁移(Row Migrating):数据块中存在一条记录,用户执行UPDATE更新这条记录,这个UPDATE操作使这条记录变长,这时候,Oracle在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,Oracle只能把整行数据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“指针”指向新的数据块。被移动的这条记录的ROWID保持不变。行迁移的原理如下图所示:

oracle数据块详解_数据块

无论是行链接还是行迁移,都会影响数据库的性能。Oracle在读取这样的记录的时候,Oracle会扫描多个数据块,执行更多的I/O。而且是成倍加大i/o。

1)Oracle使用位图(bitmap)来管理和跟踪数据块,这种块的空间管理方式叫“自动管理”。自动管理有下面的好处:

◆易于使用

◆更好地利用空间

◆可以对空间进行实时调整

2)块中自由空间的手动管理(手动管理比较复杂)

用户可以通过PCTFREE, PCTUSED来调整块中空间的使用,这种管理方式叫手动管理。相对于自动管理,手动管理方式比较麻烦,不容易掌握,容易造成块中空间的浪费。

PCTFREE参数用于指定块中必须保留的最小空闲空间百分例。之所以要预留这样的空间,是因为UPDATE时,需要这些空间。如果UPDATE时,没有空余空间,Oracle就会分配一个新的块,这会产生行迁移(Row Migrating)。

PCTUSED也是用于设置一个百分比,当块中已使用的空间的比例小于这个百分比的时候,这个块才被标识为有效状态。只有有效的块才被允许插入数据。


三、基本实验

1)下面我们先来分析一下块。


下面我们来看看这个数据块

dump说明

创建表空间和测试表:

create tablespace testblock datafile '/opt/app/oracle/oradata/wolf/testblock01.dbf' size 100M;

create table testblock(

id number,

name varchar(4)

) tablespace testblock;

插入3条数据然后提交:

SQL> insert into testblock values(1,'a');

SQL> insert into testblock values(2,'b');

SQL> insert into testblock values(3,'c');

SQL> commit;

SQL> select * from testblock;

        ID NAME

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

         1 a

         2 b

         3 c

SQL>commit


SQL> desc V$datafile;

Name Null? Type

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

FILE# NUMBER

CREATION_CHANGE# NUMBER

CREATION_TIME DATE

TS# NUMBER

RFILE# NUMBER

STATUS VARCHAR2(7)

ENABLED VARCHAR2(10)

CHECKPOINT_CHANGE# NUMBER

CHECKPOINT_TIME DATE

UNRECOVERABLE_CHANGE# NUMBER

UNRECOVERABLE_TIME DATE

LAST_CHANGE# NUMBER

LAST_TIME DATE

OFFLINE_CHANGE# NUMBER

ONLINE_CHANGE# NUMBER

ONLINE_TIME DATE

BYTES NUMBER

BLOCKS NUMBER

CREATE_BYTES NUMBER

BLOCK_SIZE NUMBER

NAME VARCHAR2(513)

PLUGGED_IN NUMBER

BLOCK1_OFFSET NUMBER

AUX_NAME VARCHAR2(513)

FIRST_NONLOGGED_SCN NUMBER

FIRST_NONLOGGED_TIME DATE


SQL> select FILE#,name from v$datafile;


FILE#

----------

NAME

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

1

/opt/app/oracle/oradata/wolf/system01.dbf


2

/opt/app/oracle/oradata/wolf/undotbs01.dbf


3

/opt/app/oracle/oradata/wolf/sysaux01.dbf



FILE#

----------

NAME

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

4

/opt/app/oracle/oradata/wolf/users01.dbf


5

/opt/app/oracle/oradata/wolf/testblock01.dbf


SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) rel_fno,dbms_rowid.rowid_block_number(rowid)

blockno from testblock;

2

ROWID REL_FNO BLOCKNO

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

AAAMixAAFAAAAAMAAA 5 12

AAAMixAAFAAAAAMAAB 5 12

AAAMixAAFAAAAAMAAC 5 12

SQL> alter system dump datafile 5 block 12;

SQL> show parameter dump;

查找dumping文件位置


[root@test ~]# cd /opt/app/oracle/admin/wolf

[root@test wolf]# ls

adump bdump cdump dpdump pfile udump

[root@test wolf]# cd udump/

[root@test udump]# ls

wolf_ora_18566.trc wolf_ora_19120.trc wolf_ora_4952.trc wolf_ora_5792.trc

wolf_ora_18605.trc wolf_ora_19790.trc wolf_ora_4954.trc wolf_ora_5826.trc

wolf_ora_18608.trc wolf_ora_19818.trc wolf_ora_5721.trc wolf_ora_5833.trc

wolf_ora_19087.trc wolf_ora_19820.trc wolf_ora_5764.trc wolf_ora_5860.trc

wolf_ora_19114.trc wolf_ora_4899.trc wolf_ora_5766.trc wolf_ora_9291.trc

[root@test udump]# ls -l

total 272

-rw-r----- 1 oracle oinstall 593 Jul 8 05:56 wolf_ora_18566.trc

-rw-r----- 1 oracle oinstall 650 Jul 8 05:56 wolf_ora_18605.trc

-rw-r----- 1 oracle oinstall 1872 Jul 8 06:05 wolf_ora_18608.trc

-rw-r----- 1 oracle oinstall 593 Jul 8 04:05 wolf_ora_19087.trc

-rw-r----- 1 oracle oinstall 650 Jul 8 04:05 wolf_ora_19114.trc

-rw-r----- 1 oracle oinstall 196171 Jul 8 04:21 wolf_ora_19120.trc

-rw-r----- 1 oracle oinstall 593 Jul 8 06:29 wolf_ora_19790.trc

-rw-r----- 1 oracle oinstall 650 Jul 8 06:29 wolf_ora_19818.trc

-rw-r----- 1 oracle oinstall 3331 Jul 8 11:08 wolf_ora_19820.trc

-rw-r----- 1 oracle oinstall 619 Jul 14 05:25 wolf_ora_4899.trc

-rw-r----- 1 oracle oinstall 648 Jul 14 05:25 wolf_ora_4952.trc

-rw-r----- 1 oracle oinstall 2717 Jul 14 05:36 wolf_ora_4954.trc

-rw-r----- 1 oracle oinstall 591 Jul 7 10:02 wolf_ora_5721.trc

-rw-r----- 1 oracle oinstall 907 Jul 7 10:03 wolf_ora_5764.trc

-rw-r----- 1 oracle oinstall 591 Jul 7 10:03 wolf_ora_5766.trc

-rw-r----- 1 oracle oinstall 2630 Jul 7 10:03 wolf_ora_5792.trc

-rw-r----- 1 oracle oinstall 776 Jul 7 10:03 wolf_ora_5826.trc

-rw-r----- 1 oracle oinstall 591 Jul 7 10:03 wolf_ora_5833.trc

-rw-r----- 1 oracle oinstall 648 Jul 7 10:04 wolf_ora_5860.trc

-rw-r----- 1 oracle oinstall 2045 Jul 8 04:04 wolf_ora_9291.trc

[root@test udump]# date

Sat Jul 14 05:38:57 EDT 2012

[root@test udump]# cat wolf_ora_4954.trc | more

/opt/app/oracle/admin/wolf/udump/wolf_ora_4954.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

ORACLE_HOME = /opt/app/oracle/product/10g

System name: Linux

Node name: test

Release: 2.6.18-128.el5

Version: #1 SMP Wed Dec 17 11:42:39 EST 2008

Machine: i686

Instance name: wolf

Redo thread mounted by this instance: 1

Oracle process number: 15

Unix process pid: 4954, image: oracle@test (TNS V1-V3)


*** 2012-07-14 05:36:52.410

*** SERVICE NAME:(SYS$USERS) 2012-07-14 05:36:52.410

*** SESSION ID:(159.3) 2012-07-14 05:36:52.410

Start dump data blocks tsn: 6 file#: 5 minblk 12 maxblk 12

buffer tsn: 6 rdba: 0x0140000c (5/12)

scn: 0x0000.0007e543 seq: 0x05 flg: 0x02 tail: 0xe5430605

frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x0CEF4200 to 0x0CEF6200

CEF4200 0000A206 0140000C 0007E543 02050000 [......@.C.......]

CEF4210 00000000 00000001 0000C8B1 0007E52C [............,...]

CEF4220 00000000 00320002 01400009 00230007 [......2...@...#.]

CEF4230 000000DD 0080077F 003400CC 00002003 [..........4.. ..]

CEF4240 0007E543 00000000 00000000 00000000 [C...............]

CEF4250 00000000 00000000 00000000 00000000 [................]

CEF4260 00000000 00030100 0018FFFF 1F651F80 [..............e.]

CEF4270 00001F65 1F900003 1F801F88 00000000 [e...............]

CEF4280 00000000 00000000 00000000 00000000 [................]

Repeat 501 times

CEF61E0 00000000 0202012C 630104C1 0202012C [....,......c,...]

CEF61F0 620103C1 0202012C 610102C1 E5430605 [...b,......a..C.]

Block header dump: 0x0140000c

Object id on Block? Y

seg/obj: 0xc8b1 csc: 0x00.7e52c itc: 2 flg: E typ: 1 - DATA

brn: 0 bdba: 0x1400009 ver: 0x01 opc: 0

inc: 0 exflg: 0


Itl Xid Uba Flag Lck Scn/Fsc

0x01 0x0007.023.000000dd 0x0080077f.00cc.34 --U- 3 fsc 0x0000.0007e543

0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000


data_block_dump,data header at 0xcef4264

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

tsiz: 0x1f98

hsiz: 0x18

pbl: 0x0cef4264

bdba: 0x0140000c

76543210

flag=--------

ntab=1

nrow=3

frre=-1

fsbo=0x18

fseo=0x1f80

avsp=0x1f65

tosp=0x1f65

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

0x12:pri[0] offs=0x1f90

0x14:pri[1] offs=0x1f88

0x16:pri[2] offs=0x1f80

block_row_dump:

tab 0, row 0, @0x1f90

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

col 0: [ 2] c1 02

col 1: [ 1] 61

tab 0, row 1, @0x1f88

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

col 0: [ 2] c1 03

col 1: [ 1] 62

tab 0, row 2, @0x1f80

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

col 0: [ 2] c1 04

col 1: [ 1] 63

end_of_block_dump

End dump data blocks tsn: 6 file#: 5 minblk 12 maxblk 12

一些参数需要自己去了解