关于Freelists和Freelist Groups的研究(修订版)- freelists存储在哪儿
发布时间:2018-08-23 11:44:43 所属栏目:电商 来源:站长网
导读:三. freelists存储在哪儿freelists存储在每个segment的header block中,我们可以通过dump来获得更清晰的熟悉。dump在研究oracle的内部机制时凡是都饰演着很重要的脚色。假设我们建设一个表空间TS_TEST,此表空间长短自动段空间打点的,然后在该表空间中创
三. freelists存储在哪儿freelists存储在每个segment的header block中,我们可以通过dump来获得更清晰的熟悉。dump在研究oracle的内部机制时凡是都饰演着很重要的脚色。假设我们建设一个表空间TS_TEST,此表空间长短自动段空间打点的,然后在该表空间中建设T_MANUAL,T_MANUAL_FREE2,T_MANUAL_FREEGROUP2三张表。这三张表的freelists和freelist groups配置如下。 SQL> select SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from USER_SEGMENTS where TABLESPACE_NAME='TS_TEST'; SEGMENT_NAME SEGMENT_TYPE FREELISTS FREELIST_GROUPS-------------------- ------------------ ---------- ---------------T_MANUAL TABLE 1 1T_MANUAL_FREE2 TABLE 2 1T_MANUAL_FREEGROUP2 TABLE 4 2 则可以参照下面的要领对segment header block举办dump操纵。起首先从数据字典中获得存储这个segment的文件号和此segment的第一个block号(也就是segment header block) SQL> select FILE_ID,BLOCK_ID from dba_extents where segment_name='T_MANUAL'; FILE_ID BLOCK_ID---------- ---------- 7 9 行使dump呼吁转储这个block的内容,转储的功效将生涯在初始化参数user_dump_dest指定的目次中。 SQL> alter system dump datafile 7 block 9; System altered 查察user_dump_dest目次中的响应trace文件,我们可以看到包括如下几行:frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER – UNLIMITED暗示这个block正是segment header block。#blocks in seg. hdr's freelists: 2 #blocks below: 2暗示位于freelist中的数据块有2个,在高水位符号(HWM)下的数据块也有2个。SEG LST:: flg: USED lhd: 0x01c0000a ltl: 0x01c0000b因为我们dump的是TS_MANUAL表的header block,而这张表的freelists=1,以是在dump文件中看到只有一个seg lst,这个freelist被称为segment free list可能master free list,每个segment都至少有一个并且只有一个master free list(虽然是在非自动段空间打点范例下)。flg(flag)暗示该freelist是否被行使lhd(list header)暗示位于该list中的第一个可用block的dba(Data block address)ltl(list tail)暗示位于该list中的最后一个可用block的dba,这个block一定位于HWM之下。此时我们可以发明freelists只是记录了这个segment中空闲块的第一个块地点和最后一个块地点,在第一个空闲块的块头处(block header)记录了它之后的下一个空闲块的地点,而下一个空闲块又记录了再下一个空闲块的地点,由此依次记录,一向到最后一个空闲块。Oracle通过这种链表的方法实现了freelists对付空闲块的打点。 留意T媚课当一个block被插手到free list中时,该block会被安排在free list的链表头部。 同样我们可以dump第一个空闲块来验证上面的链表说法。好比在lhd部门记录的dba是0x01c0000a,这是一个16进制的数,起首转化为10进制,于是获得29360138。然后通过oracle提供的两个函数将块地点转化为可以供我们行使的文件号和块号,以便于我们举办dump操纵。 SQL> select dbms_utility.data_block_address_file(29360138) from dual; DBMS_UTILITY.DATA_BLOCK_ADDRES------------------------------ 7 SQL> select dbms_utility.data_block_address_block(29360138) from dual; DBMS_UTILITY.DATA_BLOCK_ADDRES------------------------------ 10 此刻我们已经获得第一个空闲块是7号文件的10号块。用前面提到的转储呼吁dump这个块的内容,我们可以找到下面的内容:fnx: 0x1c0000b暗示下一个可用的块地点是0x1c0000b,在我们的例子这个块正好是可用的最后一个块(segment header block中的lhd部门),我们可以再次dump这个0x1c0000b块,同样查察转储的功效,找到下面的内容:fnx: 0x00x0暗示下面没有可用的空闲块了,也就是表白这是freelists中的最后一个空闲块。 留意:你们的测试也许获得跟我纷歧样的转储内容,这是正常的。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |