ORACLE表空间是一个逻辑容器,包含一个或多个数据文件。表空间包含段(segment)、段又包含区(extent)、区又包含了块(block)。其中区的管理方式有字典管理(dictonary)和本地管理(local);段的管理方式手动管理(Freelists)和自动管理(ASSM).
获取已有表空间的DDL
查看表空间管理方式,可以用下面的语句获得建立表空间的DDL,也可以用数据泵工具导出
sys@ALMTEST> set long 999999
sys@ALMTEST> select dbms_metadata.get_ddl('TABLESPACE',tablespace_name) from dba_tablespaces;
DBMS_METADATA.GET_DDL('TABLESPACE',TABLESPACE_NAME)
--------------------------------------------------------------------------------
CREATE TABLESPACE "SYSTEM" DATAFILE
'/almtest/oracle/oradata/almtest/system01.dbf' SIZE 524288000
AUTOEXTEND ON NEXT 10485760 MAXSIZE 32767M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT MANUAL
ALTER DATABASE DATAFILE
'/almtest/oracle/oradata/almtest/system01.dbf' RESIZE 775946240
CREATE UNDO TABLESPACE "UNDOTBS1" DATAFILE
'/almtest/oracle/oradata/almtest/undotbs01.dbf' SIZE 524288000
AUTOEXTEND ON NEXT 5242880 MAXSIZE 32767M
BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
ALTER DATABASE DATAFILE
'/almtest/oracle/oradata/almtest/undotbs01.dbf' RESIZE 34359721984
CREATE TABLESPACE "SYSAUX" DATAFILE
'/almtest/oracle/oradata/almtest/sysaux01.dbf' SIZE 524288000
AUTOEXTEND ON NEXT 10485760 MAXSIZE 32767M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO
ALTER DATABASE DATAFILE
'/almtest/oracle/oradata/almtest/sysaux01.dbf' RESIZE 4949278720
CREATE TEMPORARY TABLESPACE "TEMP" TEMPFILE
'/almtest/oracle/oradata/almtest/temp02.dbf' SIZE 2097152000,
'/almtest/oracle/oradata/almtest/temp01.dbf' SIZE 34358689792
AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1048576
CREATE TABLESPACE "USERS" DATAFILE
'/almtest/oracle/oradata/almtest/users01.dbf' SIZE 125829120
AUTOEXTEND ON NEXT 1310720 MAXSIZE 32767M,
'/almtest/oracle/oradata/almtest/users02.dbf' SIZE 1048576000
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO
ALTER DATABASE DATAFILE
'/almtest/oracle/oradata/almtest/users01.dbf' RESIZE 6157762560
CREATE TABLESPACE "ALM" DATAFILE
'/almtest/oracle/oradata/almtest/alm01.dbf' SIZE 5368709120,
'/almtest/oracle/oradata/almtest/alm02.dbf' SIZE 5368709120,
'/almtest/oracle/oradata/almtest/alm03.dbf' SIZE 5368709120
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO
CREATE TABLESPACE "EAM" DATAFILE
'/almtest/oracle/oradata/almtest/EAM.dbf' SIZE 10485760000
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO
CREATE TABLESPACE "ARCH" DATAFILE
'/almtest/oracle/oradata/almtest/ARCH.dbf' SIZE 1048576000
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO
CREATE TABLESPACE "RECCAT" DATAFILE
'/almtest/oracle/oradata/almtest/reccat01.dbf' SIZE 524288000
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 131072 SEGMENT SPACE MANAGEMENT AUTO
9 rows selected.
sys@ALMTEST>
段
占用存储空间的每一个数据库对象都会存储在一个段中,有索引段、临时段、聚簇段、回滚段等。
段的管理方式手动管理(Freelists)和自动管理(ASSM).
pctfree
其中pctfree是一个判定标杆,当一个区块的占用空间超过这个值的时候,这个区块就不能被使用了。但是可以update和delete。
用这个方式会造成段头的竞争,因为都得靠读取段头信息来获得段的使用情况。
区
段由区组成,区是逻辑上连续分配的一些空间。区段可以跨越数据文件,大小不固定。
其中区的管理方式有字典管理(dictonary)和本地管理(local),用来表示哪些是用的,哪些是没使用过的。用如下sql查看:
sys@ALMTEST> select TABLESPACE_NAME, EXTENT_MANAGEMENT from dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN
------------------------------ ----------
SYSTEM LOCAL
UNDOTBS1 LOCAL
SYSAUX LOCAL
TEMP LOCAL
USERS LOCAL
ALM LOCAL
EAM LOCAL
ARCH LOCAL
RECCAT LOCAL
9 rows selected.
字典管理(Dictionayr Management)
字典管理的弊端是将可用区块和使用的区块放到两个SYSTEM表空间中的两个表中,可以用dba_free_space 和dba_extents观测,这样的管理方式比较低端,用sql进行管理,性能较差。建表的时候用 EXTENT MANAGEMENT DICTIONNARY 指定即可表示为用字典管理方式管理表空间。看下面的两个sql,都报错了是因为本地管理与字典管理相互转换的前提都必须是system表空间必须是字典管理的。
sys@ALMTEST> exec dbms_space_admin.tablespace_migrate_to_local('RECCAT');
BEGIN dbms_space_admin.tablespace_migrate_to_local('RECCAT'); END;
*
ERROR at line 1:
ORA-03245: Tablespace has to be dictionary managed, online and permanent to be able to migrate
ORA-06512: at "SYS.DBMS_SPACE_ADMIN", line 227
ORA-06512: at line 1
--创建失败,但是可以插入字典管理的表空间(表空间传输的需要)
sys@ALMTEST> CREATE TABLESPACE "TEST" DATAFILE '/almtest/oracle/oradata/almtest/test.dbf/test.dbf' SIZE 100M
2 EXTENT MANAGEMENT DICTIONARY;
CREATE TABLESPACE "TEST" DATAFILE '/almtest/oracle/oradata/almtest/test.dbf/test.dbf' SIZE 100M
*
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace
本地管理
先看一段sql:
CREATE SMALLFILE TABLESPACE "RECCAT" DATAFILE '/almtest/oracle/oradata/almtest/reccat01.dbf' SIZE 500M REUSE LOGGING EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K SEGMENT SPACE MANAGEMENT AUTO
CREATE SMALLFILE TABLESPACE "EAM" DATAFILE '/almtest/oracle/oradata/almtest/EAM.dbf' SIZE 10240M REUSE AUTOEXTEND ON NEXT 1024K MAXSIZE 10240M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
用EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K 一个位可以代表的具体数据区间,EXTENT MANAGEMENT LOCAL AUTOALLOCATE则表示一个位代表一个数据区间(system)。
sys@ALMTEST> select tablespace_name,extent_management,allocation_type from dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN ALLOCATIO
------------------------------ ---------- ---------
SYSTEM LOCAL SYSTEM
UNDOTBS1 LOCAL SYSTEM
SYSAUX LOCAL SYSTEM
TEMP LOCAL UNIFORM
USERS LOCAL SYSTEM
ALM LOCAL SYSTEM
EAM LOCAL SYSTEM
ARCH LOCAL SYSTEM
RECCAT LOCAL UNIFORM
9 rows selected.
块
区由块组成,是oracle中最小的分配单位了,常见大小有2、4、8、16、32KB,也可以是5、7、nKB,但是不常用。一个数据库中可以不大小不同的块,但是一个表空间中所有块的大小必须相同。
块由以下几部分组成:
- 首部 :存放块类型有关的信息,如表块、索引块;块上发生的事务活动和过去事务信息;块在磁盘是上的位置
- 表目录:一个块上可能存储了多个表的数据,因此需要这样一个表目录
- 行目录:包含行的描述信息,是一个指针数组指向数据部分的具体行,以上3部分称为块开销。
- 空闲空间:
- 数据 空间:
- 尾部