开发者社区> lfreeali> 正文

[20150728]关于block record flag1.txt

简介: [20150728]关于block record flag1.txt --昨天被别人问及这个block record flag,google找到如下链接: http://www.hcdba.com/?p=18 --做一个记录。
+关注继续查看

[20150728]关于block record flag1.txt

--昨天被别人问及这个block record flag,google找到如下链接:
http://www.hcdba.com/?p=18
--做一个记录。

#define KDRHFK 0x80 Cluster Key
#define KDRHFC 0x40 Clustered table member
#define KDRHFH 0x20 Head piece of row
#define KDRHFD 0x10 Deleted row
#define KDRHFF 0x08 First data piece
#define KDRHFL 0x04 Last data piece
#define KDRHFP 0x02 First column continues from Previous piece
#define KDRHFN 0x01 Last column continues in Next piece
---------------------------------------------------
AC====>0x80+0x20+0x08+0x04 ===>dump中的(K-H-FL--)
6C====>0x40+0x20+0x08+0x04 ===>dump中的(-CH-FL--)
2C====>0x20+0x08+0x04      ===>dump中的(--H-FL--)
3C====>0x20+0x10+0x08+0x04 ===>dump中的(--HDFL--)

--为了加强记忆,通过一些例子讲解这8个bit。

1.建立测试例子:

SCOTT@test> @ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SCOTT@test> create table t (id number,v1 varchar2(4000),v2 varchar2(4000),v3 varchar2(4000),v4 varchar2(4000));
Table created.

SCOTT@test> insert into t(id) values (1);
1 row created.

SCOTT@test> commit ;
Commit complete.

SCOTT@test> select rowid,t.id from t ;
ROWID                      ID
------------------ ----------
AABLouAAEAAAACjAAA          1

SCOTT@test> @ lookup_rowid AABLouAAEAAAACjAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
    309806          4        163          0 4,163                alter system dump datafile 4 block 163 ;

SCOTT@test> alter system checkpoint;
System altered.

2.通过bbed观察:
BBED> set dba 4,163
        DBA             0x010000a3 (16777379 4,163)

BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0]                              @8182     0x2c

BBED> x /rn
rowdata[0]                                  @8182
----------
flag@8182: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8183: 0x01
cols@8184:    1
col    0[2] @8185: 1

--这里的标识是2c。
SCOTT@test> alter system dump datafile 4 block 163 ;
System altered.

block_row_dump:
tab 0, row 0, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
end_of_block_dump

--这基本上最常见的形式。组合起来如下:
#define KDRHFH 0x20 Head piece of row
#define KDRHFF 0x08 First data piece
#define KDRHFL 0x04 Last data piece


3.删除看看:

SCOTT@test> delete from t ;
1 row deleted.

SCOTT@test> alter system checkpoint;
System altered.

--bbed观察,必须退出在进入,否则读到的还是旧的信息。
BBED> set dba 4,163
        DBA             0x010000a3 (16777379 4,163)

BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0]                              @8182     0x3c

BBED> x /rn
rowdata[0]                                  @8182
----------
flag@8182: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
lock@8183: 0x02
cols@8184:    0

--这里的标识是3c。增加了1个删除的标识。

SCOTT@test> alter system dump datafile 4 block 163 ;
System altered.

block_row_dump:
tab 0, row 0, @0x1f92
tl: 2 fb: --HDFL-- lb: 0x2
end_of_block_dump

--3c,组合起来如下:
#define KDRHFH 0x20 Head piece of row
#define KDRHFD 0x10 Deleted row
#define KDRHFF 0x08 First data piece
#define KDRHFL 0x04 Last data piece

4.rollback看看:
BBED> x /rn
rowdata[0]                                  @8176
----------
flag@8176: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8177: 0x00
cols@8178:    1

col    0[2] @8179: 1

--如果仔细看地址发生了变化,也就是rollback后而是新写入新的位置。继续修改记录:

SCOTT@test> update t set v1=lpad('a',4000,'a'), v2=lpad('b',4000,'b') where id=1;
1 row updated.

SCOTT@test> commit ;
Commit complete.

BBED> x /rncc
rowdata[0]                                  @4161
----------
flag@4161: 0x28 (KDRHFF, KDRHFH)
lock@4162: 0x02
cols@4163:    2
nrid@4164:0x010000a5.0

col    0[2] @4170: 1
col 1[4000] @4173: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --太长截断。

--看到的flag标识是0x28,行迁移地址是:
SCOTT@test> set verify off
SCOTT@test> @dfb16 0x010000a5
    RFILE#     BLOCK# TEXT
---------- ---------- ------------------------------------------------------------
         4        165 alter system dump datafile 4 block 165 ;

SCOTT@test> alter system dump datafile 4 block 163 ;
System altered.

--0x28,组合起来如下:
block_row_dump:
tab 0, row 0, @0xfdd
tl: 4015 fb: --H-F--- lb: 0x2  cc: 2
nrid:  0x010000a5.0
col  0: [ 2]  c1 02
col  1: [4000]
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61

#define KDRHFH 0x20 Head piece of row
#define KDRHFF 0x08 First data piece

5.继续观察dba=4,165.

BBED> set dba 4,165
        DBA             0x010000a5 (16777381 4,165)

BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0]                              @4182     0x04

BBED> x /rc
rowdata[0]                                  @4182
----------
flag@4182: 0x04 (KDRHFL)
lock@4183: 0x01
cols@4184:    1

col 0[4000] @4185: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb  --太长截断。

--看到的flag标识是0x04,行迁移地址是:

SCOTT@test> alter system dump datafile 4 block 165 ;
System altered.

block_row_dump:
tab 0, row 0, @0xfda
tl: 4006 fb: -----L-- lb: 0x1  cc: 1
col  0: [4000]
62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62

--0x04,组合起来如下:
#define KDRHFL 0x04 Last data piece

6.继续测试:
SCOTT@test> update t set v3=lpad('c',4000,'c'), v4=lpad('d',4000,'d') where id=1;
1 row updated.

SCOTT@test> commit ;
Commit complete.

SCOTT@test> alter system checkpoint;
System altered.


BBED> set dba 4,165
        DBA             0x010000a5 (16777381 4,165)

BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0]                              @170      0x00

BBED> x /rc
rowdata[0]                                  @170
----------
flag@170:  0x00 (NONE)
lock@171:  0x02
cols@172:     1
nrid@173:0x010000a6.0

col 0[4000] @179: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

--flag标识是0x00.

SCOTT@test> @dfb16 0x010000a6
    RFILE#     BLOCK# TEXT
---------- ---------- ------------------------------------------------------------
         4        166 alter system dump datafile 4 block 166 ;

BBED> set dba 4,166
        DBA             0x010000a6 (16777382 4,166)

BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0]                              @4176     0x00

BBED> x /rccc
rowdata[0]                                  @4176
----------
flag@4176: 0x00 (NONE)
lock@4177: 0x01
cols@4178:    1
nrid@4179:0x010000a4.0
col 0[4000] @4185: cccccccccccccccccccccccccccccccccccccccccccccccccc ...

--flag标识是0x00. 行迁移是0x010000a4。
SCOTT@test> @dfb16 0x010000a4
    RFILE#     BLOCK# TEXT
---------- ---------- ------------------------------------------------------------
         4        164 alter system dump datafile 4 block 164 ;

BBED> set dba 4,164
        DBA             0x010000a4 (16777380 4,164)

BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0]                              @4182     0x04

BBED> x /rc
rowdata[0]                                  @4182
----------
flag@4182: 0x04 (KDRHFL)
lock@4183: 0x01
cols@4184:    1

col 0[4000] @4185: dddddddddddddddddddddddddddddddddddddddddddddd

SCOTT@test> alter system dump datafile 4 block 164 ;
System altered.

block_row_dump:
tab 0, row 0, @0xfda
tl: 4006 fb: -----L-- lb: 0x1  cc: 1
col  0: [4000]
64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64

--没有作出如下两项flag:

#define KDRHFP 0x02 First column continues from Previous piece
#define KDRHFN 0x01 Last column continues in Next piece

--以下有关cluster的,另写一篇blog。
#define KDRHFK 0x80 Cluster Key
#define KDRHFC 0x40 Clustered table member

7.建立2k的数据文件看看:

SCOTT@test> alter system set db_2k_cache_size=5m;
System altered.

CREATE TABLESPACE test2k DATAFILE
  '/u01/app/oracle11g/oradata/test/test2k01.dbf' SIZE 10M AUTOEXTEND OFF
LOGGING
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 2K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;

SCOTT@test> create table tx  (id number,v1 varchar2(4000),v2 varchar2(4000),v3 varchar2(4000),v4 varchar2(4000)) tablespace test2k;
Table created.

SCOTT@test> insert into tx (id,v1) values (1,lpad('a',4000,'a'));
1 row created.

SCOTT@test> commit ;
Commit complete.

SCOTT@test> alter system checkpoint;
System altered.

SCOTT@test> select rowid,tx.id from tx ;
ROWID                      ID
------------------ ----------
AABLowAAPAAAAIbAAA          1

SCOTT@test> @ lookup_rowid AABLowAAPAAAAIbAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
    309808         15        539          0 15,539               alter system dump datafile 15 block 539

SCOTT@test> alter system dump datafile 15 block 539;
System altered.

--
block_row_dump:
tab 0, row 0, @0x5e3
tl: 437 fb: --H-F--N lb: 0x1  cc: 2
nrid:  0x03c0021a.0
col  0: [ 2]  c1 02
col  1: [422]
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61

--col1 4000个字节,仅仅放了422个字节。出现了分裂。


SCOTT@test> @bbvi 15 539
BVI_COMMAND
------------------------------------------------------------------------------------------
bvi -b 1103872 -s 2048 /u01/app/oracle11g/oradata/test/test2k01.dbf

0010DE30  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 29 .......................)
0010DE48  01 02 03 C0 02 1A 00 00 02 C1 02 FE A6 01 61 61 61 61 61 61 61 61 61 61 ..............aaaaaaaaaa

--flag=0x29. flag包括:
#define KDRHFH 0x20 Head piece of row
#define KDRHFF 0x08 First data piece
#define KDRHFN 0x01 Last column continues in Next piece

SCOTT@test> @dfb16 0x03c0021a
    RFILE#     BLOCK# TEXT
---------- ---------- ------------------------------------------------------------
        15        538 alter system dump datafile 15 block 538 ;

SCOTT@test> alter system dump datafile 15 block 538 ;
System altered.

block_row_dump:
tab 0, row 0, @0x77
tl: 1801 fb: ------PN lb: 0x1  cc: 1
nrid:  0x03c00219.0
col  0: [1789]
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61

--col0仅仅保存了1789,还是没有完成。

SCOTT@test> @bbvi 15 538
BVI_COMMAND
------------------------------------------------------------------------------------------
bvi -b 1101824 -s 2048 /u01/app/oracle11g/oradata/test/test2k01.dbf

0010D0F0  00 00 00 03 01 01 03 C0 02 19 00 00 FE FD 06 61 61 61 61 61 61 61 61 61 ...............aaaaaaaaa
0010D108  61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaaaaaaaaaa

--flag=0x03,flag包括:
#define KDRHFP 0x02 First column continues from Previous piece
#define KDRHFN 0x01 Last column continues in Next piece
--终于看到了这两个标识,使用P,N 表示。

SCOTT@test> @dfb16 0x03c00219
    RFILE#     BLOCK# TEXT
---------- ---------- ------------------------------------------------------------
        15        537 alter system dump datafile 15 block 537 ;

SCOTT@test> alter system dump datafile 15 block 537 ;
System altered.

block_row_dump:
tab 0, row 0, @0x7d
tl: 1795 fb: -----LP- lb: 0x1  cc: 1
col  0: [1789]
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61

SCOTT@test> @bbvi 15 537
BVI_COMMAND
------------------------------------------------------------------------------------------
bvi -b 1099776 -s 2048 /u01/app/oracle11g/oradata/test/test2k01.dbf

0010C8F0  00 00 00 00 00 00 00 00 00 06 01 01 FE FD 06 61 61 61 61 61 61 61 61 61 ...............aaaaaaaaa
0010C908  61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaaaaaaaaaa

--flag=0x06,flag包括:
#define KDRHFL 0x04 Last data piece
#define KDRHFP 0x02 First column continues from Previous piece

--终于over。最后2个表示在8k的数据块应该很难看到,不过问一下别人8i,9i好像看到过。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
冬季实战营第一期:从零到一上手玩转云服务器 | 学习报告
训练营日期:2022年1月17日 - 2022年1月23日 需要先报名后学习,实际是17-21共5天5个场景的学习,链接地址:https://developer.aliyun.com/adc/series/wintercamplist1?spm=a2c6h.26268694.J_3660455150.2.503610f8RnszVx 我是5月份学习的,并没有实时参加训练营,因为觉着本次训练营课程设置很实用,所以对本次学习做个总结。
6 0
手撸一款简单高效的线程池(一)
线程池大家应该都用过,不过如何从 0 到 1 的设计一款简单好用且性能较好的线程池?我们在接下来的几篇文章中,为您一一介绍。
4 0
基于springboot来实现对日志文件内容的监控
基于springboot来实现对日志文件内容的监控
4 0
手撸一款简单高效的线程池(五)
在之前的内容中,我们给大家介绍了 C++实现线程池过程中的一些常用线优化方案,并分析了不同机制使用时的利弊。这一篇,是线程池系列的最后一章。我们会介绍一下 CGraph 中的 threadpool 如何使用,给出性能对比,并对接下来的工作做一些展望。让我们在线程池性能优化和功能提升的道路上,越走越远。
5 0
+关注
lfreeali
熟悉oracle数据库性能优化,rman备份,数据库恢复技术.
2122
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载