日期:2014-05-16 浏览次数:20552 次
在了解dmt和lmt之前,先来简单的熟悉一下oracle数据库的逻辑结构,逻辑结构描速起来非常简单:表空间是由段(segment)组成的,段是由范围(extent)组成的,范围是由连续的(block)组成的。这里也可以通过一幅众所周知的图来表示:
当在表空间里创建一个table,index等对象时其实对我们使用者而言称其为对象,但是从oracle存储的角度来说把它称其为 segment。我们都知道oracle最小的读写单位是block,但是在为对象分配空间时单位却是extent,这样做的好处其实就是为了提高效率。 上面提到段是由范围组成的,当一个extent被分配给一个segment时,和segment对应的对象就可以使用空间,我们或许从来都不会关心 oracle内部到底是如何标记这个extnet是属于哪个segment的甚至也可能不会关心这个extent到底是属于哪一个datafile的,但 是对oracle而言,这却是一件非常重要的事情。oracle需要一种机制来跟踪或者记录一个数据文件中extent的使用、空闲情况。Dmt,lmt 就是针对表空间中extent是如何被管理而言的。
1、dmt (dictionary managed tablespace)
从oracle9.2开始,default的tablespace都是lmt的,而且也不支持创建dmt类型的表空间了:
SQL> create tablespace dmt datafile 'E:ORACLEPRODUCT10.2.0ORADATATESTDMT.D
BF' SIZE 3M extent management dictionary;
create tablespace dmt datafile 'E:ORACLEPRODUCT10.2.0ORADATATESTDMT.DBF' S
IZE 3M extent management dictionary
*
第 1 行出现错误:
ORA-12913: 无法创建字典管理的表空间
SQL>
除非在创建数据库时选择定制把system tablespace的区管理类型改成在字典中管理,否则在system tablespace类型是local的情况下是不支持创建dmt类型的表空间了。
另外值得一提的是从9.2开始,即使在创建db时指定temp tbs为字典管理的,通过dbca创建时可以指定,但是创建之后还是发现它是local管理的;使用命令创建时直接会报错:
SQL> col tablespace_name format a20
SQL> select tablespace_name , contents , extent_management from dba_tablespaces;
TABLESPACE_NAME CONTENTS EXTENT_MANAGEMENT
-------------------- ------------------ --------------------
SYSTEM PERMANENT DICTIONARY
UNDOTBS1 UNDO LOCAL
SYSAUX PERMANENT LOCAL
TEMP TEMPORARY LOCAL
USERS PERMANENT LOCAL
DMT PERMANENT DICTIONARY
已选择6行。
上面查询显示system tbs是dictionary
SQL> create temporary tablespace tmp tempfile 'E:ORACLEPRODUCT10.2.0ORADATA
DMTTMP.DBF' SIZE 5M extent management dictionary;
create temporary tablespace tmp tempfile 'E:ORACLEPRODUCT10.2.0ORADATADMTT
MP.DBF' SIZE 5M extent management dictionary
*
ERROR at line 1:
ORA-25139: invalid option for CREATE TEMPORARY TABLESPACE
undo tbs在通过dbca建库时也不允许指定为dictionary类型,命令方式同样如此:
SQL> create undo tablespace undotbs2 datafile 'E:ORACLEPRODUCT10.2.0ORADATA
UNDOTBS02.DBF' size 3m extent management dictionary;
create undo tablespace undotbs2 datafile 'E:ORACLEPRODUCT10.2.0ORADATAUNDOT
BS02.DBF' size 3m extent management dictionary
*
ERROR at line 1:
ORA-30024: Invalid specification for CREATE UNDO TABLESPACE
说了半天,到底什么是dmt,其实非常容易理解,当在tbs上创建segment时,表空间里相应的数据文件中
的extent是被使用了还是处于空闲是记录在两个数据字典表中(uet$:used extent;fet$:free extent),
也就是说Oracle updates the appropriate tables in the data dictionary whenever an extent is
allocated, or freed for reuse. 需要注意的是查询这两个表需要sys用户。
SQL> create table t(id int) tablespace dmt;
Table created.
SQL> select * from uet$ where segfile#<>1;
SEGFILE# SEGBLOCK# EXT# TS# FILE# BLOCK# LENGTH
---------- ---------- ---------- ---------- ---------- ---------- ----------
5 2 0 5 5 2 5
uet$字段简要介绍:
SEGFILE# segment header block所在的数据文件编号,对应dba_segments.header_file
SEGBLOCK# segment header block 编号,对应dba_segments.header_block
EXT# extent编号 对应dba_extents.extent_id TS# tbs编号 对应v$tablespace.ts# FILE# extent所在的datafile编号,对应dba_data_file.file_id BLOCK# extent的起始block编号,对dba_extents.block_id LENGTH 该extent从block#开始所包含的block的数量,对应dba_extents.blocks
SQL> select * from fet$ ;
TS# FILE# BLOCK# LENGTH
---------- ---------- ---------- ----------
0 1 13864 5337
5 5 7 186
fet$ 字段简要介绍:
TS# 同上
FILE# 同上
BLOCK# 数据文件file#上free block开始位置
LENGTH free block的长度,block的数量
在创建dmt tbs时指定的数据文件大小是3m:
SQL> select 3*1024*1024/16384 from dual;
3*1024*1024/16384 ----------------- 192
SQL>
192个block - 从uet$得知的从第二个block开始该extent总共包含5个block(也就是2~6),也就是fet$