ORACLE表空间管理一二谈

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,但是不常用。一个数据库中可以不大小不同的块,但是一个表空间中所有块的大小必须相同。

块由以下几部分组成:

  1. 首部 :存放块类型有关的信息,如表块、索引块;块上发生的事务活动和过去事务信息;块在磁盘是上的位置
  2. 表目录:一个块上可能存储了多个表的数据,因此需要这样一个表目录
  3. 行目录:包含行的描述信息,是一个指针数组指向数据部分的具体行,以上3部分称为块开销。
  4. 空闲空间:
  5. 数据 空间:
  6. 尾部
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贤时间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值