概念描述
通常在创建数据表的时候,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' ;
可以看到最后一列,分配8个块,8 x 8k 也就是64k大小的表空间。
请记住块的序号是 #128、#129、#130、#131、#132、#133、#134、#135,因为这其中有3个块分别可能是“段头块”,L2 BMB,L1 BMB。
FILE_ID = 8,这个FILE_ID就是表空间文件ID号。
接下来详细介绍:
- 段头块
直接通过如下SQL来查询,段头块具体是哪一块:
sel服务器托管网ect header_file,header_block from dba_segments where segment_name= 'TEST' and OWNER='TEST';
第8号表空间文件的#130号就是“段头块”,这就是初始化建表的时候,默认分配的8个block中的其中一块。
我们直接将#130号段头块全部信息dump出来:
alter system dump datafile 8 block 130;
select * from v$diag_info where name='Default Trace File';
dump出来后的内容保存在/u01/app/oracle/diag/rdbms/rac11g/rac11g1/trace/rac11g1_ora_7654.trc文件中。从trc文件中可以看到“type”是:
如下图,还能知道L1 BMB和L2 BMB分别是第128号块,129号块(0x02000080和0x02000081如何转换?见截图下方脚本):
--转换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;
- 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的信息。
很明显,“Free:5”的意思就是有5个块是空闲的,就是可以用来insert使用,总共oracle给开辟了8 x 8k 的空间,3个块(#128、#129、#130)用来装了元数据,只有5个是真正用来存业务数据。
那#131 ~ #135 到底哪一个块先被用来insert数据呢?
- L1 BMB位图块
通过dump 128号块的信息,来详细看看L1 BMB:
alter system dump datafile 8 block 128;
select * from v$diag_info where name='Default Trace File';
通过查看trc文件内容:
如上所示,可以看到类型就是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';
详细解释:
由上图可知服务器托管网当前 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的相关介绍。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
Solon 框架,于2023年的四月份突冲100万下载量了。感谢开源的力量,我们同喜同荣!!!Solon 目前,是“可信开源共同体”的新成员,积极参与中科院的“开源之夏”,是某军工服务商的力推框架,有海外的用户,有互联网用户,有区块链用户,有大厂用户,也是很多…