Oracle表空间的管理方式(LMT、DMT)--本地和字典管理
字典管理:oracle 8i(不包括i),只存在一种表空间的管理模式,即字典管理表空间(DMT)。DMT是指oracle的空间分配或回收是通过数据库中的数据字典表来记录和管理的。用于管理的两个数据字典表分别是:UET$(used extents)和FET$(freeextents)。DMT的工作方式是:当建立一个新的段或者段在表空间时,oracle通过一系列的SQL语句来完成这个工作且和前面的两个字典表有关,在繁忙的系统中会造成竞争和等待(另一个DMT会带来的问题是空间碎片)。
本地管理(Locally Managed Tablespace,LMT):在创建表空间时,在9i的R2版本后成了默认的选项。LMT在表空间的数据文件头部加入了一个位图区域,在其中记录每个extent的使用状况。当extent被使用或者被释放,oracle会更新头部的记录来反映这个变化,不产生回滚信息。因为仅仅操作数据文件头部的几个数据块,不用操作数据字典,LMT比DMT要快,尤其是在繁忙的时候更明显。
需要注意的是,如果使用“CREATE DATABASE”命令创建数据库,且不显式的加“EXTENT MANAGEMENT LOCAL”子句时,那么在创建完数据库后,其SYSTEM表空间默认为字典管理的表空间。只有SYSTEM表空间为字典管理的表空间时,才可以创建基于字典管理的其它表空间。如果SYSTEM表空间是基于本地管理的,那么无法创建基于字典管理的表空间。
--查看表空间使用的管理方式:
SQL> select TABLESPACE_NAME,EXTENT_MANAGEMENT,BLOCK_SIZE,STATUS,CONTENTS,FORCE_LOGGING,BIGFILE from dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN BLOCK_SIZE STATUS CONTENTS FOR BIG
------------------------------ ---------- ---------- --------- --------- --- ---
SYSTEM LOCAL 8192 ONLINE PERMANENT NO NO
UNDOTBS1 LOCAL 8192 ONLINE UNDO NO NO
SYSAUX LOCAL 8192 ONLINE PERMANENT NO NO
TEMP LOCAL 8192 ONLINE TEMPORARY NO NO
USERS LOCAL 8192 ONLINE PERMANENT NO NO
EXAMPLE LOCAL 8192 ONLINE PERMANENT NO NO
TBS1 LOCAL 8192 ONLINE PERMANENT NO NO
--DMT 和LMT 的相互转换
--将字典管理的表空间转换为本地管理
exec dbms_space_admin.tablespace_migrate_to_local('表空间名') --表空间名用大写
--将本地管理的表空间转换为字典管理
exec dbms_space_admin.tablespace_migrate_from_local('表空间名')
【OCP真题1】 which two statements are true about tablespaces?
A. A database can contain multiple undo tablespaces.
B. A database instance stores undo data in the SYSTEM tablespace if no undo tablespace exists.
C. A database instance hangs if the SYSAUX tablespace becomes unavailable.
D. A database can contain only a single temporary tablespace.
E. A database with a locally managed SYSTEM tablespace can have dictionary-managed user tablespaces.
Answer:AB
对于C选项,不会hang住。
对于D选项,一个数据库可以包含多个临时表空间。
对于E选项,如果系统表空间是基于本地管理的,那么无法创建基于数据字典管理的表空间。
SYS@ora11g > create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management directory;
create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management directory
*
ERROR at line 1:
ORA-25141: invalid EXTENT MANAGEMENT clause
SYS@ora11g > create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary;
create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary
*
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace
SYS@ora11g > select extent_management from dba_tablespaces where tablespace_name='SYSTEM';
EXTENT_MAN
----------
LOCAL
SYS@ora11g > ! oerr ora 12913
12913, 00000, "Cannot create dictionary managed tablespace"
// *Cause: Attemp to create dictionary managed tablespace in database
// which has system tablespace as locally managed
// *Action: Create a locally managed tablespace.
SYS@ora11g >
只有SYSTEM为字典管理的表空间时才能创建字典管理的普通表空间:
[oracle@rhel6lhr ~]$ cat a.txt
db_name=PROD3
db_block_size=8192
db_create_file_dest='/u01/app/oracle/oradata'
control_files='/u01/app/oracle/oradata/PROD3/control01.ctl'
sga_target=300m
[oracle@rhel6lhr ~]$
[oracle@rhel6lhr ~]$
[oracle@rhel6lhr ~]$ mkdir /u01/app/oracle/oradata/PROD3
[oracle@rhel6lhr ~]$
[oracle@rhel6lhr ~]$ sas
SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 24 22:41:03 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to an idle instance.
SYS@orclasm > exit
Disconnected
[oracle@rhel6lhr ~]$ ORACLE_SID=PROD3
[oracle@rhel6lhr ~]$ sas
SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 24 22:41:17 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to an idle instance.
SYS@PROD3 > startup nomount pfile='/home/oracle/a.txt';
ORACLE instance started.
Total System Global Area 313159680 bytes
Fixed Size 2227944 bytes
Variable Size 113246488 bytes
Database Buffers 192937984 bytes
Redo Buffers 4747264 bytes
SYS@PROD3 > create database PROD3 character set al32utf8;
Database created.
/*
Specify the EXTENT MANAGEMENT LOCAL clause in the CREATE DATABASE statement to create a locally managed SYSTEM tablespace. The COMPATIBLE initialization parameter must be set to 10.0.0 or higher for this statement to be successful. If you do not specify the EXTENT MANAGEMENT LOCAL clause, then by default the database creates a dictionary-managed SYSTEM tablespace. Dictionary-managed tablespaces are deprecated.*/
SYS@PROD3 > select open_mode from v$database;
OPEN_MODE
----------------------------------------
READ WRITE
SYS@PROD3 > create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary;
Tablespace created.
SYS@PROD3 >
SYS@PROD3 > SET LINE 120
SYS@PROD3 > SELECT TS.NAME,decode(ts.bitmapped, 0, 'DICTIONARY', 'LOCAL') extent_management FROM SYS.TS$ TS;
NAME EXTENT_MANAGEMENT
------------------------------------------------------------ --------------------
SYSTEM DICTIONARY
SYSAUX LOCAL
SYS_UNDOTS LOCAL
TEST_DIC DICTIONARY
SYS@PROD3 >
【OCP真题1】 An online tablespace, TEST_TBS, is full and you realize that no server-managed tablespace threshold alerts were generated for the TEST_TBS tablespace. What could be the reason, if the TEST_TBS tablespace does not include autoextensible data files? 一个名为测试表空间的联机表空间是满的,你意识到测试表空间表没有生成服务器管理的表空间阈值警报。如果测试表空间不包括自动扩展数据文件,可能是什么原因?
A. TEST_TBS is a small file tablespace.
B. TEST_TBS is a bigfile tablespace (BFT).
C. TEST_TBS is the default temporary tablespace.
D. TEST_TBS is a dictionary-managed tablespace. TEST_TBS是一个字典管理的表空间。(基于位图的会告警)
Answer: D
Oracle表空间的管理方式
解释说明:表空间是一个逻辑概念:=> oracle 逻辑概念段区块管理方式:
number one =》 tablespace
number two=> segments
Oracle新建一个对象,产生一个对象,这有啥需要管理的吗? 使用了一个延时段管理;
所以一般没人会回答表空间的管理是延迟段管理还是非延迟段管理,而是说区的管理方式,就是分配区的方式;
number three A:如何寻找空闲的区域,给新分配的区,安家落户。
Oracle区的分配的方式分两种: directory, local 字典、本地管理,字典管理基本被弃用; 那么Oracle分配区的方式有没有更细节的呢? 例如分配一个区,区分给他多大?
number three B:衍生出,如何对新生成的区,给它分配多大空间,第一种:默认,auto allocative,系统默认分配;第二种uniform size;
首先解释说明,区的空间大小如何衡量? 区是由连续的块组成,最初是8个块*8192Bytes=64kb ytes/
*** 相当于看人口,举例,家族迁移;发生战乱,从北方逃难,来到美丽的江西九江,九江的官员毕竟负责,来住可以,先统计人口,判断出,有500多号人,按照8个房间,一个房间住2个人的美好场景=32间房间左右,按照16个房间好管理的方式,分配了两个街道(区),每个街道16个房间(块);
如果是自动的呢? 官员不负责任,来了500个人,按照每个街道,分配8个房间;需要62个街道分配,分配12次;
但是官府有一套机制,分配到16个街道之后,官府自动增加分配区的大小,分配第16以后,官府决定大方一点,每个街道(区)分配128间房间,(麻烦,减少工作量)这样最少,也需要分配16个街道*8+ 2-3*128个块的方式分配===》也就是说,最少需要分配18次;
以上说明:仅限于理解,手动统一分配与自动的区别,实际还存在大量误差,概念可以先理解;
number four;以上分配空间都说了空间不够,分区;
如果是已经分配了区,但是Insert 一条数据,它去哪里存储呢?,块在哪里找呢? 段空闲管理方式;
number four A: manual手工,特征,并不是手动,而是相比较B,显得笨拙;
特点: 手工段空闲管理,在段的头部,段是逻辑概念,如何真时记录数据,归属于段的一堆块中,前三个块默认,就是管理单位,建立记录了一个free list的列表,存储什么样的数据? 存储记录空闲空间的块的信息;需要使用块时,去空闲列表,读取空闲块;并发访问会导致添加锁,其它事物等待,这种热快容易产生,buffer busy waits热快现象;访问时串行方式
number four B: auto:默认,我们存储数据,一般是无序的,哪个块有空闲,就往哪个块里面存储数据,正是因为没有顺序,所以访问表的数据,需要全表扫描;
自动段空闲块管理,采用的方式是在段的头部建立bitmap位图的方式记录块是否空闲,支持并发访问;
——————————————————————以上是原理,以下通过视图验证查询---
number one;
Aoracle database 11g 默认采用段延迟管理;
SQL> show parameter seg
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
--延迟 段 创建=> ture false;
什么是延迟管理,如果你创建的对象没有具体的数据存储,Oracle将不会给你分配存储区域,存储区域的管理是段,不会分配段给你;
---创建测试表,只创建表结构,没有数据
SQL> create table emp1 as select * from emp where 1=2;
---查询表的存储,段、区、块、大小
SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENTS from user_segments where segment_name='EMP1';
no rows selected
--插入数据测试
SQL> insert into emp1 select * from emp where rownum<2;
--再次查询
SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENTS from user_segments where segment_name='EMP1';
SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENT
EMP1 TABLE USERS .0625 8 1
---修改参数,取消延迟段分配管理,创建测试表,查询结果如下;
---alter system set deferred_segment_creation=false;
EMP2 TABLE USERS .0625 8 1
-------------------------------------------------------------------------------------------------------
number two
空闲区的管理方式:数据字典管理与本地管理
数据字典管理:1.采取两个基表进行管理,free extent记录在数据字典表中的fet$、已经使用的记录在uet$;
2.当表插入数据,需要存储扩大空间存放数据,都需要访问fet$表,获取信息后;
3.需要对fet$、以及uet$两张表进行dml更改操作;
===》这就造成了,如果数据库中,大量的区扩张时,并发去访问修改以上两张表,消耗资源,等待分配;
本地管理:位图管理:权利下放,从两张表的权限放到每一个数据文件的手上;
1.每个表空间对每个数据文件的头部加入一个位图区,记录每个区的使用情况,当存储区发生改变使用或者删除,会对数据文件头部的位图进行修改;
2.因为如上的方式,回收或者分配,只需要在每个表空间的每个数据文件的数据文件头部进行修改,而且还是修改位图,效率高,并且减少了并发
--如何查询是表空间是位图管理:本地还是数据字典管理呢?
SQL> select TABLESPACE_NAME,CONTENTS,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;
TABLESPA CONTENTS EXTENT_MAN ALLOCATIO SEGMEN
-------- --------- ---------- --------- ------
SYSTEM PERMANENT DICTIONARY USER MANUAL
SYSAUX PERMANENT LOCAL SYSTEM AUTO
UNDOTBS1 UNDO LOCAL SYSTEM MANUAL
TEMPTS1 TEMPORARY LOCAL UNIFORM MANUAL
USERS PERMANENT LOCAL SYSTEM MANUAL
TBS_DICT PERMANENT DICTIONARY USER MANUAL
extent_management列:directory代表数据字典,local代表本地位图管理;
directory已经被放弃选择了,此查询是因为手工艰苦,控制文件脚本修改了:删除了.EXTENT MANAGEMENT LOCAL 表空间本地管理,造成的效果类似,extent management directory;
.SQL> create tablespace abc datafile '/picclife/app/oracle/abc.dbf' size 10m extent management local/ directory;
-------------------------------------------------------------
number three:
表空间的管理,区分配多大空间:
首先提取测试环境:scott用户,默认是users表空间,对应的区管理分配的大小:
ALLOCATION_TYPE=》system 方式,代表系统自动管理,next_extent空值,最小64K/8K=8个块;
create table t1 as select * from emp;
select segment_name,extent_id,file_id,block_id,blocks from dba_extents where owner='SCOTT'
and segment_name='T1';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------- ---------- ---------- ---------- ----------
T1 0 6 1648 8 ---虽然表中的数据存储,没有占满8个块的区域,但是Oracle最少还是一起分配了一个区8个块;
insert into t1 select * from t1; --增加数据
//
480 rows created.测试
从第 十七个块,开始,每次分配128个数据块;
--测试环境查询了一个1G左右的表,是导入进去的,一个区存在; blocks 8192个数据块;
成倍增加;
ALLOCATION_TYPE=》uniform 代表extent的分配方式一致:
SQL> select tablespace_name,initial_extent,next_extent,min_extents ,max_extents from dba_tablespaces;
TABLESPA INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS
-------- -------------- ----------- ----------- -----------
SYSTEM 16384 16384 1 505
SYSAUX 65536 1 2147483645
TBS_DICT 40960 40960 1 505
ABC 65536 1 2147483645
YA 65536 1 2147483645
TBSA 1048576 1048576 1 2147483645
TEMPTS1 1048576 1048576 1
SQL> select 1048576/1024/1024 from dual;
1048576/1024/1024 ----------------- 1M
SQL> select 1048576/8192 from dual; 128个块---
1048576/8192 ------------ 128
------------如上查询,tempts1是创建数据库默认选项next_extent对应的是1M大小,128个数据块,Oracle为每个一个区分配一个固定的128个块为单位的一个区;
SYSTEM=>USER: 代表可以控制next_extent的值:
SYSTEM PERMANENT DICTIONARY USER MANUAL
TBS_DICT PERMANENT DICTIONARY USER MANUAL
--只要区的分配方式是数据字典管理,则区大小的分配就是user模式,代表可以自主分配;
数据字典,区大小分配方式;
SQL> select 40960/8192 from dual;
40960/8192 ---------- 5 五个块
SQL> select 40960/1024/1024 from dual;
40960/1024/1024 --------------- .0390625 ---实际多大,给多大,是否
-----------------------------------------------------------------------------------------------------------
number four :
以上说的都是如何寻找空闲的区,用来分配,给一个区分配多大空间;
如今一个现实的问题摆在你面前,直接问你,我爱你你嫁不嫁我,咋整,直接;
我有一条数据,需要存储,存在哪里?如何寻找:
来走进块的空闲区域管理:
段的空闲块管理:segment free block management;
1.manual
2.auto
块什么是空闲? 块分几部分: 块头,存储区域,空闲区域:一般空闲区域预留10%的区域;
1.manual=> segment header 段的前三个块默认块头部,建立一个free list列表记录空闲的块;
使用空闲列表,获取空闲块,并发访问free list ,其它insert事物处于等待状态,在segment header block会经常出现buffer busy waits热快事件,访问串行,存储满了之后,移除列表;
2.auto =》在segment bitmap标识上可用的空闲块,0空闲1非空闲,支持并发访问;
SQL> select TABLESPACE_NAME,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;
TABLESPA SEGMEN -------- ------
SYSTEM MANUAL
SYSAUX AUTO
SQL> select tablespace_name,SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from dba_segments where tablespace_name='SYSTEM'
SYSTEM SYS_LOB0000000474C00021$$ LOBSEGMENT 1 1
SQL> select tablespace_name,SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from dba_segments where tablespace_name='SYSAUX'
SYSAUX BSLN_TIMEGROUPS_PK INDEX
------以上为查询:
语言描述:当数据对象插入数据,假设为manual管理方式,pctfree=20,代表,数据块空间存储达到80%,数据块将被移除空闲列表,随着数据的删除,当数据块的使用百分比低于参数:pctused参数的设置时,加入空闲列表;空闲链表中,竞争压力强大;ASSM管理
Auto Segment Space Management:
为了解决上述的问题,通过位图有效快速解决存储扩张和剩余区块free block:改善段的存储管理;
ASSM管理模式下,insert 通过扫描位图查找可用的Block:
参数:pctfree还需要,但是低于此数值,也不会从位图删除,而是记录状态,可用为后续的update更改操作保留行数据增长预留使用;
PCTUSED参数,将被废弃,不需要记录使用百分比;
FREELIST FREELIST GROUPS将无效;
新的管理方式使用位图的机制对块进行追踪,没个块的大小,状态使用了:>75%,50%-75%,25%-50%,<25%,四个状态代替以前的pctused;
ASSM管理最大优势,位图减轻缓冲区等待,Buffer busy wait热快的产生;
ORA-12913: 无法创建字典管理的表空间
jcq0>show user
USER 为"SYS"
jcq0>create tablespace dictionary_t
2 datafile 'D:\Oracle\ORADATA\DB_NAMEX\dict.dbf' size 50M
3 extent management dictionary
4 default storage(initial 100k next 100k);
create tablespace dictionary_t
*
ERROR 位于第 1 行:
ORA-12913: 无法创建字典管理的表空间
查看错误解释
ORA-12913 Cannot create dictionary managed tablespace
Cause: An attempt was made to create a dictionary managed tablespace in a database whose SYSTEM tablespace is locally managed.
Action: Create a locally managed tablespace.
该信息告诉我们只能在SYSTEM表空间为字典管理时才能用以上语句创建字典管理的表空间
3.峰回路转
突然想到不是有个包可以在本地管理的表空间和字典管理的表空间之间迁移么,之后找到该包
DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL
DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL
看来果然可以,于是马上动手
jcq0>execute DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('TEST10');
BEGIN DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('TEST10'); END;
*
ERROR 位于第 1 行:
ORA-12914: 无法将表空间移植到字典管理的类型中
ORA-06512: 在"SYS.DBMS_SPACE_ADMIN", line 0
ORA-06512: 在line 1
ORA-12914 Cannot migrate tablespace to dictionary managed type
Cause: An attempt was made to migrate a locally managed tablespace to dictionary managed type when the database has a locally managed SYSTEM tablespace.
Action: Such an operation cannot be issued.
同样的提示,所以先迁移SYSTEM表空间
jcq0>execute DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('SYSTEM');
BEGIN DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('SYSTEM'); END;
*
ERROR 位于第 1 行:
ORA-03251: 无法在 SYSTEM 表空间上提交此命令
ORA-06512: 在"SYS.DBMS_SPACE_ADMIN", line 0
ORA-06512: 在line 1
ORA-03251 Cannot issue this command on SYSTEM tablespace
Cause: It is not permitted to migrate SYSTEM tablespace from locally managed format to dictionarymanaged format or relocate bitmaps.
Action: Check the tablespace name and procedure name.
4.回到原点
翻到doc对该过程的说明可以得到同样的解释
The tablespace must be kept online and read/write during migration. Migration of temporarytablespaces and migration of SYSTEM tablespaces are not supported.
5.结论
如果你想在SYSTEM为本地管理表空间的数据库上建立字典管理的表空间,那么答案是 no way!!!
Oracle的物理结构和逻辑结构的关系
Oracle不会直接操作底层操作系统的数据文件,而是提供了一个中间层,这个中间层就是Oracle的逻辑结构,它与操作系统的平台无关,中间层(逻辑结构)到数据文件(物理结构)的映射通过DBMS来完成。一个数据库有一个或多个表空间,一个表空间有一个或多个段,一个段有一个或多个区间组成、一个区间由一个或多个数据库块组成、一个数据库块由一个或多个操作系统块组成;一个表空间物理上由一个或多个数据文件组成,一个数据文件物理上由一个或多个操作系统块组成。
表空间的分类
在一个数据库中表空间的数量没有严格的限制。有几个表空间是Oracle数据库必备的,它们是system,temporary,undo,user,oracle 10g以后还有sysaux表空间。
Oracle数据库的表空间分为两类:系统表空间和非系统表空间。
表空间的区间管理
表空间的管理其实就是分配可用区间和回收空闲区间的过程,Oracle提供了两种表空间区间管理的方法,一种是数据字典管理、一种是本地管理。
数据字典管理方式是将每个表空间的使用情况记录在数据字典表中,当分配或撤销表空间区段的时,隐含使用SQL语句记录当前表空间的使用情况,并在撤销段中记录以前区段的使用情况,这种操作方式增加了数据字典的频繁操作,对于一个大型的数据库系统,这样的系统效率会非常的低下。
为了解决数据字典管理表空间效率不高的问题,Oracle设计让每一个表空间自己管理表空间区段的分配,记录区段的使用情况。在数据文件头中有一个区域用于存储本地管理的表空间的数据文件的空间信息,将表空间中数据文件的可用和已用空间信息记录下来。本地管理的方式使用位图在数据文件头中记录数据文件的已用和可用信息,位图使用一个数据位表示一个数据块或者一组数据库块的使用情况,而表空间的最小分配单位就是区段extent,一个区段由多个数据库块组成,所以当需要在表空间中增加新的对象时,就需要查找位图,看是否有一段连续的Oracle数据库空闲。
表空间的创建
表空间的创建语法为:
CREATE [ BIGFILE | SMALLFILE ] [ TEMPORARY ] [ UNDO ] TABLESPACE tablespace name //
DATAFILE datafile spec | TEMPORARY tempfile spec
[ MINIMUM EXTENT minimum extend size ] //定义该表空间中最小中最小区段大小,这样该表空间中的区段大小为最小值的整数倍
[ BLOCKSIZE blockszie ]
[ [ COMPRESS | NOCOMPRESS ] DEFAULT STORAGE (default storage clause) ]
[ LOGGING | NOLOGGING ] //是否把该表空间中数据的变化记录在重做日志文件中
[ FORCE LOGGING ]
[ ONLINE | OFFLINE ] //表空间创建后是否联机
[ EXTENT MANAGEMENT DICTIONARY | LOCAL [ AUTOALLOCATE | UNIFORM SIZE size ] ] //表空间的管理方式:数据字典管理或本地管理
[ SEGMENT SPACE MANAGEMENT MANUAL | AUTO ]
[ FLASHBACK ON | OFF ]
示例一:
SQL> create tablespace demotbs
2 datafile '/u01/app/oracle/oradata/testdb/test01.dbf' size 10m;
Tablespace created.
示例二:
无法创建基于数据字典管理的表空间问题
SQL> create tablespace dic_management_tbs
2 datafile '/u01/app/oracle/oradata/testdb/test02.dbf' size 10m
3 extent management dictionary;
create tablespace dic_management_tbs
*
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace
原因是因为:如果系统表空间是基于本地管理的,则无法创建基于数据字典管理的表空间,看见基于数据字典管理表空间的方式已经成为历史了。
SQL> select extent_management from dba_tablespaces where tablespace_name='SYSTEM';
EXTENT_MAN
----------
LOCAL