ORACLE表空间管理
第一章 ORACLE 区管理
ORACLE区管理有两种方式:本地管理和字典管理。
字典管理:通过数据字典管理表空间的空间使用。
本地管理:本地管理不再利用数据字典来记录表空间里面区的使用情况,而是在每个表空间的数据文件的头部加入一个位图区,在其中记录每个区的使用情况。每当一个区被使用,或者被释放以供重新使用的时候,ORACLE都会更新数据文件头的这个记录。反映这个变化。
1.1 本地管理的优点
本地管理的表空间避免了递归的空间管理操作。而这种情况在数据字典管理的表空间中经常出现,当表空间的区的使用情况发生变化时,数据字典的表的信息发生改变,从而同时也使用了在系统表空间里的回滚段。
本地管理的表空间避免了在数据字典相应表里面写入空闲空间,已使用空间的信息,从而较少了数据字典表的竞争,提供了空间管理的并发性。
区的本地管理自动跟踪表空间里的空闲块,较少了手工合并自动空间的需要。
表空间里的区大小可以由ORACLE系统来决定,或者由数据库管理员指定一个统一的大小,避免了字典表空间一直头疼的碎片问题。
从由数据字典来管理空闲块改为由数据文件的头部记录来管理空闲块,这样避免产生回滚信息,不在使用系统表空间的回滚段。因为有数据字典来管理的话,他会把相关的信息记录在数据字典的表里,从而产生回滚信息。
1.2 本地管理表空间管理机制
表空间是一种为段(表、索引等)提供空间的逻辑结构,所以在表空间中增加,删除段的时候,数据库就必须跟踪这些空间的使用。以下面的例子为例:
假如一个新创建的表空间包含了五个表
表1……表2……表3……表4……表5……未用空间
当我们删除表4的时候,就有如下结果
表1……表2……表3……空闲空间段……表5……未用空间
很显然,ORACLE需要一个机制来管理表空间中各数据文件的这些分配或未分配的空间,为了跟踪这些可以使用的空间(包括未分配使用的和可以重复使用的),对于每一个空间,我们必须知道:
q 这个可用空间位于哪个数据文件
q 这个空间的尺寸有多大
q 如果它在用了,是哪个段占用了这个空间
直到8i之前,所有的表空间都是采用字典管理模式,为了确保能保存以上的信息,ORACLE使用了两个数据字典:UET$(已使用的区间)或FET$(空闲空间)。
SQL> desc UET$
Name Null? Type
----------------------- -------- ----------------
SEGFILE# NOT NULL NUMBER
SEGBLOCK# NOT NULL NUMBER
EXT# NOT NULL NUMBER
TS# NOT NULL NUMBER
FILE# NOT NULL NUMBER
BLOCK# NOT NULL NUMBER
LENGTH NOT NULL NUMBER
SQL> desc FET$
Name Null? Type
----------------------- -------- ----------------
TS# NOT NULL NUMBER
FILE# NOT NULL NUMBER
BLOCK# NOT NULL NUMBER
LENGTH NOT NULL NUMBER
查询该表可以看到,每个使用空间或者空闲空间都在该表中对应一行。它的工作方式是当一个段被删除的时候,ORACLE就移动UET$中相应的行到FET$,这个过程的发生时连续的,而且可能发生等待。当并发性很高的时候,数据字典的争用就来了。另外有一个问题就是,当表的空间很不连续或者表空间里有大量的碎片引起这两个表的增大,那么也会引起数据库性能的下降。
本地表空间管理正是为了解决这一问题来的,在表空间的管理上,ORACLE将存储信息保存在表空间的头部的位图中,而不是保存在数据字典中。通过这样的方式,再分配回收空间的时候,表空间就可以独立的完成操作而不用与其他对象关系。
由于11G的所有表空间默认都是通过本地管理区的。所以FET$表和UET$表的记录为空。
SQL> SELECT TABLESPACE_NAME,EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT FROM dba_tablespaces;
TABLESPACE_NAME EXTENT_MANAGEMENT SEGMENT_SPACE_MANA
--------------- ------------------------------ ------------------
SYSTEM LOCAL MANUAL
SYSAUX LOCAL AUTO
UNDOTBS1 LOCAL MANUAL
TEMP LOCAL MANUAL
USERS LOCAL AUTO
EXAMPLE LOCAL AUTO
TEST LOCAL AUTO
VPX LOCAL AUTO
T2 LOCAL AUTO
TEMP2 LOCAL MANUAL
BIGTS LOCAL AUTO
UNDO2 LOCAL MANUAL
12 rows selected.
SQL> select * from UET$;
no rows selected
SQL> select * from FET$;
no rows selected
1.3 本地管理表空间实例
通过创建一个表,然后不断INSERT 数据,查看区的分配情况
SQL> CREATE TABLE AUTO_EXTENT AS SELECT * FROM USER_TABLES WHERE 1=2;
Table created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM USER_TABLES;
964 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM AUTO_EXTENT;
964 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
AUTO_EXTENT 5 1 268472 65536 8
AUTO_EXTENT 6 1 268480 65536 8
AUTO_EXTENT 7 1 268488 65536 8
AUTO_EXTENT 8 1 268496 65536 8
9 rows selected.
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM AUTO_EXTENT;
1928 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
AUTO_EXTENT 5 1 268472 65536 8
AUTO_EXTENT 6 1 268480 65536 8
AUTO_EXTENT 7 1 268488 65536 8
AUTO_EXTENT 8 1 268496 65536 8
AUTO_EXTENT 9 1 268504 65536 8
AUTO_EXTENT 10 1 268512 65536 8
AUTO_EXTENT 11 1 268520 65536 8
AUTO_EXTENT 12 1 268528 65536 8
AUTO_EXTENT 13 1 268536 65536 8
AUTO_EXTENT 14 1 268544 65536 8
AUTO_EXTENT 15 1 268552 65536 8
AUTO_EXTENT 16 1 268672 1048576 128
17 rows selected.
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM AUTO_EXTENT;
3856 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
AUTO_EXTENT 5 1 268472 65536 8
AUTO_EXTENT 6 1 268480 65536 8
AUTO_EXTENT 7 1 268488 65536 8
AUTO_EXTENT 8 1 268496 65536 8
AUTO_EXTENT 9 1 268504 65536 8
AUTO_EXTENT 10 1 268512 65536 8
AUTO_EXTENT 11 1 268520 65536 8
AUTO_EXTENT 12 1 268528 65536 8
AUTO_EXTENT 13 1 268536 65536 8
AUTO_EXTENT 14 1 268544 65536 8
AUTO_EXTENT 15 1 268552 65536 8
AUTO_EXTENT 16 1 268672 1048576 128
AUTO_EXTENT 17 1 268800 1048576 128
18 rows selected.
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM AUTO_EXTENT;
7712 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
AUTO_EXTENT 5 1 268472 65536 8
AUTO_EXTENT 6 1 268480 65536 8
AUTO_EXTENT 7 1 268488 65536 8
AUTO_EXTENT 8 1 268496 65536 8
AUTO_EXTENT 9 1 268504 65536 8
AUTO_EXTENT 10 1 268512 65536 8
AUTO_EXTENT 11 1 268520 65536 8
AUTO_EXTENT 12 1 268528 65536 8
AUTO_EXTENT 13 1 268536 65536 8
AUTO_EXTENT 14 1 268544 65536 8
AUTO_EXTENT 15 1 268552 65536 8
AUTO_EXTENT 16 1 268672 1048576 128
AUTO_EXTENT 17 1 268800 1048576 128
AUTO_EXTENT 18 1 268928 1048576 128
AUTO_EXTENT 19 1 269056 1048576 128
20 rows selected.
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM AUTO_EXTENT;
15424 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
AUTO_EXTENT 5 1 268472 65536 8
AUTO_EXTENT 6 1 268480 65536 8
AUTO_EXTENT 7 1 268488 65536 8
AUTO_EXTENT 8 1 268496 65536 8
AUTO_EXTENT 9 1 268504 65536 8
AUTO_EXTENT 10 1 268512 65536 8
AUTO_EXTENT 11 1 268520 65536 8
AUTO_EXTENT 12 1 268528 65536 8
AUTO_EXTENT 13 1 268536 65536 8
AUTO_EXTENT 14 1 268544 65536 8
AUTO_EXTENT 15 1 268552 65536 8
AUTO_EXTENT 16 1 268672 1048576 128
AUTO_EXTENT 17 1 268800 1048576 128
AUTO_EXTENT 18 1 268928 1048576 128
AUTO_EXTENT 19 1 269056 1048576 128
AUTO_EXTENT 20 1 269184 1048576 128
AUTO_EXTENT 21 1 269312 1048576 128
AUTO_EXTENT 22 1 269440 1048576 128
AUTO_EXTENT 23 1 269568 1048576 128
24 rows selected.
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM AUTO_EXTENT;
30848 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
AUTO_EXTENT 5 1 268472 65536 8
AUTO_EXTENT 6 1 268480 65536 8
AUTO_EXTENT 7 1 268488 65536 8
AUTO_EXTENT 8 1 268496 65536 8
AUTO_EXTENT 9 1 268504 65536 8
AUTO_EXTENT 10 1 268512 65536 8
AUTO_EXTENT 11 1 268520 65536 8
AUTO_EXTENT 12 1 268528 65536 8
AUTO_EXTENT 13 1 268536 65536 8
AUTO_EXTENT 14 1 268544 65536 8
AUTO_EXTENT 15 1 268552 65536 8
AUTO_EXTENT 16 1 268672 1048576 128
AUTO_EXTENT 17 1 268800 1048576 128
AUTO_EXTENT 18 1 268928 1048576 128
AUTO_EXTENT 19 1 269056 1048576 128
AUTO_EXTENT 20 1 269184 1048576 128
AUTO_EXTENT 21 1 269312 1048576 128
AUTO_EXTENT 22 1 269440 1048576 128
AUTO_EXTENT 23 1 269568 1048576 128
AUTO_EXTENT 24 1 269696 1048576 128
AUTO_EXTENT 25 1 269824 1048576 128
AUTO_EXTENT 26 1 269952 1048576 128
AUTO_EXTENT 27 1 270080 1048576 128
AUTO_EXTENT 28 1 270208 1048576 128
AUTO_EXTENT 29 1 270336 1048576 128
AUTO_EXTENT 30 1 270464 1048576 128
AUTO_EXTENT 31 1 270592 1048576 128
32 rows selected.
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM AUTO_EXTENT;
61696 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
AUTO_EXTENT 5 1 268472 65536 8
AUTO_EXTENT 6 1 268480 65536 8
AUTO_EXTENT 7 1 268488 65536 8
AUTO_EXTENT 8 1 268496 65536 8
AUTO_EXTENT 9 1 268504 65536 8
AUTO_EXTENT 10 1 268512 65536 8
AUTO_EXTENT 11 1 268520 65536 8
AUTO_EXTENT 12 1 268528 65536 8
AUTO_EXTENT 13 1 268536 65536 8
AUTO_EXTENT 14 1 268544 65536 8
AUTO_EXTENT 15 1 268552 65536 8
AUTO_EXTENT 16 1 268672 1048576 128
AUTO_EXTENT 17 1 268800 1048576 128
AUTO_EXTENT 18 1 268928 1048576 128
AUTO_EXTENT 19 1 269056 1048576 128
AUTO_EXTENT 20 1 269184 1048576 128
AUTO_EXTENT 21 1 269312 1048576 128
AUTO_EXTENT 22 1 269440 1048576 128
AUTO_EXTENT 23 1 269568 1048576 128
AUTO_EXTENT 24 1 269696 1048576 128
AUTO_EXTENT 25 1 269824 1048576 128
AUTO_EXTENT 26 1 269952 1048576 128
AUTO_EXTENT 27 1 270080 1048576 128
AUTO_EXTENT 28 1 270208 1048576 128
AUTO_EXTENT 29 1 270336 1048576 128
AUTO_EXTENT 30 1 270464 1048576 128
AUTO_EXTENT 31 1 270592 1048576 128
AUTO_EXTENT 32 1 270720 1048576 128
AUTO_EXTENT 33 1 270848 1048576 128
AUTO_EXTENT 34 1 270976 1048576 128
AUTO_EXTENT 35 1 271104 1048576 128
AUTO_EXTENT 36 1 271232 1048576 128
AUTO_EXTENT 37 1 271360 1048576 128
AUTO_EXTENT 38 1 271488 1048576 128
AUTO_EXTENT 39 1 271616 1048576 128
AUTO_EXTENT 40 1 271744 1048576 128
AUTO_EXTENT 41 1 271872 1048576 128
AUTO_EXTENT 42 1 272000 1048576 128
AUTO_EXTENT 43 1 272128 1048576 128
AUTO_EXTENT 44 1 272256 1048576 128
AUTO_EXTENT 45 1 272384 1048576 128
AUTO_EXTENT 46 1 272512 1048576 128
AUTO_EXTENT 47 1 272640 1048576 128
AUTO_EXTENT 48 1 272768 1048576 128
49 rows selected.
SQL> INSERT INTO AUTO_EXTENT SELECT * FROM AUTO_EXTENT;
123392 rows created.
SQL> SELECT SEGMENT_NAME ,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='AUTO_EXTENT';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
--------------- --------- ------- ---------- ---------- ----------
AUTO_EXTENT 0 1 268432 65536 8
AUTO_EXTENT 1 1 268440 65536 8
AUTO_EXTENT 2 1 268448 65536 8
AUTO_EXTENT 3 1 268456 65536 8
AUTO_EXTENT 4 1 268464 65536 8
AUTO_EXTENT 5 1 268472 65536 8
AUTO_EXTENT 6 1 268480 65536 8
AUTO_EXTENT 7 1 268488 65536 8
AUTO_EXTENT 8 1 268496 65536 8
AUTO_EXTENT 9 1 268504 65536 8
AUTO_EXTENT 10 1 268512 65536 8
AUTO_EXTENT 11 1 268520 65536 8
AUTO_EXTENT 12 1 268528 65536 8
AUTO_EXTENT 13 1 268536 65536 8
AUTO_EXTENT 14 1 268544 65536 8
AUTO_EXTENT 15 1 268552 65536 8
AUTO_EXTENT 16 1 268672 1048576 128
AUTO_EXTENT 17 1 268800 1048576 128
AUTO_EXTENT 18 1 268928 1048576 128
AUTO_EXTENT 19 1 269056 1048576 128
AUTO_EXTENT 20 1 269184 1048576 128
AUTO_EXTENT 21 1 269312 1048576 128
AUTO_EXTENT 22 1 269440 1048576 128
AUTO_EXTENT 23 1 269568 1048576 128
AUTO_EXTENT 24 1 269696 1048576 128
AUTO_EXTENT 25 1 269824 1048576 128
AUTO_EXTENT 26 1 269952 1048576 128
AUTO_EXTENT 27 1 270080 1048576 128
AUTO_EXTENT 28 1 270208 1048576 128
AUTO_EXTENT 29 1 270336 1048576 128
AUTO_EXTENT 30 1 270464 1048576 128
AUTO_EXTENT 31 1 270592 1048576 128
AUTO_EXTENT 32 1 270720 1048576 128
AUTO_EXTENT 33 1 270848 1048576 128
AUTO_EXTENT 34 1 270976 1048576 128
AUTO_EXTENT 35 1 271104 1048576 128
AUTO_EXTENT 36 1 271232 1048576 128
AUTO_EXTENT 37 1 271360 1048576 128
AUTO_EXTENT 38 1 271488 1048576 128
AUTO_EXTENT 39 1 271616 1048576 128
AUTO_EXTENT 40 1 271744 1048576 128
AUTO_EXTENT 41 1 271872 1048576 128
AUTO_EXTENT 42 1 272000 1048576 128
AUTO_EXTENT 43 1 272128 1048576 128
AUTO_EXTENT 44 1 272256 1048576 128
AUTO_EXTENT 45 1 272384 1048576 128
AUTO_EXTENT 46 1 272512 1048576 128
AUTO_EXTENT 47 1 272640 1048576 128
AUTO_EXTENT 48 1 272768 1048576 128
AUTO_EXTENT 49 1 272896 1048576 128
AUTO_EXTENT 50 1 273024 1048576 128
AUTO_EXTENT 51 1 273152 1048576 128
AUTO_EXTENT 52 1 273280 1048576 128
AUTO_EXTENT 53 1 273408 1048576 128
AUTO_EXTENT 54 1 273536 1048576 128
AUTO_EXTENT 55 1 273664 1048576 128
AUTO_EXTENT 56 1 273792 1048576 128
AUTO_EXTENT 57 1 273920 1048576 128
AUTO_EXTENT 58 1 274048 1048576 128
AUTO_EXTENT 59 1 274176 1048576 128
AUTO_EXTENT 60 1 274304 1048576 128
AUTO_EXTENT 61 1 274432 1048576 128
AUTO_EXTENT 62 1 274560 1048576 128
AUTO_EXTENT 63 1 274688 1048576 128
AUTO_EXTENT 64 1 274816 1048576 128
AUTO_EXTENT 65 1 274944 1048576 128
AUTO_EXTENT 66 1 275072 1048576 128
AUTO_EXTENT 67 1 275200 1048576 128
AUTO_EXTENT 68 1 275328 1048576 128
AUTO_EXTENT 69 1 275456 1048576 128
AUTO_EXTENT 70 1 275584 1048576 128
AUTO_EXTENT 71 1 275712 1048576 128
AUTO_EXTENT 72 1 275840 1048576 128
AUTO_EXTENT 73 1 275968 1048576 128
AUTO_EXTENT 74 1 276096 1048576 128
AUTO_EXTENT 75 1 276224 1048576 128
AUTO_EXTENT 76 1 276352 1048576 128
AUTO_EXTENT 77 1 276480 1048576 128
AUTO_EXTENT 78 1 276608 1048576 128
AUTO_EXTENT 79 1 276736 8388608 1024
80 rows selected.
SQL>
从结果上看,当自动分配的时候,第一个区分配了8个块,当数据增加的时候,当分配到1M空间的时候,我们还要求分配新的空间,数据库认为这个表很大,所以就一次性分了128个数据块。如果我们再增加表的大小,数据库会分配多个1M,以后就8M为大小分配,再以后就64M大小分配。总之是一个原则,数据越大,未来分配的区就越大。
第二章 ORACLE段空间管理
在ORACLE 9i以前,表的剩余空间的管理和分配时由链接列表FREELIST来完成的。由于FREELIST存在串行的问题,因而容易引起段头的争用。
自动段空间管理(ASSM)使用了位图取代链接列表FREELIST,它是一个二进制的数组,能否迅速有效地管理存储扩展和剩余区块(freeblock)。
2.1 手工段空间管理(MSSM)
在手工段管理模式下,主要有两个参数来对空闲的块进行管理,分别是PCTFREE和PCTUSED。
如果是ASSM的话,则是只有PCTFREE,PCTUSED不再生效。
PCTUSED:代表ORACLE试图为每个数据块维持的已用空间最低百分比,如果一个块的已用空间低于PCTUSED,则将该数据库放回到空闲列表中。当高于PCTFREE水位后,再次掉到PCTFREE水位下的时候,并不立即设置为FREE。而必须是掉到PCTUSED水位以下才可以变为FREE。以下图为例
q 在FREE状态下开始插入数据,状态为FREE
q 当插入到80%的时候,进入PCTFREE=20的部分,这时候该快在FREELIST里被删除,不允许INSERT
q 当发生DELETE或者UPDATE变小,那么掉到PCTFREE和PCTUSED的中间,FREELIST里仍然没有这个快,插入仍然被屏蔽
q 当继续发生DELETE或者UPDATE表笑,掉到PCTUSED以下,FREELIST从新记录该块
2.2 自动段管理(ASSM)
自动段使用数据库内位图来管理块的空闲状态,分别用一级位图,二机位图,三级位图来处理。
相比于MSSM,ASSM具有以下优势
q 更容易管理,不需要认为控制PCTFREE和PCTUSED,FREELIST
q 空间使用更有效果
q 并发插入性能更加有效
实验
1. 创建一个本地管理的表空间,采用段自动管理方式
SQL> CREATE TABLESPACE DEMO DATAFILE '/u01/app/oracle/oradata/demo01.dbf' SIZE 50M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
Tablespace created.
2. 创建一个表,分析表的结构
SQL> CREATE TABLE demotab(x number) tablespace demo STORAGE(INITIAL 1000K);
Table created.
SQL> select TABLE_NAME,INITIAL_EXTENT,NEXT_EXTENT,PCT_FREE,PCT_USED FROM user_tables WHERE TABLE_NAME='DEMOTAB';
TABLE_NAME INITIAL_EXTENT NEXT_EXTENT PCT_FREE PCT_USED
------------------------------ -------------- ----------- ---------- ----------
DEMOTAB 1024000 1048576 10
SQL>
SQL> exec show_space('demotab','auto','T','Y');
Total Blocks............................128
Total Bytes.............................1048576
Unused Blocks...........................125
Unused Bytes............................1024000
Last Used Ext FileId....................12
Last Used Ext BlockId...................128
Last Used Block.........................3
*************************************************
The segment is analyzed
0% -- 25% free space blocks.............0
0% -- 25% free space bytes..............0
25% -- 50% free space blocks............0
25% -- 50% free space bytes.............0
50% -- 75% free space blocks............0
50% -- 75% free space bytes.............0
75% -- 100% free space blocks...........0
75% -- 100% free space bytes............0
Unused Blocks...........................0
Unused Bytes............................0
Total Blocks............................0
Total bytes.............................0
PL/SQL procedure successfully completed.
SQL>
从这里可以看出,表头占了3个块的大小。
SQL> SELECT SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS,BYTES FROM Dba_extents t WHERE t.segment_name = 'DEMOTAB';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS BYTES
--------------- --------- ------- ---------- ---------- ----------
DEMOTAB 0 12 128 8 65536
DEMOTAB 1 12 136 8 65536
DEMOTAB 2 12 144 8 65536
DEMOTAB 3 12 152 8 65536
DEMOTAB 4 12 160 8 65536
DEMOTAB 5 12 168 8 65536
DEMOTAB 6 12 176 8 65536
DEMOTAB 7 12 184 8 65536
DEMOTAB 8 12 192 8 65536
DEMOTAB 9 12 200 8 65536
DEMOTAB 10 12 208 8 65536
DEMOTAB 11 12 216 8 65536
DEMOTAB 12 12 224 8 65536
DEMOTAB 13 12 232 8 65536
DEMOTAB 14 12 240 8 65536
DEMOTAB 15 12 248 8 65536
16 rows selected.
从dba_extents表中可以看到,表头是从第128个块开始的。直接dump 128,129,130这几个块进行分析。DUMP出来的文件在UDUMP路径下。
SQL> ALTER SYSTEM DUMP DATAFILE 12 BLOCK 128;
System altered.
SQL> ALTER SYSTEM DUMP DATAFILE 12 BLOCK 129;
System altered.
SQL> ALTER SYSTEM DUMP DATAFILE 12 BLOCK 130;
System altered.
SQL>
查看DUMP出来的文件
Trace file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_32242.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1
System name: Linux
Node name: gzyl.mgx
Release: 2.6.32-431.el6.x86_64
Version: #1 SMP Sun Nov 10 22:19:54 EST 2013
Machine: x86_64
Instance name: orcl
Redo thread mounted by this instance: 1
Oracle process number: 21
Unix process pid: 32242, image: oracle@gzyl.mgx (TNS V1-V3)
*** 2016-10-18 20:17:02.034
*** SESSION ID:(73.14402) 2016-10-18 20:17:02.034
*** CLIENT ID:() 2016-10-18 20:17:02.034
*** SERVICE NAME:(SYS$USERS) 2016-10-18 20:17:02.034
*** MODULE NAME:(sqlplus@gzyl.mgx (TNS V1-V3)) 2016-10-18 20:17:02.034
*** ACTION NAME:() 2016-10-18 20:17:02.034
Start dump data blocks tsn: 13 file#:12 minblk 128 maxblk 128
Block dump from cache:
Dump of buffer cache at level 4 for tsn=13, rdba=50331776
BH (0x8fff0208) file#: 12 rdba: 0x03000080 (12/128) class: 8 ba: 0x8fe8c000
set: 9 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 80828 objn: 80828 tsn: 13 afn: 12 hint: f
hash: [0xbe22af40,0xbe22af40] lru: [0x91f9c2b0,0x85f94600]
ckptq: [NULL] fileq: [NULL] objq: [0xbaa0cab8,0x85f94628]
st: XCURRENT md: NULL tch: 3
flags: block_written_once redo_since_read
LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [4]
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 13 rdba: 0x03000080 (12/128)
scn: 0x0000.070778a6 seq: 0x01 flg: 0x04 tail: 0x78a62001
frmt: 0x02 chkval: 0x946f type: 0x20=FIRST LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F26329EF800 to 0x00007F26329F1800
7F26329EF800 0000A220 03000080 070778A6 04010000 [ ........x......]
7F26329EF810 0000946F 00000000 00000000 00000000 [o...............]
7F26329EF820 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
7F26329EF840 00000000 00000000 00000000 00000004 [................]
7F26329EF850 FFFFFFFF 0000000D 00000003 00000010 [................]
7F26329EF860 00010002 00000000 00000000 00000000 [................]
7F26329EF870 00000000 00000003 00000000 00000000 [................]
7F26329EF880 00000000 00000000 00000000 00000000 [................]
7F26329EF890 03000081 00000000 00000000 00000003 [................]
7F26329EF8A0 00000008 03000083 00000000 00000000 [................]
7F26329EF8B0 00000000 00000000 00000000 00000001 [................]
7F26329EF8C0 00013BBC 00183D6E 00000000 03000080 [.;..n=..........]
7F26329EF8D0 00000008 00000000 03000088 00000008 [................]
7F26329EF8E0 00000008 00000000 00000000 00000000 [................]
7F26329EF8F0 00000000 00000000 00000000 00000000 [................]
Repeat 8 times
7F26329EF980 00000000 00000000 00000000 00001011 [................]
7F26329EF990 00000000 00000000 00000000 00000000 [................]
Repeat 485 times
7F26329F17F0 00000000 00000000 00000000 78A62001 [............. .x]
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x03000081 poffset: 0
unformatted: 13 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 3
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 80828
HWM Flag: HWM Set
Highwater:: 0x03000083 ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x03000080 Length: 8 Offset: 0
0x03000088 Length: 8 Offset: 8
0:Metadata 1:Metadata 2:Metadata 3:unformatted
4:unformatted 5:unformatted 6:unformatted 7:unformatted
8:unformatted 9:unformatted 10:unformatted 11:unformatted
12:unformatted 13:unformatted 14:unformatted 15:unformatted
--------------------------------------------------------
End dump data blocks tsn: 13 file#: 12 minblk 128 maxblk 128
*** 2016-10-18 20:17:03.966
Start dump data blocks tsn: 13 file#:12 minblk 129 maxblk 129
Block dump from cache:
Dump of buffer cache at level 4 for tsn=13, rdba=50331777
BH (0x8efe6418) file#: 12 rdba: 0x03000081 (12/129) class: 9 ba: 0x8ed82000
set: 12 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 80828 objn: 80828 tsn: 13 afn: 12 hint: f
hash: [0xbe3e2d20,0xbe3e2d20] lru: [0x82fdd420,0x99fd0dd0]
ckptq: [NULL] fileq: [NULL] objq: [0xbaa67a00,0x99fd0df8]
st: XCURRENT md: NULL tch: 3
flags: block_written_once redo_since_read
LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [5]
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 13 rdba: 0x03000081 (12/129)
scn: 0x0000.070778c8 seq: 0x01 flg: 0x04 tail: 0x78c82101
frmt: 0x02 chkval: 0xbb99 type: 0x21=SECOND LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F26329EF800 to 0x00007F26329F1800
7F26329EF800 0000A221 03000081 070778C8 04010000 [!........x......]
7F26329EF810 0000BB99 00000000 00000000 00000000 [................]
7F26329EF820 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
7F26329EF840 00000000 00000000 00000000 03000082 [................]
7F26329EF850 00000008 00000008 00000000 00000000 [................]
7F26329EF860 00000000 00000000 00013BBC 00000001 [.........;......]
7F26329EF870 00000000 03000080 00010005 03000090 [................]
7F26329EF880 00010005 030000A0 00010005 030000B0 [................]
7F26329EF890 00010005 030000C0 00010005 030000D0 [................]
7F26329EF8A0 00010005 030000E0 00010005 030000F0 [................]
7F26329EF8B0 00010005 00000000 00000000 00000000 [................]
7F26329EF8C0 00000000 00000000 00000000 00000000 [................]
Repeat 498 times
7F26329F17F0 00000000 00000000 00000000 78C82101 [.............!.x]
Dump of Second Level Bitmap Block
number: 8 nfree: 8 ffree: 0 pdba: 0x03000082
Inc #: 0 Objd: 80828
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x03000080 Free: 5 Inst: 1
0x03000090 Free: 5 Inst: 1
0x030000a0 Free: 5 Inst: 1
0x030000b0 Free: 5 Inst: 1
0x030000c0 Free: 5 Inst: 1
0x030000d0 Free: 5 Inst: 1
0x030000e0 Free: 5 Inst: 1
0x030000f0 Free: 5 Inst: 1
--------------------------------------------------------
End dump data blocks tsn: 13 file#: 12 minblk 129 maxblk 129
*** 2016-10-18 20:17:06.350
Start dump data blocks tsn: 13 file#:12 minblk 130 maxblk 130
Block dump from cache:
Dump of buffer cache at level 4 for tsn=13, rdba=50331778
BH (0x8afb9f28) file#: 12 rdba: 0x03000082 (12/130) class: 4 ba: 0x8a8d8000
set: 11 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 80828 objn: 80828 tsn: 13 afn: 12 hint: f
hash: [0xbe2d3780,0xbe2d3780] lru: [0x8dfeba80,0x9df99a50]
ckptq: [NULL] fileq: [NULL] objq: [0xbaa76f50,0x9df99a78]
st: XCURRENT md: NULL tch: 5
flags: block_written_once redo_since_read
LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [2]
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 13 rdba: 0x03000082 (12/130)
scn: 0x0000.070778cb seq: 0x01 flg: 0x04 tail: 0x78cb2301
frmt: 0x02 chkval: 0x9440 type: 0x23=PAGETABLE SEGMENT HEADER
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F26329EF800 to 0x00007F26329F1800
7F26329EF800 0000A223 03000082 070778CB 04010000 [#........x......]
7F26329EF810 00009440 00000000 00000000 00000000 [@...............]
7F26329EF820 00000000 00000010 00000080 00000A9C [................]
7F26329EF830 00000000 00000003 00000008 03000083 [................]
7F26329EF840 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
7F26329EF860 00000003 00000008 03000083 00000000 [................]
7F26329EF870 00000000 00000000 00000000 03000080 [................]
7F26329EF880 03000080 00000000 00000000 00000000 [................]
7F26329EF890 00000000 00000000 00000000 00000000 [................]
Repeat 3 times
7F26329EF8D0 00000001 00002000 00000000 00001434 [..... ......4...]
7F26329EF8E0 00000000 03000081 00000001 030000F0 [................]
7F26329EF8F0 03000081 00000000 00000000 00000000 [................]
7F26329EF900 00000000 00000000 00000010 00000000 [................]
7F26329EF910 00013BBC 10000000 03000080 00000008 [.;..............]
7F26329EF920 03000088 00000008 03000090 00000008 [................]
7F26329EF930 03000098 00000008 030000A0 00000008 [................]
7F26329EF940 030000A8 00000008 030000B0 00000008 [................]
7F26329EF950 030000B8 00000008 030000C0 00000008 [................]
7F26329EF960 030000C8 00000008 030000D0 00000008 [................]
7F26329EF970 030000D8 00000008 030000E0 00000008 [................]
7F26329EF980 030000E8 00000008 030000F0 00000008 [................]
7F26329EF990 030000F8 00000008 00000000 00000000 [................]
7F26329EF9A0 00000000 00000000 00000000 00000000 [................]
Repeat 144 times
7F26329F02B0 03000080 03000083 03000080 03000088 [................]
7F26329F02C0 03000090 03000091 03000090 03000098 [................]
7F26329F02D0 030000A0 030000A1 030000A0 030000A8 [................]
7F26329F02E0 030000B0 030000B1 030000B0 030000B8 [................]
7F26329F02F0 030000C0 030000C1 030000C0 030000C8 [................]
7F26329F0300 030000D0 030000D1 030000D0 030000D8 [................]
7F26329F0310 030000E0 030000E1 030000E0 030000E8 [................]
7F26329F0320 030000F0 030000F1 030000F0 030000F8 [................]
7F26329F0330 00000000 00000000 00000000 00000000 [................]
Repeat 144 times
7F26329F0C40 00000000 00000000 03000081 00000000 [................]
7F26329F0C50 00000000 00000000 00000000 00000000 [................]
Repeat 185 times
7F26329F17F0 00000000 00000000 00000000 78CB2301 [.............#.x]
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 16 #blocks: 128
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x03000083 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:: 0x03000083 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: 0x03000080
Level 1 BMB for Low HWM block: 0x03000080
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x03000081
Last Level 1 BMB: 0x030000f0
Last Level II BMB: 0x03000081
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 16 obj#: 80828 flag: 0x10000000
Inc # 0
Extent Map
-----------------------------------------------------------------
0x03000080 length: 8
0x03000088 length: 8
0x03000090 length: 8
0x03000098 length: 8
0x030000a0 length: 8
0x030000a8 length: 8
0x030000b0 length: 8
0x030000b8 length: 8
0x030000c0 length: 8
0x030000c8 length: 8
0x030000d0 length: 8
0x030000d8 length: 8
0x030000e0 length: 8
0x030000e8 length: 8
0x030000f0 length: 8
0x030000f8 length: 8
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x03000080 Data dba: 0x03000083
Extent 1 : L1 dba: 0x03000080 Data dba: 0x03000088
Extent 2 : L1 dba: 0x03000090 Data dba: 0x03000091
Extent 3 : L1 dba: 0x03000090 Data dba: 0x03000098
Extent 4 : L1 dba: 0x030000a0 Data dba: 0x030000a1
Extent 5 : L1 dba: 0x030000a0 Data dba: 0x030000a8
Extent 6 : L1 dba: 0x030000b0 Data dba: 0x030000b1
Extent 7 : L1 dba: 0x030000b0 Data dba: 0x030000b8
Extent 8 : L1 dba: 0x030000c0 Data dba: 0x030000c1
Extent 9 : L1 dba: 0x030000c0 Data dba: 0x030000c8
Extent 10 : L1 dba: 0x030000d0 Data dba: 0x030000d1
Extent 11 : L1 dba: 0x030000d0 Data dba: 0x030000d8
Extent 12 : L1 dba: 0x030000e0 Data dba: 0x030000e1
Extent 13 : L1 dba: 0x030000e0 Data dba: 0x030000e8
Extent 14 : L1 dba: 0x030000f0 Data dba: 0x030000f1
Extent 15 : L1 dba: 0x030000f0 Data dba: 0x030000f8
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x03000081
End dump data blocks tsn: 13 file#: 12 minblk 130 maxblk 130
附 show_space()存储过程代码
CREATE OR REPLACE PROCEDURE show_space (p_segname_1 IN varchar2,
p_space IN varchar2 DEFAULT 'MANUAL' ,
p_type_1 IN varchar2 DEFAULT 'TABLE' ,
p_analyzed IN varchar2 DEFAULT 'N' ,
p_owner_1 IN varchar2 DEFAULT USER
)
AS
p_segname VARCHAR2 (100);
p_type VARCHAR2 (10);
p_owner VARCHAR2 (30);
l_unformatted_blocks NUMBER;
l_unformatted_bytes NUMBER;
l_fs1_blocks NUMBER;
l_fs1_bytes NUMBER;
l_fs2_blocks NUMBER;
l_fs2_bytes NUMBER;
l_fs3_blocks NUMBER;
l_fs3_bytes NUMBER;
l_fs4_blocks NUMBER;
l_fs4_bytes NUMBER;
l_full_blocks NUMBER;
l_full_bytes NUMBER;
l_free_blks NUMBER;
l_total_blocks NUMBER;
l_total_bytes NUMBER;
l_unused_blocks NUMBER;
l_unused_bytes NUMBER;
l_lastusedextfileid NUMBER;
l_lastusedextblockid NUMBER;
l_last_used_block NUMBER;
PROCEDURE p (p_label IN varchar2, p_num IN number)
IS
BEGIN
DBMS_OUTPUT.put_line (RPAD (p_label, 40, '.') || p_num);
END;
BEGIN
p_segname := UPPER (p_segname_1); -- rainy changed
p_owner := UPPER (p_owner_1);
p_type := p_type_1;
IF (p_type_1 = 'i' OR p_type_1 = 'I')
THEN --rainy changed
p_type := 'INDEX';
END IF;
IF (p_type_1 = 't' OR p_type_1 = 'T')
THEN --rainy changed
p_type := 'TABLE';
END IF;
IF (p_type_1 = 'c' OR p_type_1 = 'C')
THEN --rainy changed
p_type := 'CLUSTER';
END IF;
DBMS_SPACE.unused_space (segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
last_used_extent_file_id => l_lastusedextfileid,
last_used_extent_block_id => l_lastusedextblockid,
last_used_block => l_last_used_block
);
IF p_space = 'MANUAL' OR (p_space <> 'auto' AND p_space <> 'AUTO')
THEN
DBMS_SPACE.free_blocks (segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks
);
p ('Free Blocks', l_free_blks);
END IF;
p ('Total Blocks', l_total_blocks);
p ('Total Bytes', l_total_bytes);
p ('Unused Blocks', l_unused_blocks);
p ('Unused Bytes', l_unused_bytes);
p ('Last Used Ext FileId', l_lastusedextfileid);
p ('Last Used Ext BlockId', l_lastusedextblockid);
p ('Last Used Block', l_last_used_block);
/*IF the segment is analyzed */
IF p_analyzed = 'Y'
THEN
DBMS_SPACE.space_usage (segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
unformatted_blocks => l_unformatted_blocks,
unformatted_bytes => l_unformatted_bytes,
fs1_blocks => l_fs1_blocks,
fs1_bytes => l_fs1_bytes,
fs2_blocks => l_fs2_blocks,
fs2_bytes => l_fs2_bytes,
fs3_blocks => l_fs3_blocks,
fs3_bytes => l_fs3_bytes,
fs4_blocks => l_fs4_blocks,
fs4_bytes => l_fs4_bytes,
full_blocks => l_full_blocks,
full_bytes => l_full_bytes
);
DBMS_OUTPUT.put_line (RPAD (' ', 50, '*'));
DBMS_OUTPUT.put_line ('The segment is analyzed');
p ('0% -- 25% free space blocks', l_fs1_blocks);
p ('0% -- 25% free space bytes', l_fs1_bytes);
p ('25% -- 50% free space blocks', l_fs2_blocks);
p ('25% -- 50% free space bytes', l_fs2_bytes);
p ('50% -- 75% free space blocks', l_fs3_blocks);
p ('50% -- 75% free space bytes', l_fs3_bytes);
p ('75% -- 100% free space blocks', l_fs4_blocks);
p ('75% -- 100% free space bytes', l_fs4_bytes);
p ('Unused Blocks', l_unformatted_blocks);
p ('Unused Bytes', l_unformatted_bytes);
p ('Total Blocks', l_full_blocks);
p ('Total bytes', l_full_bytes);
END IF;
END;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27056898/viewspace-2126692/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27056898/viewspace-2126692/