oracle数据块详解

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

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

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

 

总结为一下几点:

    最小的 I/O单元

    包含一个或多个 OS

    DB_BLOCK_SIZE

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

 

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

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

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

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

 

数据块结构

1、基本组成

 

块结构说明如下:

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

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

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

块头、表目录和行目录组成块的头部信息(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)。

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

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

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

1Oracle使用位图(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;

 

ROWID                 REL_FNO    BLOCKNO

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

AAAMixAAFAAAAAMAAA                 12

AAAMixAAFAAAAAMAAB                 12

AAAMixAAFAAAAAMAAC                 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-    fsc 0x0000.0007e543

0x02   0x0000.000.00000000  0x00000000.0000.00  ----    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

一些参数需要自己去了解
原文地址:https://www.cnblogs.com/liuzhuqing/p/7480776.html