zoukankan      html  css  js  c++  java
  • 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

    一些参数需要自己去了解
  • 相关阅读:
    Properties读取资源文件的四种方法
    如何成为一个C++高级程序员
    Linux定时任务设定
    Mysql之复制选项与监控
    GTID复制之二
    Mysql之多源复制
    MysqlDumpslow
    用Mysqlbinlog备份BinLog文件
    Mysql之mysqlbinlog使用
    Mysql之取消主从复制
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480777.html
Copyright © 2011-2022 走看看