关于位图数据和标记位-P3
文章目录
1 背景
对于LMT的表空间,dump真正的位图块后(比如3号块开始,2号是位图段头),竟然看到7,F值。
引用作者的话,只看到0和1两个值做代表。
位图块中每一个二进制位对应一个区是否被分配给某个表、索引等对象。如果第一个二进制位0说明表空间中第一个区未分配,如果为1说明已分配;第二个二进制位对应第二个区,以此类推。
那么7,F又代表什么意思。另外,
在Oracle 10g中,3~8号块是位图数据块,共6个位图块,大小是48K字节,每个字节8个二进制位,一共393216个二进制。每个二进制位对应一个区,一共就393216个区。如果是Oracle 11GR2,这个数字又要多出好多倍。
按照这样的计算,每个位图数据块(默认8k算),可以对应8*1024*8=65536个区。但事实上,我在做实验发现只能对应63488个。
关于标记位,Vage描述如下:
Oracle如何在这30多万个二进制为中,确定哪个二进制位对应的区可以分配给表呢?
Oracle用的方法其实很简单,在位图块中,找一个标记位,如果0 ~ 2号区被占用了,标记为的值为3;如果3 ~ 4号区又被占用了,标记为增加为5。假设此时2号区被释放了。标记为变为2。
如果需要分配新的区,从这个标记为处开始查找即可。假设目前标记为值为5,有进程需要4个未分配区,Oracle就从5号区开始向下查找。
1.1 问题
- 实际dump出来的内容中,存在7,B,F这类值,代表什么信息
- 实际位图数据块可以对应的区的个数
- 位图的标记位如何查看
2 问题1探究
实际不考虑删除分区的情况下,很容易发现,每个数字代表4个区,并且每分配一个区,前两个数字的值变化规律如下:
| 区数量 | 对应值(16进制) | 2进制(对应8个区) |
|---|---|---|
| 0 | 00 | 00000000 |
| 1 | 01 | 00000001 |
| 2 | 03 | 00000011 |
| 3 | 07 | 00000111 |
| 4 | 0F | 00001111 |
| 5 | 1F | 00011111 |
| 6 | 3F | 00111111 |
| … | … | … |
其中第3列中,0代表未被使用,1代表被使用。
2.1 没有区的情况
注意:如果使用alter system dump datafile 6 block 3;可能需要alter system flush buffer_cache;才能看到最新的信息。
SYS@zkm1> drop tablespace tbs1 including contents and datafiles;
Tablespace dropped.
SYS@zkm1> create tablespace tbs1 datafile '+arch' size 1g autoextend on uniform size 40k;
Tablespace created.
SYS@zkm1> select value from v$diag_info where name like 'De%';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/zkm/zkm1/trace/zkm1_ora_8394.trc
SYS@zkm1> exec dbms_space_admin.tablespace_dump_bitmaps('TBS1'); --或者alter system dump datafile 6 block 3;
PL/SQL procedure successfully completed.
查看zkm1_ora_8394.trc文件,可以发现:
Header Control:
RelFno: 6, Unit: 5, Size: 131072, Flag: 9
AutoExtend: YES, Increment: 12800, MaxSize: 4194302
Initial Area: 6, Tail: 131072, First: 0, Free: 26213
Deallocation scn: 3.0
Header Opcode:
Save: No Pending Op
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 8, Flag: 0, First: 0, Free: 63488
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
…篇幅省略…
0000000000000000 0000000000000000 0000000000000000 0000000000000000
2.2 一个区的情况
重新开启一个新的会话。
SYS@zkm1> create table zkm.test as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST';
EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 8 40960 5
SYS@zkm1> select value from v$diag_info where name like 'De%';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/zkm/zkm1/trace/zkm1_ora_11456.trc
SYS@zkm1> exec dbms_space_admin.tablespace_dump_bitmaps('TBS1');
PL/SQL procedure successfully completed.
查看zkm1_ora_11456.trc文件,可以发现:
Header Control:
RelFno: 6, Unit: 5, Size: 131072, Flag: 9
AutoExtend: YES, Increment: 12800, MaxSize: 4194302
Initial Area: 6, Tail: 131072, First: 1, Free: 26212
Deallocation scn: 3.0
Header Opcode:
Save: No Pending Op
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 8, Flag: 0, First: 1, Free: 63487
0100000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
…篇幅省略…
0000000000000000 0000000000000000 0000000000000000 0000000000000000
2.3 两个区的情况
重新开启一个新的会话。
SYS@zkm1> alter table zkm.test allocate extent (size 40k);
Table altered.
SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST';
EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 8 40960 5
1 6 13 40960 5
SYS@zkm1> select value from v$diag_info where name like 'De%';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/zkm/zkm1/trace/zkm1_ora_12801.trc
SYS@zkm1> exec dbms_space_admin.tablespace_dump_bitmaps('TBS1');
PL/SQL procedure successfully completed.
查看zkm1_ora_12801.trc文件,可以发现:
Header Control:
RelFno: 6, Unit: 5, Size: 131072, Flag: 9
AutoExtend: YES, Increment: 12800, MaxSize: 4194302
Initial Area: 6, Tail: 131072, First: 2, Free: 26211
Deallocation scn: 3.0
Header Opcode:
Save: No Pending Op
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 8, Flag: 0, First: 2, Free: 63486
0300000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
…篇幅省略…
0000000000000000 0000000000000000 0000000000000000 0000000000000000
2.4 三个区的情况
重新开启一个新的会话。
SYS@zkm1> alter table zkm.test allocate extent (size 40k);
Table altered.
SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST';
EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 8 40960 5
1 6 13 40960 5
2 6 18 40960 5
SYS@zkm1> select value from v$diag_info where name like 'De%';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/zkm/zkm1/trace/zkm1_ora_15908.trc
SYS@zkm1> exec dbms_space_admin.tablespace_dump_bitmaps('TBS1');
PL/SQL procedure successfully completed.
查看zkm1_ora_15908.trc文件,可以发现:
Header Control:
RelFno: 6, Unit: 5, Size: 131072, Flag: 9
AutoExtend: YES, Increment: 12800, MaxSize: 4194302
Initial Area: 6, Tail: 131072, First: 3, Free: 26210
Deallocation scn: 3.0
Header Opcode:
Save: No Pending Op
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 8, Flag: 0, First: 3, Free: 63485
0700000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
…篇幅省略…
0000000000000000 0000000000000000 0000000000000000 0000000000000000
2.5 四个区的情况
重新开启一个新的会话。
SYS@zkm1> alter table zkm.test allocate extent (size 40k);
Table altered.
SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST';
EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 8 40960 5
1 6 13 40960 5
2 6 18 40960 5
3 6 23 40960 5
SYS@zkm1> select value from v$diag_info where name like 'De%';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/zkm/zkm1/trace/zkm1_ora_15908.trc
SYS@zkm1> exec dbms_space_admin.tablespace_dump_bitmaps('TBS1');
PL/SQL procedure successfully completed.
查看zkm1_ora_15908.trc文件,可以发现:
Header Control:
RelFno: 6, Unit: 5, Size: 131072, Flag: 9
AutoExtend: YES, Increment: 12800, MaxSize: 4194302
Initial Area: 6, Tail: 131072, First: 4, Free: 26209
Deallocation scn: 3.0
Header Opcode:
Save: No Pending Op
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 8, Flag: 0, First: 4, Free: 63484
0F00000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
…篇幅省略…
0000000000000000 0000000000000000 0000000000000000 0000000000000000
2.6 五个区的情况
步骤雷同,略。
3 问题2探究
实际位图数据块可以对应的区的个数,以一个数据块为例子。
按照Vage的说法,一个块对应65536个区,因为一个8k的块,共65536bit。
实际上我们以2.1中zkm1_ora_8394.trc文件为例子的话结果只可以对应63488个区。
Header Control:
RelFno: 6, Unit: 5, Size: 131072, Flag: 9
AutoExtend: YES, Increment: 12800, MaxSize: 4194302
Initial Area: 6, Tail: 131072, First: 0, Free: 26213
Deallocation scn: 3.0
Header Opcode:
Save: No Pending Op
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 8, Flag: 0, First: 0, Free: 63488
0000000000000000 0000000000000000 0000000000000000 0000000000000000
...省略了246行...
0000000000000000 0000000000000000 0000000000000000 0000000000000000
加上首尾共248行,每行64个0,总共15872个0。
其中,一个0可以对应4个区,总的对应63488个区,和“Free: 63488”是相符合的。
3.1 模拟63488+1个区
目的:模拟处63488个区,这样第一个位图块(文件6块号3)应该是全F的情况,在拓展多一个区就会用到4号块了。
3.1.1 拓展分区
可以看到,当前已经有6个区了。需要拓展多63482个区,共2539280k大小。
SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST';
EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 8 40960 5
1 6 13 40960 5
2 6 18 40960 5
3 6 23 40960 5
4 6 28 40960 5
5 6 33 40960 5
6 rows selected.
SYS@zkm1> alter table zkm.test allocate extent (size 2539280k);
Table altered.
SYS@zkm1> select count(*) from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST';
COUNT(*)
----------
63488
3.1.2 dump 3,4号块
SYS@zkm1> alter system flush buffer_cache;
System altered.
SYS@zkm1> select value from v$diag_info where name like 'De%';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/zkm/zkm1/trace/zkm1_ora_67300.trc
SYS@zkm1> alter system dump datafile 6 block min 3 block max 4;
System altered.
3.1.3 查看zkm1_ora_67300.trc内容
///////////以下是3号块的内容///////////
...省略部分内容...
Block dump from disk:
buffer tsn: 7 rdba: 0x01800003 (6/3)
scn: 0x0000.001b87b5 seq: 0x0e flg: 0x04 tail: 0x87b51e0e
frmt: 0x02 chkval: 0x4188 type: 0x1e=KTFB Bitmapped File Space Bitmap
Hex dump of block: st=0, typ_found=1
...省略部分内容...
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 8, Flag: 0, First: 63488, Free: 0
FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
...省略部分内容...
FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
...省略部分内容...
///////////以下是4号块的内容///////////
Block dump from cache:
Dump of buffer cache at level 4 for tsn=7 rdba=25165828
Block dump from disk:
buffer tsn: 7 rdba: 0x01800004 (6/4)
scn: 0x0000.001afbf4 seq: 0x01 flg: 0x04 tail: 0xfbf41e01
frmt: 0x02 chkval: 0x998a type: 0x1e=KTFB Bitmapped File Space Bitmap
Hex dump of block: st=0, typ_found=1
...省略部分内容...
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 317448, Flag: 0, First: 0, Free: 63488
0000000000000000 0000000000000000 0000000000000000 0000000000000000
...省略部分内容...
0000000000000000 0000000000000000 0000000000000000 0000000000000000
...省略部分内容...
End dump data blocks tsn: 7 file#: 6 minblk 3 maxblk 4
可以看到,3号块的Free已经是0了,表示3号块已经满了。从4号块的信息看,还未被使用。
3.1.4 拓展第63489个区
SYS@zkm1> alter table zkm.test allocate extent (size 40k);
Table altered.
SYS@zkm1> select count(*) from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST';
COUNT(*)
----------
63489
SYS@zkm1> alter system flush buffer_cache;
System altered.
SYS@zkm1> select value from v$diag_info where name like 'De%';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/zkm/zkm1/trace/zkm1_ora_70162.trc
SYS@zkm1> alter system dump datafile 6 block 4;
System altered.
SYS@zkm1> !cat /u01/app/oracle/diag/rdbms/zkm/zkm1/trace/zkm1_ora_70162.trc | more
...省略部分内容...
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 317448, Flag: 0, First: 1, Free: 63487
0100000000000000 0000000000000000 0000000000000000 0000000000000000
...省略部分内容...
0000000000000000 0000000000000000 0000000000000000 0000000000000000
...省略部分内容...
已经符合规律。其实Vage的计算方法在11.2.0.4.0就错了,10g我没做实验去验证。
目前没环境,先当做任务留着吧。
- 10g验证一个位图数据块对应的区个数
4 问题3探究
删除并重新创建表空间,创建8张表,每个表一个区,可以做到随时回收某一个区。
SYS@zkm1> drop tablespace tbs1 including contents and datafiles;
Tablespace dropped.
SYS@zkm1> create tablespace tbs1 datafile '+arch' size 1g autoextend on uniform size 40k;
Tablespace created.
SYS@zkm1> create table zkm.test1 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> create table zkm.test2 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> create table zkm.test3 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> create table zkm.test4 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> create table zkm.test5 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> create table zkm.test6 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> create table zkm.test7 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> create table zkm.test8 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> set linesize 500
SYS@zkm1> col SEGMENT_NAME for a15
SYS@zkm1> select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME like 'TEST%';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- ---------- ---------- ---------- ---------- ----------
TEST1 0 6 8 40960 5
TEST2 0 6 13 40960 5
TEST3 0 6 18 40960 5
TEST4 0 6 23 40960 5
TEST5 0 6 28 40960 5
TEST6 0 6 33 40960 5
TEST7 0 6 38 40960 5
TEST8 0 6 43 40960 5
8 rows selected.
因为正好8个区,做dump后有:
| 区数量 | 对应值(16进制) | 2进制(对应8个区) |
|---|---|---|
| 8 | FF | 11111111 |
删除TEST3表,继续做dump有:
需要注意的是删除表时候要加purge,不然默认表进了回收站是看不到想要的结果的。
| 区数量 | 对应值(16进制) | 2进制(对应8个区) |
|---|---|---|
| 7 | FB | 11111011 |
确实看到第3个区被标记为0了。
添加test9表,看是否使用了第3个区:
SYS@zkm1> create table zkm.test9 as select rownum id from dual where rownum=1;
Table created.
SYS@zkm1> select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME like 'TEST%';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- ---------- ---------- ---------- ---------- ----------
TEST1 0 6 8 40960 5
TEST2 0 6 13 40960 5
TEST9 0 6 18 40960 5
TEST4 0 6 23 40960 5
TEST5 0 6 28 40960 5
TEST6 0 6 33 40960 5
TEST7 0 6 38 40960 5
TEST8 0 6 43 40960 5
8 rows selected.
段TEST9的区第一个块的id为18,和之前的TEST3是一样的。看来是重用了。
从dump结果看(省略),确实变为FF了。
- 但是仍然不知道标记位怎么看。
关于位图数据和标记位-P3的更多相关文章
- 面试问题2:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字
问题描述:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字 大数据操作: 解决方法一: 依次遍历文件数据, 开始32二进制清0 每次读取一个数,先和二进制位与,如果为0 则 ...
- 汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY
在8086CPU中,有一种标记寄存器,长度为16bit: 其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag. 功能:1)用来存储相关指令的 ...
- Double 数据保留两位小数一:五舍六入
package com; public class T2 { public static void main(String[] args) { System.out.println(calculate ...
- Double 数据保留两位小数二:直接截取小数后面两位,不进行四舍五入
package com; public class T2 { public static void main(String[] args) { System.out.println(calculate ...
- 如何将内存中的位图数据绘制在DC上
假如你定义了一个位图类,里面包含位图头,位图信息头,调色板,位图数据.然后你按照位图的格式将位图文件读入你的类中,现在你知道了位图的全部信息了.主要信息包含在位图信息头里面,数据则在位图数据缓冲里面. ...
- FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证
本文设计思想采用明德扬至简设计法.上一篇博文中定制了自定义MAC IP的结构,在用户侧需要位宽转换及数据缓存.本文以TX方向为例,设计并验证发送缓存模块.这里定义该模块可缓存4个最大长度数据包,用户根 ...
- MyBatis异常:元素内容必须由格式正确的字符数据或标记组成
今天在写接口查询SQL时,报了一个异常,如下: Cause: org.apache.ibatis.builder.BuilderException: Error creating document i ...
- Mybatis 元素内容必须由格式正确的字符数据或标记组成
一个web应用,框架为SpringMVC Spring Mybatis ,昨天写了一下午的代码,因为逻辑较大,期间也没测,打算写完这个功能点在进行测试,谁知道写完的时候,tomcat根本启动不起来了, ...
- 正确停止线程的方式三 使用Thread类中的内置的中断标记位-----------不熟悉
package charpter10; public class Processor implements Runnable { @Override public void run() { for ( ...
随机推荐
- Java实现 LeetCode 198 打家劫舍
198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报 ...
- Java实现 蓝桥杯VIP 算法提高 排队打水问题
算法提高 排队打水问题 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个人排队到r个水龙头去打水,他们装满水桶的时间t1.t2----tn为整数且各不相等,应如何安排他们的打水顺序才能使 ...
- JVM 由哪些部分组成?
JVM 由哪些部分组成? 解析:这是对 JVM 体系结构的考察 答:JVM 的结构基本上由 4 部分组成: 类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到 JVM 中 执行引擎, ...
- Java实现第八届蓝桥杯拉马车
拉马车 题目描述 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. 其规则简述如下: 假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的 ...
- PAT甲级 Reversible Primes
描述 A reversible prime in any number system is a prime whose "reverse" in that number syste ...
- Linux: 如何分割文件,不再被 4G 大小限制了
单文件 4G 限制 FAT32 4G 限制 百度网盘超出 4G 限制 单文件分割与合并 单文件,如:archive.tar.gz 分割 split -b 3000M -d -a 1 archive.t ...
- 由软件构造引申的OOP与POP的心得体会
在大一初学C语言的时候,所解决的问题都是一些轻量级的简单问题,当时写过一个教学管理系统.这个教学管理系统的功能很简单,思想就是“流水线”:按部就班的实现所有流程.要完成整个教学管理系统,实际上就是完成 ...
- 性能调优必备利器之 JMH
if 快还是 switch 快?HashMap 的初始化 size 要不要指定,指定之后性能可以提高多少?各种序列化方法哪个耗时更短? 无论出自何种原因需要进行性能评估,量化指标总是必要的. 在大部分 ...
- qt程序添加文件版本号
1.需要一个 *.rc 文件,用以保存相关信息.比如添加一个 app.rc 里面内容如下所示: IDI_ICON1 ICON DISCARDABLE "app.ico" ----- ...
- 腾讯音乐Android工程师一面面试题记录,拿走不谢!
最近参加了一次鹅厂音乐Android工程师面试,这里凭记忆记录了一些一面的面试题,希望能帮到正在面试的你! 1.Java调用函数传入实际参数时,是值传递还是引用传递? 2.单例模式的DCL方式,为什么 ...