你的位置:首页 > 数据库

[数据库]表空间的管理


表空间是数据库的逻辑组织形式,在一个数据库中可以创建多个表空间。

表空间的主要作用是将不同用途的数据分离开来,以提高数据的安全性,并提高系统的性能。
表空间在数据库中起着非常重要的作用。

一方面,表空间在逻辑结构上由多个段组成,数据都存储在表空间的段中,另一方面,表空间在物理结构上对应着多个数据文件,数据库对象中的数据最终存储在这些数据文件中。
表空间的类型较多,根据不同的分类标准,将得到不同的分类结果。

根据存储数据类型的不同,表空间可分为系统表空间、UNDO表空间、临时表空间和用户表空间。
根据存储空间方式的不同,表空间可分为字典管理表空间和本地管理表空间。
根据是否支持大文件来划分,表空间可分为大文件表空间和小文件表空间。
表空间的管理主要涉及各种类型表空间的创建、删除、扩展、修改状态等。

表空间的结构

一个表空间由多个段组成,每个段可能代表一个数据库对象。

当用户创建表、索引、簇等数据库对象时,在表空间中将自动创建一个段,以存储该对象的数据。
一个段占用一个或多个区,当区的空间被写满后,段就会自动扩展。
在创建表空间时就需要指定区的分配方式

区管理方式

区管理方式指的是为一个数据库对象分配存储空间的方式,在创建表空间时需要指定区管理方式。
Oracle支持两种区管理方式,字典管理和本地管理
在创建字典管理的表空间时,需要指定若干存储参数,以后在这个表空间中创建数据库对象时,就按照这些存储参数为数据库对象分配所需要的区,当这些区被写满后,数据库服务器将按照存储参数为数据库对象分配新的区。
表空间的存储参数记录在数据字典中。
在创建字典管理的表空间时,可以指定以下几个存储参数:
INITIAL(初始) :指定第一个区的大小,即首先要为数据库对象分配的区的大小。
NEXT :指定下一个区的大小。
MINEXTENTS :为数据库对象分配的最少区的个数,默认值为1。
MAXEXTENTS : 最多为数据库对象分配的区个数。
PCTINCREASE :从第三个区开始,每一个区在前一个区的基础上增长的百分比。
在字典管理表空间中,区的分配和回收都是基于数据字典进行的。

当为数据库对象分配区时,需要从数据字典中查询存储参数,分配结束后,需要把分配的结果写入数据字典。
这样要在数据字典上执行很多的查询操作和DML操作,并且产生重做日志和回滚数据。
另外,由于数据库对象中的区大小不同,随着数据库服务器的运行,在段中将产生越来越的存储碎片

在本地管理表空间中,区的大小都是相同的。

在创建表空间时,可以通过参数指定统一的区大小,或者由数据库服务器根据实际情况自动指定区的大小。
与字典管理方式相比,本地管理方式有以下优点:
·区的分配和回收不再基于数据字典,从而避免了对数据字典的递归访问,也不会产生重做日志和回滚数据。
·所有区的大小都相同,这就减少了存储空间中的存储碎片。
·不需要合并表空间中的存储碎片,数据库服务器自动监视存储空间的使用情况,并合并相邻的空闲存储空间。
Oracle建议大家使用本地管理表空间。

在Oracle 11g的数据库中创建的表空间默认就是本地管理的,如SYSTEM表空间目前是字典管理的,可以通过下面的方式,调用PL/SQL程序包中的存储过程,把它转化为本地管理表空间:

EXECUTE DBMS_SPACE_ADMIN.tablespace_migrate_to_local('SYSTEM');

段管理方式

当用户向表中写入数据时,这些数据被写入表段中的空闲数据块中,服务器进程查找表中的空闲数据块,然后将数据写入数据块,最后还要修改数据块的状态
对于段空间管理,Oracle提供了两种方式,一种是手工管理,另一种是自动管理
手工管理段空间的方式是这样实现的:在每个头部都有一段保留空间,在保留空间中维护一个空闲列表,在这个列表中记录当前段中所有的空闲块
当用户向表中写数据时,服务器进程在这个空闲列表中查找足够数量的空闲块,将数据写入这些块。
如果一个块已经被写满了,这个块就从空闲列表中被删除
在查找空闲块的过程中为防止其他服务器进程使用同样的空闲块,服务器进程将对空闲列表加锁,只有空闲列表上的锁被释放后,其他服务器进程才可以在空闲列表中查找空闲块。
如果用户在某个表上的事务很频繁,那么空闲列表将成为延缓事务执行的瓶颈。
自动管理方式是Oracle 11g数据库默认采用的段管理方式。

这种管理方式是这样实现的:在每个段的头部有一个位图,在位图中记录当前段中每个数据块的状态用二进制数0和1表示数据块的状态,每个数据块在位图中只占一位
使用位图的好处首先是节省空间,其次,当用户向表中写入数据时,服务器进程只要扫描位图就可以查找空闲数据块,而且不需要对位图加锁
在创建表空间时,需要为表空间指定段空间管理方式。

数据文件

表空间中的所有数据都是以数据文件的形式存储在磁盘上的。

一个表空间包含一个或多个数据文件。
在创建表空间时,至少要为表空间指定一个数据文件。
如果表空间只包含一个数据文件,那么表空间中的数据将全部存储在这个数据文件中。

如果表空间中包含多个文件,表空间中的数据将以区为单位分布在各个数据文件中。
假设某个表空间中有三个数据文件,那么在该表空间中创建一个表时,表中的第一、四、七……个区将位于第一个数据文件,第二、五、八、……个区将位于第二个数据文件中,依此类推。

如果将数据文件存放在不同的磁盘上,那么用户在访问表空间中的数据时,可以同时读写多个数据文件,从而减少了磁盘读写的冲突次数。
当表空间中的存储空间被消耗完时,用户将无法再写入数据。

数据库管理员必须扩展表空间,为其分配新的存储空间。
可以向表空间中增加新的数据文件,也可以手工扩展现有的数据文件,还可以激活数据文件的自动扩展功能,使它能够自动扩展。

本地管理表空间的管理

本地管理表空间是Oracle 11g 中的默认表空间类型。

对这种表空间的管理主要涉及创建、删除、修改等操作。

本地管理表空间的创建

创建表空间的任务一般由SYS 用户完成,普通用户如果希望执行这样的操作,需要具有
CREATE TABLESPACE 系统权限。
在创建表空间时,需要指定表空间的区管理方式、段管理方式以及表空间所包含的数据文件。
在Oracle 11g 中,表空间的默认区管理方式是本地管理( LOCAL )。

例如,通过以下语句创建本地管理表空间ts1 :

CREATE TABLESPACE ts1
DATAFILE 'C:\Users\john\Desktop\tbs\ts1_1.dbf' SIZE 1M
EXTENT MANAGEMENT local
SEGMENT SPACE MANAGEMENT auto;

注意:DATAFILE实际SIZE 并不是1M,因为EXTENT的大小是数据块的整数倍。

在上面的语句中, EXTENT MANAGEMENT LOCAL用于指定表空间的区管理方式为本地管理,这是可以省略的,因为表空间默认的区管理方式就是本地管理。
但是如果在CREATE语句中指定了AUTOALLOCATE或者UNIFORM SIZE ,那么EXTENT MANAGEMENT LOCAL是不能省略的
AUTOALLOCATE表示这个表空间中的区大小由数据库服务器根据实际情况自动指定,默认为64KB 。
如果在这个表空间中创建可变大小的数据库对象,而且这个对象需要大小不同的区,那么AUTOALLOCATE是一种很好的选择。
如果希望控制表空间中区的使用,则通过UNIFORM SIZE指定统一的区大小。
SEGMENT SPACE MANAGEMENT用于指定表空间中段空间的管理方式,目前有两种可选方式,即AUTOMANUAL
AUTO 使用位图的方式跟踪段中每个数据块的状态,而MANUAL方式是通过空闲列表来记录每个段中的空闲块的。
由于AUTO使段空间管理更加高效,所以Oracle建议为表空间指定这种段管理方式,而且这也是默认方式。

DATAFILE用于指定表空间所包含的数据文件及其大小,一个表空间包含一个或多个数据文件。
在UNIX/Linux系统中,为了在某个目录下创建数据文件,需要保证操作系统中的oracle用户对该目录具有写权限。

下面的语句用于创建表空间TS2 ,表空间中区的统一大小为256KB 。

如果没有通过SIZE子句指定大小,则采用默认值1MB 。

CREATE TABLESPACE ts2
DATAFILE 'C:\Users\john\Desktop\tbs\ts2_2.dbf' SIZE 1M
EXTENT MANAGEMENT local UNIFORM SIZE 256K
SEGMENT SPACE MANAGEMENT auto;

数据库中的数据块大小通过初始化参数DB_BLOCK_SIZE指定,通过这个参数指定的数据块称为标准块。
表空间中的数据块默认也采用标准块大小

如果希望在数据库中定义其他大小的非标准块,那么在创建表空间时需要指定它所采用的数据块大小。
例如,通过下面的语句创建的表空间具有2KB 的数据块:

CREATE TABLESPACE ts3
DATAFILE 'C:\Users\john\Desktop\tbs\ts3_3.dbf' SIZE 1M,
'C:\Users\john\Desktop\tbs\ts3_4.dbf' SIZE 1M
BLOCKSIZE 2K;

非标准块中的数据是不能被读到一般的数据库高速缓存中的。

为了能够访问这种表空间中的数据,在创建表空间之前,需要通过初始化参数DB_nK_CACHE_SIZE在内存中为非标准块定义相应的数据库高速缓存,缓存也是由许多缓冲区组成,缓冲区的大小与非标准块大小相同。
例如:

ALTER SYSTEM SET db_2k_cache_size=48M;

表空间信息的查询

与表空间有关的相关信息可以从数据字典中获得,与表空间有关的数据字典视图有两个,dba_tablespaces和dba_data_files
从数据字典dba_tablespaces 中可以获得表空间的基本信息

下面是有关数据字典视图dba_tablespaces的信息:

DBA_TABLESPACES describes all tablespaces in the database.

Related View


USER_TABLESPACES describes the tablespaces accessible to the current user. This view does not display the PLUGGED_IN column.

ColumnDatatypeNULLDescription

TABLESPACE_NAME

VARCHAR2(30)

NOT NULL

Name of the tablespace

BLOCK_SIZE

NUMBER

NOT NULL

Tablespace block size (in bytes)

INITIAL_EXTENT

NUMBER

 

Default initial extent size (in bytes)

NEXT_EXTENT

NUMBER

 

Default incremental extent size (in bytes)

MIN_EXTENTS

NUMBER

NOT NULL

Default minimum number of extents

MAX_EXTENTS

NUMBER

 

Default maximum number of extents

MAX_SIZE

NUMBER

 

Default maximum size of segments (in Oracle blocks)

PCT_INCREASE

NUMBER

 

Default percent increase for extent size

MIN_EXTLEN

NUMBER

 

Minimum extent size for this tablespace (in bytes)

STATUS

VARCHAR2(9)

 

Tablespace status:

  • ONLINE

  • OFFLINE

  • READ ONLY

CONTENTS

VARCHAR2(9)

 

Tablespace contents:

  • UNDO

  • PERMANENT

  • TEMPORARY

LOGGING

VARCHAR2(9)

 

Default logging attribute:

  • LOGGING

  • NOLOGGING

FORCE_LOGGING

VARCHAR2(3)

 

Indicates whether the tablespace is under force logging mode (YES) or not (NO)

EXTENT_MANAGEMENT

VARCHAR2(10)

 

Indicates whether the extents in the tablespace are dictionary managed (DICTIONARY) or locally managed (LOCAL)

ALLOCATION_TYPE

VARCHAR2(9)

 

Type of extent allocation in effect for the tablespace:

  • SYSTEM

  • UNIFORM

  • USER

PLUGGED_IN

VARCHAR2(3)

 

Indicates whether the tablespace is plugged in (YES) or not (NO)

SEGMENT_SPACE_MANAGEMENT

VARCHAR2(6)

 

Indicates whether the free and used segment space in the tablespace is managed using free lists (MANUAL) or bitmaps (AUTO)

DEF_TAB_COMPRESSION

VARCHAR2(8)

 

Indicates whether default table compression is enabled (ENABLED) or not (DISABLED)

Note: Enabling default table compression indicates that all tables in the tablespace will be created with table compression enabled unless otherwise specified.

RETENTION

VARCHAR2(11)

 

Undo tablespace retention:

  • GUARANTEE - Tablespace is an undo tablespace withRETENTION specified as GUARANTEE

    RETENTION value of GUARANTEE indicates that unexpired undo in all undo segments in the undo tablespace should be retained even if it means that forward going operations that need to generate undo in those segments fail.

  • NOGUARANTEE - Tablespace is an undo tablespace with RETENTION specified as NOGUARANTEE

  • NOT APPLY - Tablespace is not an undo tablespace

BIGFILE

VARCHAR2(3)

 

Indicates whether the tablespace is a bigfile tablespace (YES) or a smallfile tablespace (NO)

PREDICATE_EVALUATION

VARCHAR2(7)

 

Indicates whether predicates are evaluated by host (HOST) or by storage (STORAGE)

ENCRYPTED

VARCHAR2(3)

 

Indicates whether the tablespace is encrypted (YES) or not (NO)

COMPRESS_FOR

VARCHAR2(30)

 

Default compression for what kind of operations:

  • BASIC

  • ADVANCED

  • QUERY LOW

  • QUERY HIGH

  • ARCHIVE LOW1

  • ARCHIVE HIGH1

  • NULL

DEF_INMEMORY

VARCHAR2(8)

 

Indicates whether the In-Memory Column Store (IM column store) is by default enabled (ENABLED) or disabled (DISABLED) for tables in this tablespace

DEF_INMEMORY_PRIORITY2

VARCHAR2(8)

 

Indicates the default priority for In-Memory Column Store (IM column store) population for this tablespace. Possible values:

  • LOW

  • MEDIUM

  • HIGH

  • CRITICAL

  • NONE

  • NULL

DEF_INMEMORY_DISTRIBUTE2

VARCHAR2(15)

 

Indicates how the IM column store is distributed by default for this tablespace in an Oracle Real Application Clusters (Oracle RACE) environment:

  • AUTO

  • BY ROWID RANGE

  • BY PARTITION

  • BY SUBPARTITION

DEF_INMEMORY_COMPRESSION2

VARCHAR2(17)

 

Indicates the default compression level for the IM column store for this tablespace:

  • NO MEMCOMPRESS

  • FOR DML

  • FOR QUERY [ LOW | HIGH ]

  • FOR CAPACITY [ LOW | HIGH ]

  • NULL

DEF_INMEMORY_DUPLICATE2

VARCHAR2(13)

 

Indicates the duplicate setting for the IM column store in an Oracle RAC environment:

  • NO DUPLICATE

  • DUPLICATE

  • DUPLICATE ALL


例如,通过下面的SELECT语
句可以获得表空间的名称、区管理方式、段管理方式、内容类型、状态等信息: