对Oracle 10g ASSM管理方式的理解 II

为了进一步了解ASSM管理方式, 可以通过dump segment header 来观察segment中block的管理情况和其他的一些相关信息. 为了理理自己的思路, 做了如下实验:

步骤1. 创建测试表( Block size 是 8192 ),

SQL> create table t4( id char(1000),
2 name char(2000));

每个block能放两行数据.

步骤2. SQL> select extent_id, block_id, blocks from dba_extents
2 where owner='HARRY' and segment_name='T4';

EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 481 8

我们可以看到现在给这个表分配了一个extent, 这个extent由8个blocks组成. 第一个block是481这个块.

步骤3. SQL> select SEGMENT_NAME, HEADER_FILE, HEADER_BLOCK
2 from dba_segments
3 where owner='HARRY' and segment_name='T4'
4 /

SEGMENT_NAME HEADER_FILE HEADER_BLOCK
--------------------------------------------------------------------------------- ----------- ------------
T4 5 483

从这里我们可以看到这个segment的表头是在第5个数据文件上的第483的个block上. Dump这个数据块看看里面存的信息.
注: dump 文件存放的路径由 user_dump_dest这个参数决定.

[@more@]

SQL> show parameter user_dump

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string /opt/app/oracle/admin/harry/ud
ump


步骤4. SQL> alter system dump datafile 5 block 483;

System altered.

截取部分dump信息如下.

Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 8
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x014001e4 ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x014001e4 ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Level 1 BMB for High HWM block: 0x014001e1
Level 1 BMB for Low HWM block: 0x014001e1
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x014001e2
Last Level 1 BMB: 0x014001e1
Last Level II BMB: 0x014001e2
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 1 obj#: 15256 flag: 0x10000000
Inc # 0
Extent Map
-----------------------------------------------------------------
0x014001e1 length: 8

Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x014001e1 Data dba: 0x014001e4
--------------------------------------------------------

Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x014001e2

End dump data blocks tsn: 5 file#: 5 minblk 483 maxblk 48

3级位图管理就可以从这个dump的信息中体现出来. Dump信息中很多都是以16进制表示, 可以转换成10进制来查看.
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x014001e2
Last Level 1 BMB: 0x014001e1
Last Level II BMB: 0x014001e2
Last Level III BMB: 0x00000000

L2 Hint for inserts: 0x014001e2 指明insert操作需要找到的2级位图. 转换为10进制后可以知道是482这个块, 去dump 482这个块.

步骤5: SQL> alter system dump datafile 5 block 482;

System altered.

截取部分dump 信息

Dump of Second Level Bitmap Block
number: 1 nfree: 1 ffree: 0 pdba: 0x014001e3
Inc #: 0 Objd: 15256
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x014001e1 Free: 5 Inst: 1

--------------------------------------------------------
End dump data blocks tsn: 5 file#: 5 minblk 482 maxblk 482

我们可以看到1级位图的信息是在0x014001e1上的,也就是481这个块. 那再去dump 481这个块来看看.

步骤6: SQL> alter system dump datafile 5 block 481;

截取部分dump 信息

HWM Flag: HWM Set
Highwater:: 0x014001e4 ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x014001e1 Length: 8 Offset: 0

0:Metadata 1:Metadata 2:Metadata 3:unformatted
4:unformatted 5:unformatted 6:unformatted 7:unformatted
--------------------------------------------------------
End dump data blocks tsn: 5 file#: 5 minblk 481 maxblk 481

从这些信息中我们可以看到 Highwater mark的地址, 其实在第一次的dump的块中就有这个信息( 在ASSM管理中, 有Low HighWater Mark和 high HighWater Mark ). 再看DBA Ranges那一段, 可以读到的信息是这个位图现在管理8个块, 第一个块是从481开始, 前面3个块是存Metadata的, 就是存些管理信息. 后面那些块( 从484到488 ) 为可用数据块, 是unformatted的状态, 那是因为现在只是创建了表, 还没有插入数据. 更准确的说是现在的HighWater Mark是在0x014001e4 ( 484 ) .


步骤7: 插入一些数据, 再dump 481块来看看.

SQL> insert into t4
2 select '111','harry1' from dual;

1 row created.

SQL> insert into t4
2 select '222','harry2' from dual;

1 row created.

SQL> commit;

SQL> alter system dump datafile 5 block 481;


截取部分dump文件中的信息

HWM Flag: HWM Set
Highwater:: 0x014001e9 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x014001e1 Length: 8 Offset: 0

0:Metadata 1:Metadata 2:Metadata 3:75-100% free
4:75-100% free 5:25-50% free 6:75-100% free 7:75-100% free
--------------------------------------------------------
End dump data blocks tsn: 5 file#: 5 minblk 481 maxblk 481

可以看到现在的High Highwater Mark是 0x014001e9, 那就说明489以前的块都是在Highwater Mark下方, 全表扫描时都会扫到它们. 并且可以看到这些块空间使用的情况. 同时, 可以注意到序列为5的块( 486 )状态为25-50%, 也就是说刚才的数据插入到了这个块里. 在此也可以证明ASSM下, 数据块的使用不是按照顺序依次写入的, 是按一种随机的方式. 有一种说法就是按照用户进程的PID进行hash算法从而去找合适的空闲块写入数据. 这也是为什么会有low Highwater Makr和high HighWater Mark. 简单说说对这两个Mark的理解.
比如说, 现在表中没有空闲空间, oracle分配新的extent给这个表, 那么highwater mark就会向前移动到新分配的extent中的某一个block上, 成为high HighWater Mark. 而在没有移动之前的那个HighWater Mark就便为Low HighWater Mark. 那么在Low Highwater Mark下面的都是使用过的块. 因为oracle使用空闲块不是按顺序找的, 那么在Low HighWater Mark和High Highwater Mark之间, 就有可能存在这样的情况, 顺序为1的块还没有被format, 但顺序为5的块已经被使用了. 我们知道Full table scan会对highwater mark以下的块进行扫描, 那low highwater Mark下的块都是已经用过了的块, 那oracle就直接读取了. 但, 对读Low highwater mark和high highwater mark 之间的数据块会多一步check, 验证数据块是否可以被有效读取.

困了....  下次在看看插入多一些数据后的情况.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7319061/viewspace-1028526/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7319061/viewspace-1028526/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值