• Oracle 数据块


     以emp表为例

    SYS@ prod>select * from scott.emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
          7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
          7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30

     得到文件号和块号

    SYS@ prod>select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from scott.emp where rownum= 1; 
    
    DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
    ------------------------------------ ------------------------------------
                                       4                                  151

      转储块

    SYS@ prod>alter system dump datafile 4 block 151;
    
    System altered.

      trace文件

    SYS@ prod>oradebug setmypid
    Statement processed.
    SYS@ prod>oradebug tracefile_name
    /u01/diag/rdbms/prod/prod/trace/prod_ora_3890.trc

     分析块

    Block dump from disk:
    buffer tsn: 4 rdba: 0x01000097 (4/151)
    scn: 0x0000.00104463 seq: 0x01 flg: 0x04 tail: 0x44630601
    frmt: 0x02 chkval: 0x47ea type: 0x06=trans data
    Hex dump of block: st=0, typ_found=1 
    • buffer tsn:tablespace number,表空间号,可通过select TS#,name from v$tablespace;验证。
    • rdba(relative database block address ):用4个字节32位来表示,前10位为相对数据文件号,后22位为块号。01400010=0000 0001 0100 0000 0000 0000 0001 0000(二进制)我们看到前10位转换成十进制就是5,后22位转换成十进制就是16。rdba在数据块中的offset是4,即rdba存在于数据块中的第5-9字节中(offset从0开始算),数据块中的每个部分在数据块中的偏移量后边会通过BBED展示,这里可以先不关心。
    • scn:数据块头部SCN,总共占用6个字节,前2个字节表示SCN Wrap,后4个字节表示SCN Base。如果SCN Base达到了4个字节表示的最大值,SCN Wrap+1,SCN Base清0。在数据块中的offset是8。
    • seq: 在同一个SCN中,对一个块的每次更改都会增加一个序列号。如果序列号换行,则必须分配新的SCN。保留值0xFF。如果存在,则表明该块已被Oracle标记为损坏。在数据块中的offset是14。
    • flg:1位标志值的组合。在数据块中的offset是15。1=原始区块 2=最后一次修改块是为了进行清理操作 4=设置校验和值 8=临时数据
    • tail:即tail check,存放于数据块的最后4个字节,用于数据块一致性检查。tail check的组成:SCN Base的低2个字节+type+seq。即tail: 0x32d30601=32d3+06+01
    • frmt:oracle8之后一直都是0x02
    • chkval:块内容的可选校验和。写入块时,校验和将被清除或设置,具体取决于db_block_checksum参数的设置。读取块时,如果存在校验和且参数设置为真,则验证校验和。系统表空间中的块总是计算并检查校验和。校验和是块中所有其他2字节对的XOR。因此,当检查带有校验和的块时,块中所有2字节字的XOR应为0。
    • type:块类型,比如06是表索引等的数据块

    数据块头

    Block header dump:  0x01000097
     Object id on Block? Y
     seg/obj: 0x11ddd  csc: 0x00.f587b  itc: 2  flg: E  typ: 1 - DATA
         brn: 0  bdba: 0x1000090 ver: 0x01 opc: 0
         inc: 0  exflg: 0
    • object id on block:object_id是否保存在块中,oracle 6之后一直都是Y
    • seg/obj:object_id,对应user_objects中的object_id.
    • csc:SCN at last Block CleanOut,表示最后一次块清除(Block CleanOut)时候的SCN
    • itc:itl事务槽的个数。
    • flag:该块是否在freelist上的标志位,若为0标示在freelist上,-表示不再freelist上,E标示使用的ASSM。
    • typ: 1 为 table ; 2 为 index。oracle进行查询的时候是根据 obj$表中的情况来判断对象的类型的,不是根据这个typ。也就是说如果有一个表但改变表中block的这个标志位,一样可以查询出数据来,但dump block 时会出错。
    • brn:
    • bdba:
    • ver:
    • opc:
    • inc:
    • exflg:

    事物槽

     Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
    0x01   0x0001.010.00000198  0x00c15ab0.0061.12  C---    0  scn 0x0000.000b6f31
    0x02   0x000b.019.0000000a  0x0180000c.0003.23  ----    4  fsc 0x0000.00000000 
    • itl:ITL事务槽编号。
    • xid:transac[X]tion identified
    • uba:undo block address
    • flag: ---- 表示transaction is active, or committed pending cleanout;C---表示事务已经提交并且持有的锁已经清除;-B--表示this undo record contains the undo for this ITL entry;--U-表示transaction committed (maybe long ago); SCN is an upper bound,事物已经提交,但是锁还没有清除;---T = transaction was still active at block cleanout SCN块清除的SCN被记录时,该事务仍然是活动的,块上如果有已经提交的事务,那么在clean ount的时候,块会被进行清除,但是这个块里面的事务不会被清除。
    • lck:表示这个事务所影响的行数。我们看到01号事务槽Lck为0,因为该事务槽中的事务Flag为C,证明该事务已经提交,锁也被清楚掉了,该事务槽可以被重用了。02号事务槽Lck为4,说明有4行做了一个更新,并且没有提交,Flag为----说明该事务是活动的。
    • scn/fsc:Commit SCN或者快速提交(Fast Commit Fsc)的SCN

    每条记录中的行级锁对应Itl条目lb,对应于Itl列表中的序号,即那个事务在该记录上产生的锁。对于Oracle来说,对于一个事务,可以是快速提交、也可以是延迟提交,目的都是为了提高提交的速度。提交以后,oracle需要对ITL事务槽、每一行的锁定标记进行清除。如果是快速提交,那么在提交的时候,会将事务表和每一个数据块的ITL槽进行清除。但是锁定标记可能没有清除,等下次用到的时候再进行清除。如果是延迟提交,那么在提交的时候,只是将事务表进行清除,并没有对ITL事务槽进行清除,每一行的锁定标记也没有清除。因此C和U的情况特别多。块清除的过程并不包括每个行的锁定标记的清除,主要指的是ITL的清除。

    注意: 
    1、事务槽中首先记录的是Xid和Uba,只有在提交以后,当对这个数据块进行cleanout的时候,才会更新Flag和Scn。因此Oracle总是以事务表中对这个数据块的Scn以及Flag为准。 
    2、一个事务开始以后,在一个数据块上得到一个事务槽,那么在这个事务提交以前,这个事务槽会一直占用,直到这个事务提交释放这个事务槽。 
    3、只有在已经提交以后,这个itl事务槽中的scn才会有数值。 
    4、事务是否已经提交、事务对应的SCN,这些信息都是以回滚段事务表中的为主,事务槽中的不准确 
    5、事务槽中的事务id和uba地址是准确的 
    6、事务槽1中的事务id和回滚段中的事务id肯定不是一样的,不同回滚段中的事务id也一定不一样。 
     

    尾区储存着数据块的描述信息

    bdba: 0x01000097
    data_block_dump,data header at 0x4d0664
    ===============
    tsiz: 0x1f98
    hsiz: 0x2e
    pbl: 0x004d0664
         76543210
    flag=--------
    ntab=1
    nrow=14
    frre=-1
    fsbo=0x2e
    fseo=0x1aa7
    avsp=0x1d32
    tosp=0x1d32
    • bdba:
    • tsiz:top of size 数据块区的总大小
    • hsiz:Data header size 数据头大小
    • pbl:
    • flag:
    • ntab:表示这个块的数据在一个表(如果是聚簇表就有可能是2或2以上)
    • nrow:块中存储了几行数据
    • frre:first free row index entry, -1=you have to add one(没有创建索引
    • fsbo:Free space begin offset可以存放数据空间的起始位置
    • fseo:Free space end offset可以存放数据空间的结束位置
    • avsp:Available space for new entries可用空间的大小
    • toap:Total space总剩余空间的大小
    0xe:pti[0]      nrow=14 offs=0    --该块有3条记录
    0x12:pri[0]     offs=0x1b2a      --第1条记录在偏移量为0x1b2a的地方,下边以此类推。
    0x14:pri[1]     offs=0x1aa7
    0x16:pri[2]     offs=0x1b7b
    0x18:pri[3]     offs=0x1ba6
    0x1a:pri[4]     offs=0x1bcf
    0x1c:pri[5]     offs=0x1bfc
    0x1e:pri[6]     offs=0x1c25
    0x20:pri[7]     offs=0x1c4e
    0x22:pri[8]     offs=0x1c76
    0x24:pri[9]     offs=0x1c9c
    0x26:pri[10]    offs=0x1cc7
    0x28:pri[11]    offs=0x1ced
    0x2a:pri[12]    offs=0x1d13
    0x2c:pri[13]    offs=0x1d3a
    block_row_dump:
    tab 0, row 0, @0x1b2a
    tl: 38 fb: --H-FL-- lb: 0x2  cc: 8  --lb: 0x2说明事物在该数据行上的锁还没清除,并且该锁指向02号事物槽。(此前对改行进行了更新,并且未提交)
    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 15
    col  6: *NULL*
    col  7: [ 2]  c1 15
    tab 0, row 4, @0x1bcf
    tl: 45 fb: --H-FL-- lb: 0x0  cc: 8     --lb: 0x0说明事物在该数据行上的锁已经被清除。(此前对该行进行了更新,并且已经提交)
    col  0: [ 3]  c2 4d 37
    col  1: [ 6]  4d 41 52 54 49 4e
    col  2: [ 8]  53 41 4c 45 53 4d 41 4e
    col  3: [ 3]  c2 4d 63
    col  4: [ 7]  77 b5 09 1c 01 01 01
    col  5: [ 3]  c2 0d 33
    col  6: [ 2]  c2 0f
    col  7: [ 2]  c1 1f 

    tl   --表示Row Size(number of bytes plus data) 
    fb  --标志位
        K- Cluster key 
        H- head of row piece 
        D- Deleted row 
        F- first data piece   
        L- last data piece   
        P- First column cintinues from previous row 
        N- Last column cintinues in next piece 

    当我们delete一行数据的时候,数据并不是物理的被删除,而是把该行标记为删除,这个时候fb应该是--HDFL-- 而不是原来的--H-FL-- 。

    Lb  --表示lock byte,表示锁定该行的这个事务在itl的入口 
    Cc  --表示number of columns in this Row piece。

    验证数据

    SYS@ prod>select dump(7369,16) from dual;
    
    DUMP(7369,16)
    ---------------------
    Typ=2 Len=3: c2,4a,46
    
    SYS@ prod>select dump('SMITH',16) from dual;
    
    DUMP('SMITH',16)
    ----------------------------
    Typ=96 Len=5: 53,4d,49,54,48
  • 相关阅读:
    Catalan数,括号序列和栈
    NOIP2017 心路历程
    [Code Festival 2017 qual A] C: Palindromic Matrix
    HIVE 数据类型
    HADOOP-HIVE学习笔记(3)- Beeline
    HADOOP-HIVE学习笔记(2) CLI
    中信证券 指标公式 笔记
    【转】Python将列表数据写入文件(txt, csv,excel)
    Python中创建二维数组
    DevExpress 控件汉化方法
  • 原文地址:https://www.cnblogs.com/zhaochunyi/p/10940628.html
Copyright © 2020-2023  润新知