zoukankan      html  css  js  c++  java
  • ASSM 的三级位图结构

    自动段空间管理(ASSM),它首次出现在Oracle920里(在920以前,段空间的管理方式叫做MSSM,它是由连接列表freelist来完成的,因为freelist存在串行的问题,因此容易引起段头的争用与空间的浪费)。有了ASSM,连接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block)。使用ASSM的一个巨大优势就是能够减轻缓冲区忙等待(buffer busy wait)。

    我们来看看ASSM的管理结构是怎么样的:

    --准备工作:

    SQL> create table test1(id int,name varchar2(20));
    
    Table created.
    
    SQL> insert into test1 values(0,'dd');
    
    1 row created.
    
    SQL> commit;
    
    SQL> alter table test1 allocate extent(size 1M);
    
    Table altered.

    --获取这个segment是从哪一个extent开始的:

    SQL> select EXTENT_ID , FILE_ID , BLOCK_ID , BLOCKS from dba_extents where segment_name='TEST1';
    
     EXTENT_ID    FILE_ID    BLOCK_ID     BLOCKS
    ---------- ---------- ---------- ----------
         0        5         128      8
         1        5         136      8
         2        5         144      8
         3        5         152      8
         4        5         160      8
         5        5         168      8
         6        5         176      8
         7        5         184      8
         8        5         192      8
         9        5         200      8
        10        5         208      8
        11        5         216      8
        12        5         224      8
        13        5         232      8
        14        5         240      8
        15        5         248      8
        16        5         256    128
    
    17 rows selected.

    --获取段头的位置

    SQL> select header_block,header_file from dba_segments where segment_name='TEST1' and owner='SS';
    
    HEADER_BLOCK HEADER_FILE
    ------------ -----------
         130           5

    我们发现第一extent的块号是128,而段头的块号是130,那么128和129这两个块到底做什么用的?


    dump 块128的信息:
    Start dump data blocks tsn: 6 file#:5 minblk 128 maxblk 128
    Block dump from cache:
    Dump of buffer cache at level 4 for tsn=6, rdba=20971648
    BH (0x57bf7f2c) file#: 5 rdba: 0x01400080 (5/128) class: 8 ba: 0x57b52000
    set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
    dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
    hash: [0x5db05a2c,0x5db05a2c] lru: [0x533f76bc,0x57fea7b4]
    lru-flags: on_auxiliary_list
    ckptq: [NULL] fileq: [NULL] objq: [NULL]
    st: FREE md: NULL tch: 0 lfb: 33
    flags:
    cr pin refcnt: 0 sh pin refcnt: 0
    Block dump from disk:
    buffer tsn: 6 rdba: 0x01400080 (5/128)
    scn: 0x0000.00113bc5 seq: 0x02 flg: 0x04 tail: 0x3bc52002
    frmt: 0x02 chkval: 0xd021 type: 0x20=FIRST LEVEL BITMAP BLOCK --在这儿发现原来是L1的bitmap块
    Hex dump of block: st=0, typ_found=1
    Dump of memory from 0x009E9600 to 0x009EB600
    9E9600 0000A220 01400080 00113BC5 04020000 [ .....@..;......]
    9E9610 0000D021 00000000 00000000 00000000 [!...............]
    9E9620 00000000 00000000 00000000 00000000 [................]
    Repeat 1 times
    9E9640 00000000 00000000 00000000 00000004 [................]
    9E9650 FFFFFFFF 00000008 00000003 00000010 [................]
    9E9660 00010002 00000000 00000000 00000000 [................]
    9E9670 00000005 00000003 530045F5 530045F5 [.........E.S.E.S]
    9E9680 00000000 0021000A 000002B7 00000003 [......!.........]
    9E9690 01400081 00000000 00000000 00000008 [..@.............]
    9E96A0 00000008 01400088 00000000 00000000 [......@.........]
    9E96B0 00000000 00000005 00000000 00000001 [................]
    9E96C0 00012CED 001139E1 00000000 01400080 [.,...9........@.]
    9E96D0 00000008 00000000 01400088 00000008 [..........@.....]
    9E96E0 00000008 00000000 00000000 00000000 [................]
    9E96F0 00000000 00000000 00000000 00000000 [................]
    Repeat 8 times
    9E9780 00000000 00000000 00000000 55551511 [..............UU]
    9E9790 00000000 00000000 00000000 00000000 [................]
    Repeat 485 times
    9EB5F0 00000000 00000000 00000000 3BC52002 [............. .;]
    Dump of First Level Bitmap Block
    --------------------------------
    nbits : 4 nranges: 2 parent dba: 0x01400081 poffset: 0  --L1的块的父块地址是0x01400081,换算成10进制是129
    unformatted: 8 total: 16 first useful block: 3
    owning instance : 1
    instance ownership changed at 02/16/2014 13:00:37
    Last successful Search 02/16/2014 13:00:37
    Freeness Status: nf1 0 nf2 0 nf3 0 nf4 5

    Extent Map Block Offset: 4294967295
    First free datablock : 3
    Bitmap block lock opcode 3
    Locker xid: : 0x000a.021.000002b7
    Inc #: 0 Objd: 77037
    HWM Flag: HWM Set
    Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8
    #blocks in seg. hdr's freelists: 0
    #blocks below: 5
    mapblk 0x00000000 offset: 0
    --------------------------------------------------------
    DBA Ranges :
    --------------------------------------------------------
    0x01400080 Length: 8 Offset: 0
    0x01400088 Length: 8 Offset: 8
    --当前L1管理的地址是2个区,16个块,有8个块还没被格式化
    0:Metadata 1:Metadata 2:Metadata 3:75-100% free
    4:75-100% free 5:75-100% free 6:75-100% free 7:75-100% free
    8:unformatted 9:unformatted 10:unformatted 11:unformatted
    12:unformatted 13:unformatted 14:unformatted 15:unformatted
    --------------------------------------------------------

    继续dump L1的父地址的块129信息:

    Start dump data blocks tsn: 6 file#:5 minblk 129 maxblk 129
    Block dump from cache:
    Dump of buffer cache at level 4 for tsn=6, rdba=20971649
    BH (0x57fea708) file#: 5 rdba: 0x01400081 (5/129) class: 9 ba: 0x57d48000
    set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
    dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
    hash: [0x5db40714,0x5db40714] lru: [0x57bf7fd8,0x56be25b0]
    lru-flags: on_auxiliary_list
    ckptq: [NULL] fileq: [NULL] objq: [NULL]
    st: FREE md: NULL tch: 0 lfb: 33
    flags:
    cr pin refcnt: 0 sh pin refcnt: 0
    Block dump from disk:
    buffer tsn: 6 rdba: 0x01400081 (5/129)
    scn: 0x0000.00113bc5 seq: 0x10 flg: 0x04 tail: 0x3bc52110
    frmt: 0x02 chkval: 0xa942 type: 0x21=SECOND LEVEL BITMAP BLOCK --在这儿发现原来129号块是L2的块号
    Hex dump of block: st=0, typ_found=1
    Dump of memory from 0x00578600 to 0x0057A600
    578600 0000A221 01400081 00113BC5 04100000 [!.....@..;......]
    578610 0000A942 00000000 00000000 00000000 [B...............]
    578620 00000000 00000000 00000000 00000000 [................]
    Repeat 1 times
    578640 00000000 00000000 00000000 01400082 [..............@.]
    578650 0000000A 0000000A 00000000 00000001 [................]
    578660 0021000A 000002B7 00012CED 00000001 [..!......,......]
    578670 00000000 01400080 00010005 01400090 [......@.......@.]
    578680 00010005 014000A0 00010005 014000B0 [......@.......@.]
    578690 00010005 014000C0 00010005 014000D0 [......@.......@.]
    5786A0 00010005 014000E0 00010005 014000F0 [......@.......@.]
    5786B0 00010005 01400100 00010005 01400101 [......@.......@.]
    5786C0 00010005 00000000 00000000 00000000 [................]
    5786D0 00000000 00000000 00000000 00000000 [................]
    Repeat 497 times
    57A5F0 00000000 00000000 00000000 3BC52110 [.............!.;]
    Dump of Second Level Bitmap Block
    number: 10 nfree: 10 ffree: 0 pdba: 0x01400082 --它的父地址是82,换算成10进制是130,即使段头的地址
    Inc #: 0 Objd: 77037
    opcode:1
    xid:
    L1 Ranges : --当前L2块能管理的L1的范围。oracle的每一个进程在v$process中都有一个对应的pid,oracle通过pid来进行hash再来进行分配L1,从而达到大并发的效果
    --------------------------------------------------------
    0x01400080 Free: 5 Inst: 1
    0x01400090 Free: 5 Inst: 1
    0x014000a0 Free: 5 Inst: 1
    0x014000b0 Free: 5 Inst: 1
    0x014000c0 Free: 5 Inst: 1
    0x014000d0 Free: 5 Inst: 1
    0x014000e0 Free: 5 Inst: 1
    0x014000f0 Free: 5 Inst: 1
    0x01400100 Free: 5 Inst: 1
    0x01400101 Free: 5 Inst: 1

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

    继续dump L2的父地址(即段头)的块130信息:

    Start dump data blocks tsn: 6 file#:5 minblk 130 maxblk 130
    Block dump from cache:
    Dump of buffer cache at level 4 for tsn=6, rdba=20971650
    BH (0x53bf290c) file#: 5 rdba: 0x01400082 (5/130) class: 4 ba: 0x53a82000
    set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
    dbwrid: 0 obj: 77037 objn: -1 tsn: 6 afn: 5 hint: f
    hash: [0x56be2580,0x5db1c214] lru: [0x53bead80,0x57ffb0b4]
    ckptq: [NULL] fileq: [NULL] objq: [NULL]
    st: CR md: NULL tch: 1
    cr: [scn: 0x0.114112],[xid: 0x0.0.0],[uba: 0x0.0.0],[cls: 0x0.114112],[sfl: 0x0],[lc: 0x0.0]
    flags:
    cr pin refcnt: 0 sh pin refcnt: 0
    BH (0x56be2504) file#: 5 rdba: 0x01400082 (5/130) class: 4 ba: 0x5680e000
    set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
    dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
    hash: [0x5db1c214,0x53bf2988] lru: [0x57fea7b4,0x583fabbc]
    lru-flags: on_auxiliary_list
    ckptq: [NULL] fileq: [NULL] objq: [NULL]
    st: FREE md: NULL tch: 0 lfb: 33
    flags:
    cr pin refcnt: 0 sh pin refcnt: 0
    Block dump from disk:
    buffer tsn: 6 rdba: 0x01400082 (5/130)
    scn: 0x0000.00113bcc seq: 0x01 flg: 0x04 tail: 0x3bcc2301
    frmt: 0x02 chkval: 0x86f4 type: 0x23=PAGETABLE SEGMENT HEADER --发现类型是段头了
    Hex dump of block: st=0, typ_found=1
    Dump of memory from 0x00F07600 to 0x00F09600

    ....省略一些没有用的信息

    Extent Control Header
    -----------------------------------------------------------------
    Extent Header:: spare1: 0 spare2: 0 #extents: 17 #blocks: 256 --一共有17个区,256个块,16个区有8个块,一个区有128个块,在下面的Extent Map也可以看到这个描述
    last map 0x00000000 #maps: 0 offset: 2716
    Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8 --高水位是第二个区的第一个块,插入只会插入高水位以下的块。并发插入时,高水位的位置会影响限制并发插入,因为只能插入高水位以下的块,对于8K的BLOCK大小:1M的区=128个块,那么超过128个并发会有热块,从而产生buffer busy waits; 如果是8M的区=1024个块,超过1024并发同样也会产生热块


    #blocks in seg. hdr's freelists: 0
    #blocks below: 5
    mapblk 0x00000000 offset: 0
    Unlocked
    --------------------------------------------------------
    Low HighWater Mark :  --低高水位,低高水位之下的数据都已经使用了
    Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8
    #blocks in seg. hdr's freelists: 0
    #blocks below: 5
    mapblk 0x00000000 offset: 0
    Level 1 BMB for High HWM block: 0x01400080
    Level 1 BMB for Low HWM block: 0x01400080
    --------------------------------------------------------
    Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
    L2 Array start offset: 0x00001434
    First Level 3 BMB: 0x00000000
    L2 Hint for inserts: 0x01400081 --二级位图块的DBA
    Last Level 1 BMB: 0x01400101
    Last Level II BMB: 0x01400081
    Last Level III BMB: 0x00000000
    Map Header:: next 0x00000000 #extents: 17 obj#: 77037 flag: 0x10000000
    Inc # 0
    Extent Map --segment有几个extent,extent的起始地址以及包含的块数
    -----------------------------------------------------------------
    0x01400080 length: 8
    0x01400088 length: 8
    0x01400090 length: 8
    0x01400098 length: 8
    0x014000a0 length: 8
    0x014000a8 length: 8
    0x014000b0 length: 8
    0x014000b8 length: 8
    0x014000c0 length: 8
    0x014000c8 length: 8
    0x014000d0 length: 8
    0x014000d8 length: 8
    0x014000e0 length: 8
    0x014000e8 length: 8
    0x014000f0 length: 8
    0x014000f8 length: 8
    0x01400100 length: 128

    Auxillary Map --辅助map,extent由哪个L1管理及所管理的区,   和之前L1看到的信息对应

    --------------------------------------------------------
    Extent 0 : L1 dba: 0x01400080 Data dba: 0x01400083
    Extent 1 : L1 dba: 0x01400080 Data dba: 0x01400088
    Extent 2 : L1 dba: 0x01400090 Data dba: 0x01400091
    Extent 3 : L1 dba: 0x01400090 Data dba: 0x01400098
    Extent 4 : L1 dba: 0x014000a0 Data dba: 0x014000a1
    Extent 5 : L1 dba: 0x014000a0 Data dba: 0x014000a8
    Extent 6 : L1 dba: 0x014000b0 Data dba: 0x014000b1
    Extent 7 : L1 dba: 0x014000b0 Data dba: 0x014000b8
    Extent 8 : L1 dba: 0x014000c0 Data dba: 0x014000c1
    Extent 9 : L1 dba: 0x014000c0 Data dba: 0x014000c8
    Extent 10 : L1 dba: 0x014000d0 Data dba: 0x014000d1
    Extent 11 : L1 dba: 0x014000d0 Data dba: 0x014000d8
    Extent 12 : L1 dba: 0x014000e0 Data dba: 0x014000e1
    Extent 13 : L1 dba: 0x014000e0 Data dba: 0x014000e8
    Extent 14 : L1 dba: 0x014000f0 Data dba: 0x014000f1
    Extent 15 : L1 dba: 0x014000f0 Data dba: 0x014000f8
    Extent 16 : L1 dba: 0x01400100 Data dba: 0x01400102
    --------------------------------------------------------

    Second Level Bitmap block DBAs
    --------------------------------------------------------
    DBA 1: 0x01400081

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

     ASSM三级位图块的结构可以用下图表示:

    L1中有指向L3的指针,L2有指向L3的指针,L3中有多个数据块的指针和状态。
    (1)每个L3中,有多个L2的地址(第一个L3是段头)。
    (2)每个L2中,有多个L1的地址。
    (3)每个L1中,有多个数据块地址。
    ORACLE最多支持三级位图,Segment Heade可以管理极大数据量的对象的空间,很难出现另一个三级位图块。
    一级位图用于管理具体数据块的使用,包括头部三个块,不仅仅指数据块的状态,标识的状态有Metadata、75-100% free、50-75% free、25-50% free、0-25% free、full、unformatted。
    二级位图块记录了它管理的一级位图块(FIRST LEVEL BITMAP BLOCK)的地址。
    三级位图块记录的内容比较多,除了记录了二级位图块(SECOND LEVEL BITMAP BLOCK)的地址。还记录了各个区的首块地址以及各个区的DB BLOCK的个数,段的各个区所对应的FIRST LEVEL BITMAP BLOCK的块地址以及区里面记录数据的数据块的起始地址。

    如果一个区拥有很多块,这时会在一个区里出现两个或多个FIRST LEVEL BITMAP BLOCK,这些FIRST LEVEL BITMAP BLOCK分别管理一个区中的一些块,当区的数据块比较少时,一个区的FIRST LEVEL BITMAP BLOCK可以跨区管理多个区的数据块,BITMAP BOLCK最多为三级。

  • 相关阅读:
    shell编程:字符串处理方式
    shell编程:变量替换
    export的用法
    docker stack利用secrets启动wordpress
    docker swarm创建swarm集群
    docker x509: certificate has expired or is not yet valid
    docker-compose的scale的用法
    字符串函数-unquote()函数
    Sass-@each
    Sass-@while
  • 原文地址:https://www.cnblogs.com/nazeebodan/p/3551343.html
Copyright © 2011-2022 走看看