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