日期:2014-05-16  浏览次数:20526 次

关于oracle 中的dmt_lmt_mssm_assm之间的关系

在了解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$