今天又探索了一回文件头保留块的存储结构了,
又进一步的了解了文件头保留块的存储及作用。
本次实验我分了两种情况:
1、本地管理中,如果是 uniform. size分配,那么文件头保留块如何记录?
2、本地管理中,如果是 system allocation,那么文件头保留块如何记录?
ps:本人为了命令回显 sqlplus = rlwrap sqlplus /nolog
下面附上实验过程:
实验一:uniform. size分配,那么文件头保留块如何记录?
1、创建一个uniform. size 128k 的表空间 TEST。
SYS:33@hongye > create tablespace test datafile size 5m segment space management auto uniform. size 128k;
Tablespace created.
SYS:33@hongye > select tablespace_name,allocation_type from dba_tablespaces where tablespace_name='TEST';
TABLESPACE_NAME ALLOCATIO
------------------------------ ---------
TEST UNIFORM
SYS:33@hongye > col file_name for a60
SYS:33@hongye > select file_id,file_name,tablespace_name from dba_data_files where tablespace_name='TEST';
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ------------------------------------------------------------ ------------------------------
6 /oracle/oradata/HONGYE/datafile/o1_mf_test_6vhxxnbw_.dbf TEST
2、导出相关文件的保留块,导出文件记为 file1。
HONGYE:42@hongye > alter system dump datafile 6 block min 2 block max 8;
System altered.
HONGYE:42@hongye > @get_tracefile
trace file name
----------------------------------------------------------------------------------------------------
/oracle/admin/hongye/udump\hongye_ora_2134.trc
3、退出并重新登录,以便于获得新的 dump 文件,
否则,所有的 dump 文件都写到一个文件中,不利于查看。
SYS:42@hongye > exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@DBA6U0 udump]$ sqlplus
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Apr 27 19:32:42 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
IDLE > conn hongye/hongye
Connected.
4、在表空间中创建一个对象 TEST,并插入数据,使得该对象占用一定数量的 extents。
HONGYE:42@hongye > create table test tablespace test as select * from dba_objects where rownum<1001;
Table created.
HONGYE:42@hongye > insert into test select * from test;
1000 rows created.
。。。。。。
HONGYE:42@hongye > insert into test select * from test;
16000 rows created.
HONGYE:42@hongye > commit;
Commit complete.
HONGYE:42@hongye > analyze table test compute statistics;
Table analyzed.
5、再次导出相关数据文件的文件头保留块,导出文件记为 file2。
HONGYE:42@hongye > alter system dump datafile 6 block min 2 block max 8;
System altered.
HONGYE:42@hongye > @get_tracefile
trace file name
----------------------------------------------------------------------------------------------------
/oracle/admin/hongye/udump\hongye_ora_2264.trc
6、查询 TEST 表占用的数据块情况。
HONGYE:42@hongye > select table_name,tablespace_name,blocks,empty_blocks from user_tables;
TABLE_NAME TABLESPACE_NAME BLOCKS EMPTY_BLOCKS
------------------------------ ------------------------------ ---------- ------------
DEPT HONGYE 26 0
EMP HONGYE 26 0
T HONGYE 26 0
TEST TEST 610 14
HONGYE:42@hongye > select segment_name,file_id,block_id,blocks from dba_extents where segment_name='TEST';
SEGMENT_NAME FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST 6 9 16
TEST 6 25 16
TEST 6 41 16
TEST 6 57 16
TEST 6 73 16
TEST 6 89 16
TEST 6 105 16
TEST 6 121 16
TEST 6 137 16
TEST 6 153 16
TEST 6 169 16
TEST 6 185 16
TEST 6 201 16
TEST 6 217 16
TEST 6 233 16
TEST 6 249 16
TEST 6 265 16
TEST 6 281 16
TEST 6 297 16
TEST 6 313 16
TEST 6 329 16
TEST 6 345 16
TEST 6 361 16
TEST 6 377 16
TEST 6 393 16
TEST 6 409 16
TEST 6 425 16
TEST 6 441 16
TEST 6 457 16
TEST 6 473 16
TEST 6 489 16
TEST 6 505 16
TEST 6 521 16
TEST 6 537 16
TEST 6 553 16
TEST 6 569 16
TEST 6 585 16
TEST 6 601 16
TEST 6 617 16
39 rows selected.
小结:
先贴上 file1 和 file2 两个文件相关内容:
file1: --Before for uniform. size
File Space Header Block:
Header Control:
RelFno: 6, Unit: 16, Size: 640, Flag: 1
AutoExtend: NO, Increment: 0, MaxSize: 0
Initial Area: 7, Tail: 632, First: 0, Free: 39
Deallocation scn: 0.0
......(略去一些不相干的内容)
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 9, Flag: 0, First: 0, Free: 63488
0000000000000000 0000000000000000 0000000000000000 0000000000000000
......
file2:--Alter for uniform. size
File Space Header Block:
Header Control:
RelFno: 6, Unit: 16, Size: 640, Flag: 1
AutoExtend: NO, Increment: 0, MaxSize: 0
Initial Area: 7, Tail: 632, First: 39, Free: 0
Deallocation scn: 928878.0
......(略去一些不相干的内容)
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 9, Flag: 0, First: 39, Free: 63449
......
注意到:
RelFno: 6 表示dump出来的文件的相对文件号。
Unit:16, 表示在该数据文件(其实应该是该表空间中所有的数据文件)中的分配单元为16,
也就是说,每个位图标志位所记录的内容都对应一个拥有16个Block的extent。
First: 39 占用了39个 Unit,也就是39个extent(这一点可以从第 6 步中看出来)
Free: 0 还可以分配的 Unit 数目
(这也证实了为什么在插入中会出现 ORA-01653: unable to extend table HONGYE.TEST by 16 in tablespace TEST)
Free: 63449 这是表示这个块中可用的标志位的剩余情况,并不一定会完全用的完,这取决于你创建时设置的大小。
BeginBlock: 9 表示此处记载的是从9号Block开始的extent分配情况。
重点比较:
File1:0000000000000000
File2:FFFFFFFF7F000000
发现,两者的主要区别是前几位的标志位改变了,现在将16进制的标志位转化为2进制:
FFFFFFFF7F = 1111 1111 1111 1111 1111 1111 1111 1111 0111 1111
考虑到Linux中的Endian Format,则进一步转化为:
FFFFFFFF7F = 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110
这下,清楚了,有39个1,刚好对应39个已经分配了的 extent。
而且,这39个 extent 是连续的,从dump文件和第6步的查询中,都可以反映出这一点。
又进一步的了解了文件头保留块的存储及作用。
本次实验我分了两种情况:
1、本地管理中,如果是 uniform. size分配,那么文件头保留块如何记录?
2、本地管理中,如果是 system allocation,那么文件头保留块如何记录?
ps:本人为了命令回显 sqlplus = rlwrap sqlplus /nolog
下面附上实验过程:
实验一:uniform. size分配,那么文件头保留块如何记录?
1、创建一个uniform. size 128k 的表空间 TEST。
SYS:33@hongye > create tablespace test datafile size 5m segment space management auto uniform. size 128k;
Tablespace created.
SYS:33@hongye > select tablespace_name,allocation_type from dba_tablespaces where tablespace_name='TEST';
TABLESPACE_NAME ALLOCATIO
------------------------------ ---------
TEST UNIFORM
SYS:33@hongye > col file_name for a60
SYS:33@hongye > select file_id,file_name,tablespace_name from dba_data_files where tablespace_name='TEST';
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ------------------------------------------------------------ ------------------------------
6 /oracle/oradata/HONGYE/datafile/o1_mf_test_6vhxxnbw_.dbf TEST
2、导出相关文件的保留块,导出文件记为 file1。
HONGYE:42@hongye > alter system dump datafile 6 block min 2 block max 8;
System altered.
HONGYE:42@hongye > @get_tracefile
trace file name
----------------------------------------------------------------------------------------------------
/oracle/admin/hongye/udump\hongye_ora_2134.trc
3、退出并重新登录,以便于获得新的 dump 文件,
否则,所有的 dump 文件都写到一个文件中,不利于查看。
SYS:42@hongye > exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@DBA6U0 udump]$ sqlplus
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Apr 27 19:32:42 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
IDLE > conn hongye/hongye
Connected.
4、在表空间中创建一个对象 TEST,并插入数据,使得该对象占用一定数量的 extents。
HONGYE:42@hongye > create table test tablespace test as select * from dba_objects where rownum<1001;
Table created.
HONGYE:42@hongye > insert into test select * from test;
1000 rows created.
。。。。。。
HONGYE:42@hongye > insert into test select * from test;
16000 rows created.
HONGYE:42@hongye > commit;
Commit complete.
HONGYE:42@hongye > analyze table test compute statistics;
Table analyzed.
5、再次导出相关数据文件的文件头保留块,导出文件记为 file2。
HONGYE:42@hongye > alter system dump datafile 6 block min 2 block max 8;
System altered.
HONGYE:42@hongye > @get_tracefile
trace file name
----------------------------------------------------------------------------------------------------
/oracle/admin/hongye/udump\hongye_ora_2264.trc
6、查询 TEST 表占用的数据块情况。
HONGYE:42@hongye > select table_name,tablespace_name,blocks,empty_blocks from user_tables;
TABLE_NAME TABLESPACE_NAME BLOCKS EMPTY_BLOCKS
------------------------------ ------------------------------ ---------- ------------
DEPT HONGYE 26 0
EMP HONGYE 26 0
T HONGYE 26 0
TEST TEST 610 14
HONGYE:42@hongye > select segment_name,file_id,block_id,blocks from dba_extents where segment_name='TEST';
SEGMENT_NAME FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST 6 9 16
TEST 6 25 16
TEST 6 41 16
TEST 6 57 16
TEST 6 73 16
TEST 6 89 16
TEST 6 105 16
TEST 6 121 16
TEST 6 137 16
TEST 6 153 16
TEST 6 169 16
TEST 6 185 16
TEST 6 201 16
TEST 6 217 16
TEST 6 233 16
TEST 6 249 16
TEST 6 265 16
TEST 6 281 16
TEST 6 297 16
TEST 6 313 16
TEST 6 329 16
TEST 6 345 16
TEST 6 361 16
TEST 6 377 16
TEST 6 393 16
TEST 6 409 16
TEST 6 425 16
TEST 6 441 16
TEST 6 457 16
TEST 6 473 16
TEST 6 489 16
TEST 6 505 16
TEST 6 521 16
TEST 6 537 16
TEST 6 553 16
TEST 6 569 16
TEST 6 585 16
TEST 6 601 16
TEST 6 617 16
39 rows selected.
小结:
先贴上 file1 和 file2 两个文件相关内容:
file1: --Before for uniform. size
File Space Header Block:
Header Control:
RelFno: 6, Unit: 16, Size: 640, Flag: 1
AutoExtend: NO, Increment: 0, MaxSize: 0
Initial Area: 7, Tail: 632, First: 0, Free: 39
Deallocation scn: 0.0
......(略去一些不相干的内容)
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 9, Flag: 0, First: 0, Free: 63488
0000000000000000 0000000000000000 0000000000000000 0000000000000000
......
file2:--Alter for uniform. size
File Space Header Block:
Header Control:
RelFno: 6, Unit: 16, Size: 640, Flag: 1
AutoExtend: NO, Increment: 0, MaxSize: 0
Initial Area: 7, Tail: 632, First: 39, Free: 0
Deallocation scn: 928878.0
......(略去一些不相干的内容)
File Space Bitmap Block:
BitMap Control:
RelFno: 6, BeginBlock: 9, Flag: 0, First: 39, Free: 63449
......
注意到:
RelFno: 6 表示dump出来的文件的相对文件号。
Unit:16, 表示在该数据文件(其实应该是该表空间中所有的数据文件)中的分配单元为16,
也就是说,每个位图标志位所记录的内容都对应一个拥有16个Block的extent。
First: 39 占用了39个 Unit,也就是39个extent(这一点可以从第 6 步中看出来)
Free: 0 还可以分配的 Unit 数目
(这也证实了为什么在插入中会出现 ORA-01653: unable to extend table HONGYE.TEST by 16 in tablespace TEST)
Free: 63449 这是表示这个块中可用的标志位的剩余情况,并不一定会完全用的完,这取决于你创建时设置的大小。
BeginBlock: 9 表示此处记载的是从9号Block开始的extent分配情况。
重点比较:
File1:0000000000000000
File2:FFFFFFFF7F000000
发现,两者的主要区别是前几位的标志位改变了,现在将16进制的标志位转化为2进制:
FFFFFFFF7F = 1111 1111 1111 1111 1111 1111 1111 1111 0111 1111
考虑到Linux中的Endian Format,则进一步转化为:
FFFFFFFF7F = 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110
这下,清楚了,有39个1,刚好对应39个已经分配了的 extent。
而且,这39个 extent 是连续的,从dump文件和第6步的查询中,都可以反映出这一点。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24465008/viewspace-693920/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24465008/viewspace-693920/