BMB位图块段头块
  IE5LYMWlmdvL 2023年11月02日 40 0

概念描述

通常在创建数据表的时候,Oracle就为该表创建了相关的元数据。本章节介绍BMB位图块,这些“块”中元数据将决定后续“业务数据”如何插入到表具体哪个物理位置上。所以就很有必要来了解一下BMB(位图块),此外还有“段头块”等。

测试验证

通过创建测试表,一步一步来观察数据块“block”中元数据的详细信息。

首先通过创建一张test表:

create tablespace test datafile '+DATA/rac11g/test.DBF' size 100m;
CREATE USER test IDENTIFIED BY "test" DEFAULT TABLESPACE test;
grant dba to test;
conn test/"test"
create table test(id number,name varchar2(20),other_col char(2000));

完成创建后,直接来观察这个空表的extent map,即“映射图”:

set linesize 1000 pagesize 1000
select extent_id,file_id,block_id,blocks from dba_extents where segment_name='TEST' and OWNER='TEST' ;

BMB位图块段头块_块


可以看到最后一列,分配8个块,8 x 8k 也就是64k大小的表空间。

请记住块的序号是 #128、#129、#130、#131、#132、#133、#134、#135,因为这其中有3个块分别可能是“段头块”,L2 BMB,L1 BMB。

FILE_ID = 8,这个FILE_ID就是表空间文件ID号。

接下来详细介绍:

  1. 段头块
    直接通过如下SQL来查询,段头块具体是哪一块:
select header_file,header_block from dba_segments where segment_name= 'TEST' and OWNER='TEST';

BMB位图块段头块_段头块_02

第8号表空间文件的#130号就是“段头块”,这就是初始化建表的时候,默认分配的8个block中的其中一块。

我们直接将#130号段头块全部信息dump出来:

alter system dump datafile 8 block 130;
select * from v$diag_info where name='Default Trace File';

BMB位图块段头块_元数据_03


dump出来后的内容保存在/u01/app/oracle/diag/rdbms/rac11g/rac11g1/trace/rac11g1_ora_7654.trc文件中。从trc文件中可以看到“type”是:

BMB位图块段头块_块_04


如下图,还能知道L1 BMB和L2 BMB分别是第128号块,129号块(0x02000080和0x02000081如何转换?见截图下方脚本):

BMB位图块段头块_元数据_05

--转换SQL:
select dbms_utility.DATA_BLOCK_ADDRESS_FILE(to_number(replace('&rdba_hex','0x',''),'xxxxxxxxxxxx')) file_no,
  dbms_utility.DATA_BLOCK_ADDRESS_BLOCK(to_number(replace('&rdba_hex','0x',''),'xxxxxxxxxxxx')) block_no
  from dual;
  1. L2 BMB位图块
    上面已经知道第128号块,129号块就是BMB,其实是L2的BMB中会含有L1的BMB信息。再次通过dump 129号块的信息,来详细看看L2 BMB:
alter system dump datafile 8 block 129;
select * from v$diag_info where name='Default Trace File';

整体上看L2 BMB的信息量较少(当然,L3 BMB的信息量就更少了),因为他主要还是用来描述L1 BMB的信息。

BMB位图块段头块_元数据_06


很明显,“Free:5”的意思就是有5个块是空闲的,就是可以用来insert使用,总共oracle给开辟了8 x 8k 的空间,3个块(#128、#129、#130)用来装了元数据,只有5个是真正用来存业务数据。

那#131 ~ #135 到底哪一个块先被用来insert数据呢?

  1. L1 BMB位图块
    通过dump 128号块的信息,来详细看看L1 BMB:
alter system dump datafile 8 block 128;
select * from v$diag_info where name='Default Trace File';

通过查看trc文件内容:

BMB位图块段头块_位图块_07


如上所示,可以看到类型就是L1 BMB;其次就是这个L1 BMB管理着8个块,其中从#128开始,offset=0开始数,第0个~第2个是存放metadata,第3~第7是未格式化的块。因为现在还没有insert,所以是未格式化。

现在对表进行insert操作后,再查看dump信息:

insert into test values(1,'1_a','crw');
commit;
alter system dump datafile 8 block 128;
select * from v$diag_info where name='Default Trace File';

BMB位图块段头块_段头块_08


详细解释:

由上图可知当前 L1 BMB 管理着#128~#135,#136~#143,共16个块,当然最前面3个块是元数据块。

0x02000080 => #128;offset如果是0,那就是#128

0x02000088 => #136;offset如果是8,那就是#136,offset如果是10,那就是#138

所以本次insert数据写入到了#138块中。注意这里插入数据是离散的,不是靠前的先insert。

并且此次插入数据时,Oracle还新分配了一个extent,有extent map可以看出:

BMB位图块段头块_段头块_09

以上就是段头块以及BMB的相关介绍。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: 排序 下一篇: Spark源码分析之-scheduler模块
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
IE5LYMWlmdvL