• [20181226]简单探究cluster table.txt


    [20181226]简单探究cluster table.txt

    --//简单探究cluster table.以前也做过,有点生疏了.

    1.环境:
    SCOTT@book> @ ver1
    PORT_STRING         VERSION    BANNER
    ------------------- ---------- ----------------------------------------------------------------------------
    x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

    2.建立测试环境:
    create cluster deptx_cluster (deptno number(2));

    create table deptx
    (
      deptno  number(2) ,
      dname   varchar2(14 byte),
      loc     varchar2(13 byte)
    ) cluster deptx_cluster (deptno);

    alter table deptx add constraint pk_deptx primary key (deptno);  

    create table empx
    (
      empno     number(4) ,
      ename     varchar2(10 byte),
      job       varchar2(9 byte),
      mgr       number(4),
      hiredate  date,
      sal       number(7,2),
      comm      number(7,2),
      deptno    number(2) references deptx
    ) cluster deptx_cluster (deptno);

    alter table empx  add constraint constraint_name primary key (empno);  

    create index i_deptx_cluster_deptno on cluster deptx_cluster;
    --//注这里不能使用unique,否则报ORA-01715: UNIQUE may not be used with a cluster index

    insert into deptx select * from dept where deptno=10;
    insert into empx select * from emp where deptno=10;

    insert into deptx select * from dept where deptno=20;
    insert into empx select * from emp where deptno=20;

    insert into deptx select * from dept where deptno=30;
    insert into empx select * from emp where deptno=30;

    insert into deptx select * from dept where deptno=40;
    insert into empx select * from emp where deptno=40;

    commit;

    3.查看数据:
    SCOTT@book> select rowid,deptx.* from deptx;
    ROWID                  DEPTNO DNAME          LOC
    ------------------ ---------- -------------- -------------
    AAAWEfAAEAAAAIrAAA         20 RESEARCH       DALLAS
    ~~~~~~~~~~~~~~~~~~
    AAAWEfAAEAAAAItAAA         30 SALES          CHICAGO
    AAAWEfAAEAAAAIuAAA         40 OPERATIONS     BOSTON
    AAAWEfAAEAAAAIvAAA         10 ACCOUNTING     NEW YORK

    SCOTT@book> select rowid,empx.* from empx where deptno=20;
    ROWID                   EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
    AAAWEfAAEAAAAIrAAA       7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
    ~~~~~~~~~~~~~~~~~~
    AAAWEfAAEAAAAIrAAB       7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
    AAAWEfAAEAAAAIrAAC       7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
    AAAWEfAAEAAAAIrAAD       7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
    AAAWEfAAEAAAAIrAAE       7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20

    SCOTT@book> @ dpc '' ''
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  fw7tmp1r74rf4, child number 0
    -------------------------------------
    select rowid,empx.* from empx where deptno=20
    Plan hash value: 1833007843
    ------------------------------------------------------------------------------------------------
    | Id  | Operation            | Name                   | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
    ------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |                        |        |       |     2 (100)|          |
    |   1 |  TABLE ACCESS CLUSTER| EMPX                   |      5 |   190 |     2   (0)| 00:00:01 |
    |*  2 |   INDEX UNIQUE SCAN  | I_DEPTX_CLUSTER_DEPTNO |      1 |       |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------------
    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------
       1 - SEL$1 / EMPX@SEL$1
       2 - SEL$1 / EMPX@SEL$1
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       2 - access("DEPTNO"=20)

    --//可以发现查询empx表的deptno=20可以利用cluster table的索引.另外你可以注意一个特点cluster table里面的表rowid可以相同.比如下划线的内容.
    --//实际上这样设计相关表的查询都保存在相同块中,连接访问会快许多.

    SCOTT@book> @ rowid AAAWEfAAEAAAAIrAAA
        OBJECT       FILE      BLOCK        ROW ROWID_DBA            DBA                  TEXT
    ---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
         90399          4        555          0  0x100022B           4,555                alter system dump datafile 4 block 555 ;
    --//转储dba=4,555看看.

    3.转储分析:
    SCOTT@book> alter system flush buffer_cache;
    System altered.

    SCOTT@book> alter system dump datafile 4 block 555 ;
    System altered.

    Block header dump:  0x0100022b
     Object id on Block? Y
     seg/obj: 0x1611f  csc: 0x03.175f42b6  itc: 2  flg: E  typ: 1 - DATA
         brn: 0  bdba: 0x1000228 ver: 0x01 opc: 0
         inc: 0  exflg: 0

     Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
    0x01   0x0009.01b.00000a44  0x00c00356.0394.31  C---    0  scn 0x0003.175f42b6
    0x02   0x000a.001.00004cfa  0x00c02e94.0ef9.27  --U-    6  fsc 0x0000.175f42cc
    bdba: 0x0100022b
    data_block_dump,data header at 0x7f286b5f1064
    ===============
    tsiz: 0x1f98
    hsiz: 0x28
    pbl: 0x7f286b5f1064
         76543210
    flag=-------K
    ntab=3
    nrow=7
    frre=-1
    fsbo=0x28
    fseo=0x1eb9
    avsp=0x1e91
    tosp=0x1e91
    0xe:pti[0]  nrow=1  offs=0
    0x12:pti[1] nrow=1  offs=1
    0x16:pti[2] nrow=5  offs=2
    --//说明有3个表,cluster表deptx_cluster以及表deptx,empx.行数分别是1,1,5(下面可以看到对于7条记录).后面offs表示偏移量.
    0x1a:pri[0] offs=0x1f82
    0x1c:pri[1] offs=0x1f6e
    0x1e:pri[2] offs=0x1f4b
    0x20:pri[3] offs=0x1f25
    0x22:pri[4] offs=0x1f00
    0x24:pri[5] offs=0x1edd
    0x26:pri[6] offs=0x1eb9
    block_row_dump:
    tab 0, row 0, @0x1f82                               --//表0 cluster table deptx_cluster
    tl: 22 fb: K-H-FL-- lb: 0x0  cc: 1
    --//fb: K-H-FL--, K meaning cluster key.
    --//The remaining rows have the second high order bit set (fb: -CH-FL--),
    --//C meaning cluster table member.
    curc: 6 comc: 6 pk: 0x0100022b.0 nk: 0x0100022b.0
    --//curc: 6 Current row count for this key in this block
    --//comc: 6 Committed row count for this key in this block
    --//pk: pk: 0x0100022b.0 ROWID of Previous block for this cluster key
    --//nk: 0x0100022b.0 ROWID of Next block for this cluster key
    col  0: [ 2]  c1 15                                 --//数字20.
    tab 1, row 0, @0x1f6e
    tl: 20 fb: -CH-FL-- lb: 0x2  cc: 2 cki: 0           --//表1 deptx
                                                        --//C meaning cluster table member.
    col  0: [ 8]  52 45 53 45 41 52 43 48               --//对应内容'RESEARCH'
    col  1: [ 6]  44 41 4c 4c 41 53                     --//对应内容'DALLAS'
    tab 2, row 0, @0x1f4b                               --//表2 empx
    tl: 35 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0
    col  0: [ 3]  c2 4a 46
    col  1: [ 5]  53 4d 49 54 48
    col  2: [ 5]  43 4c 45 52 4b
    col  3: [ 3]  c2 50 03
    col  4: [ 7]  77 b4 0c 11 01 01 01
    col  5: [ 2]  c2 09
    tab 2, row 1, @0x1f25
    tl: 38 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0
    col  0: [ 3]  c2 4c 43
    col  1: [ 5]  4a 4f 4e 45 53
    col  2: [ 7]  4d 41 4e 41 47 45 52
    col  3: [ 3]  c2 4f 28
    col  4: [ 7]  77 b5 04 02 01 01 01
    col  5: [ 3]  c2 1e 4c
    tab 2, row 2, @0x1f00
    tl: 37 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0
    col  0: [ 3]  c2 4e 59
    col  1: [ 5]  53 43 4f 54 54
    col  2: [ 7]  41 4e 41 4c 59 53 54
    col  3: [ 3]  c2 4c 43
    col  4: [ 7]  77 bb 04 13 01 01 01
    col  5: [ 2]  c2 1f
    tab 2, row 3, @0x1edd
    tl: 35 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0
    col  0: [ 3]  c2 4f 4d
    col  1: [ 5]  41 44 41 4d 53
    col  2: [ 5]  43 4c 45 52 4b
    col  3: [ 3]  c2 4e 59
    col  4: [ 7]  77 bb 05 17 01 01 01
    col  5: [ 2]  c2 0c
    tab 2, row 4, @0x1eb9
    tl: 36 fb: -CH-FL-- lb: 0x2  cc: 6 cki: 0
    col  0: [ 3]  c2 50 03
    col  1: [ 4]  46 4f 52 44
    col  2: [ 7]  41 4e 41 4c 59 53 54
    col  3: [ 3]  c2 4c 43
    col  4: [ 7]  77 b5 0c 03 01 01 01
    col  5: [ 2]  c2 1f
    end_of_block_dump
    End dump data blocks tsn: 4 file#: 4 minblk 555 maxblk 555

    --//通过bbed观察:
    BBED> p dba 4,555 kdbt
    struct kdbt[0], 4 bytes                     @114
       sb2 kdbtoffs                             @114      0
       sb2 kdbtnrow                             @116      1
    struct kdbt[1], 4 bytes                     @118
       sb2 kdbtoffs                             @118      1
       sb2 kdbtnrow                             @120      1
    struct kdbt[2], 4 bytes                     @122
       sb2 kdbtoffs                             @122      2
       sb2 kdbtnrow                             @124      5

    --//与如下对应:
    0xe:pti[0]  nrow=1  offs=0
    0x12:pti[1] nrow=1  offs=1
    0x16:pti[2] nrow=5  offs=2

    --//比如可以看出对于当前块表empx位于*kdbr[2]开始.

    BBED> x /rn *kdbr[0]
    rowdata[201]                                @8166
    ------------
    flag@8166: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK)       --//cluster key.行头为ac 普通表为2c
    lock@8167: 0x00
    cols@8168:    1
    kref@8169:    6
    mref@8171:    6
    hrid@8173:0x0100022b.0
    nrid@8179:0x0100022b.0
    col    0[2] @8185: 20

    BBED> x /rcc *kdbr[1]
    rowdata[181]                                @8146
    ------------
    flag@8146: 0x6c (KDRHFL, KDRHFF, KDRHFH, KDRHFC)      --//cluser table member .行头为6c 删除为7c,实际上加入KDRHFD标志.
    lock@8147: 0x02
    cols@8148:    2
    col    0[8] @8150: RESEARCH
    col    1[6] @8159: DALLAS
    --//注:不包括cluster table key.

    BBED> x /rnccntnnn *kdbr[2]
    rowdata[146]                                @8111
    ------------
    flag@8111: 0x6c (KDRHFL, KDRHFF, KDRHFH, KDRHFC)
    lock@8112: 0x02
    cols@8113:    6
    col    0[3] @8115: 7369
    col    1[5] @8119: SMITH
    col    2[5] @8125: CLERK
    col    3[3] @8131: 7902
    col    4[7] @8135: 1980-12-17 00:00:00
    col    5[2] @8143: 800

    4.做一个删除的手工恢复看看.

    SCOTT@book> delete from empx where empno=7566;
    1 row deleted.

    SCOTT@book> commit ;
    Commit complete.

    SCOTT@book> alter system flush buffer_cache;
    System altered.

    SCOTT@book> alter system dump datafile 4 block 555 ;
    System altered.

    --//仅仅贴出改动部分:
    block_row_dump:
    tab 0, row 0, @0x1f82
    tl: 22 fb: K-H-FL-- lb: 0x0  cc: 1
    curc: 6 comc: 5 pk: 0x0100022b.0 nk: 0x0100022b.0
    col  0: [ 2]  c1 15
    --//comc 5 少1条记录.

    ...

    tl: 35 fb: -CH-FL-- lb: 0x0  cc: 6 cki: 0
    col  0: [ 3]  c2 4a 46
    col  1: [ 5]  53 4d 49 54 48
    col  2: [ 5]  43 4c 45 52 4b
    col  3: [ 3]  c2 50 03
    col  4: [ 7]  77 b4 0c 11 01 01 01
    col  5: [ 2]  c2 09
    tab 2, row 1, @0x1f25
    tl: 4 fb: -CHDFL-- lb: 0x2  cc: 0 cki: 0  --//加入D标志.
    tab 2, row 2, @0x1f00

    --//如果手工修复,需要修改2处.

    BBED> x /rn *kdbr[0]
    rowdata[201]                                @8166
    ------------
    flag@8166: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK)
    lock@8167: 0x00
    cols@8168:    1
    kref@8169:    6
    mref@8171:    5
    ~~~~~~~~~~~~~~~
    hrid@8173:0x0100022b.0
    nrid@8179:0x0100022b.0
    col    0[2] @8185: 20

    BBED> x /rnccntnnn *kdbr[3]
    rowdata[108]                                @8073
    ------------
    flag@8073: 0x7c (KDRHFL, KDRHFF, KDRHFD, KDRHFH, KDRHFC)
    lock@8074: 0x02
    cols@8075:    0

    --//执行如下:
    assign /d offset 8171=6;
    assign /x offset 8073=6c;

    BBED> assign /d offset 8171=6;
    Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
    ub1 rowdata[0]                              @8171     0x06

    BBED> assign /x offset 8073=6c;
    ub1 rowdata[0]                              @8073     0x6c

    --//检查:
    BBED> x /rn *kdbr[0]
    rowdata[201]                                @8166
    ------------
    flag@8166: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK)
    lock@8167: 0x00
    cols@8168:    1
    kref@8169:    6
    mref@8171:    6
    hrid@8173:0x0100022b.0
    nrid@8179:0x0100022b.0
    col    0[2] @8185: 20

    BBED> x /rnccntnnn *kdbr[2]
    rowdata[146]                                @8111
    ------------
    flag@8111: 0x6c (KDRHFL, KDRHFF, KDRHFH, KDRHFC)
    lock@8112: 0x00
    cols@8113:    6

    col    0[3] @8115: 7369
    col    1[5] @8119: SMITH
    col    2[5] @8125: CLERK
    col    3[3] @8131: 7902
    col    4[7] @8135: 1980-12-17 00:00:00
    col    5[2] @8143: 800

    BBED> sum apply
    Check value for File 4, Block 555:
    current = 0xf209, required = 0xf209

    BBED> verify
    DBVERIFY - Verification starting
    FILE = /mnt/ramdisk/book/users01.dbf
    BLOCK = 555

    Block Checking: DBA = 16777771, Block Type = KTB-managed data block
    data header at 0x7fd6f1fd9264
    kdbchk: the amount of space used is not equal to block size
            used=263 fsc=34 avsp=7825 dtl=8088
    Block 555 failed with check code 6110
    --//空间问题暂时不理会.
    --//验证修改是否有效.
    SCOTT@book> select rowid,empx.* from empx where deptno=20;
    ROWID                   EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
    AAAWEfAAEAAAAIrAAA       7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
    AAAWEfAAEAAAAIrAAB       7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
    AAAWEfAAEAAAAIrAAC       7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
    AAAWEfAAEAAAAIrAAD       7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
    AAAWEfAAEAAAAIrAAE       7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20
    --//empno=7566可以查询到.如果通过索引是无法查询到信息.
    SCOTT@book> select rowid,empx.* from empx where empno=7566;
    no rows selected

    --//如果不修复comc的偏移,还原:
    BBED> assign /d offset 8171=5;
    ub1 rowdata[0]                              @8171     0x05

    BBED> sum apply
    Check value for File 4, Block 555:
    current = 0xf109, required = 0xf109

    BBED> verify
    DBVERIFY - Verification starting
    FILE = /mnt/ramdisk/book/users01.dbf
    BLOCK = 555

    Block Checking: DBA = 16777771, Block Type = KTB-managed data block
    data header at 0x105cc64
    kdbchk:  key comref count wrong
             keyslot=0
    Block 555 failed with check code 6121

    --//会报如上错误.不过查询没有问题.

    SCOTT@book> alter system flush buffer_cache;
    System altered.

    SCOTT@book> select rowid,empx.* from empx where deptno=20;
    ROWID                   EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
    AAAWEfAAEAAAAIrAAA       7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
    AAAWEfAAEAAAAIrAAB       7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
    AAAWEfAAEAAAAIrAAC       7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
    AAAWEfAAEAAAAIrAAD       7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
    AAAWEfAAEAAAAIrAAE       7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20

    5.最后修复bbed verify的错误.
    --//这个错误我建议不熟悉bbed,不再修复,比较繁琐.

    BBED> assign /d offset 8171=6;
    ub1 rowdata[0]                              @8171     0x06

    BBED> sum apply
    Check value for File 4, Block 555:
    current = 0xf209, required = 0xf209

    BBED> verify
    DBVERIFY - Verification starting
    FILE = /mnt/ramdisk/book/users01.dbf
    BLOCK = 555

    Block Checking: DBA = 16777771, Block Type = KTB-managed data block
    data header at 0x105cc64
    kdbchk: the amount of space used is not equal to block size
            used=263 fsc=34 avsp=7825 dtl=8088
    Block 555 failed with check code 6110

    --//理论used+fsc+avsp=dtl
    --//dtl-used-fsc= 8088-263-34 = 7791
    --//然后assign kdbh.kdbhavsp=7791,如果修改事务itl槽信息,步骤也不少.

    BBED> assign kdbh.kdbhavsp=7791
    sb2 kdbhavsp                                @110      7791

    BBED> sum apply
    Check value for File 4, Block 555:
    current = 0xf2f7, required = 0xf2f7

    BBED> verify
    DBVERIFY - Verification starting
    FILE = /mnt/ramdisk/book/users01.dbf
    BLOCK = 555

    Block Checking: DBA = 16777771, Block Type = KTB-managed data block
    data header at 0x107ec64
    kdbchk: space available on commit is incorrect
            tosp=7863 fsc=34 stb=0 avsp=7791
    Block 555 failed with check code 6111

    --//tosp - fsc - stb = avsp.
    --//avsp+fsstb=  7791+34+0 = 7825.

    BBED> assign kdbh.kdbhtosp=7825
    sb2 kdbhtosp                                @112      7825

    BBED> sum apply
    Check value for File 4, Block 555:
    current = 0xf2d1, required = 0xf2d1

    BBED> verify
    DBVERIFY - Verification starting
    FILE = /mnt/ramdisk/book/users01.dbf
    BLOCK = 555
    DBVERIFY - Verification complete
    Total Blocks Examined         : 1
    Total Blocks Processed (Data) : 1
    Total Blocks Failing   (Data) : 0
    Total Blocks Processed (Index): 0
    Total Blocks Failing   (Index): 0
    Total Blocks Empty            : 0
    Total Blocks Marked Corrupt   : 0
    Total Blocks Influx           : 0
    Message 531 not found;  product=RDBMS; facility=BBED

    6.修复索引:
    SCOTT@book> alter index pk_empx rebuild online;
    Index altered.
    --//注意一定要加online,不然不回表,无法修复错误索引错误.

    SCOTT@book> select rowid,empx.* from empx where empno=7566;
    ROWID                   EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
    AAAWEfAAEAAAAIrAAB       7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20

    总结:
    --//修复cluster table要比普通表有难度.


  • 相关阅读:
    二叉排序树
    索引顺序表查找(分块查找)
    wpf中的窗口
    递归算法以及汉诺塔
    Net中资源存储的设置
    AutoResetEvent 和ManualResetEvent
    WPF:跨应用程序会话保持和还原应用程序范围的属性
    Base64编码及其作用
    WPF中的应用程序级别Application
    Ajax经典学习教材,IBM官方Ajax教材
  • 原文地址:https://www.cnblogs.com/lfree/p/10178107.html
Copyright © 2020-2023  润新知