表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,它作为数据库与实际存放数据的容器之间的中间层,用于指明数据库中数据的物理位置。任何数据库的创建都必须显式或隐式的为其指定表空间,且数据库中的所有数据都位于表空间中。
用户可以根据硬件环境以及成本等需求,通过指定建立在不同容器上的表空间来自由选择数据的物理存储位置。同时由于备份和恢复可以在表空间级别执行,用户能够进行更多粒度的备份恢复控制。
理解表空间前先理解容器。
容器(Container)
容器是物理存储设备,可以通过目录名,设备名或文件名进行标识。事实上,这也正是三种容器类型。设备容器(如磁带等)和文件容器被同等看待,通常直接将其理解为数据文件(磁盘存储内部结构中有介绍,数据文件中包含若干Extent。)。系统管理表空间只能使用目录容器,数据库管理表空间只能使用设备容器和文件容器。
容器被分配给某个表空间,单个表空间可以使用多个容器,但容器只能属于一个表空间。容器通常位于本地磁盘上,某些远程网络设备或文件也能作为表空间的容器,但由于网络延迟与可靠性方面的原因,远程容器对数据库安全与性能会造成影响,因此不建议使用远程容器。
DB2数据库系统的表空间有三种管理类型:
系统管理表空间(SMS,System-Managed Space)
SMS表空间由操作系统的文件系统管理器分配并管理。在这种表空间中,数据存储空间完全由操作系统管理,SMS表空间能够使用的唯一容器是目录容器,SMS表空间可以定义多个容器,目录容器可以根据需要增加大小,因此SMS表空间的大小是可以动态增加的。但是一旦SMS表空间创建,就不能再为表空间增加或删除容器了。SMS表空间中通常包含多个文件,这些文件代表了存储在文件系统空间中的表对象,比如表数据,表索引,表大对象都是单独占用一个或若干个文件的。一旦为表指定了SMS表空间,那么表中的数据就不允许分开存储,即表的常规数据,索引,大对象数据不能位于不同的表空间中。在DB2 V9之前的数据库版本中,创建数据库(创建数据库时如果不指定表空间则会默认创建3个表空间)或表空间的默认类型就是SMS表空间。另外,只有DB2数据库允许有系统管理表空间,Oracle数据库的表空间都是数据库管理的,不存在系统管理表空间。
举个SMS表空间的简单例子:创建一个以containers1目录为容器的SMS表空间MYSPACE。再创建一张表TEST,其常规数据,索引,大对象均位于MYSPACE表空间中(如果三者指定不同的表空间则表创建会失败,事实上,指定了常规数据的表空间为SMS表空间后,索引和大对象的表空间也就默认了)。表创建完成后,物理磁盘上的数据是这样的:
其中SQL00002.DAT数据文件存放表中的常规数据;SQL00002.DTR数据文件存放由于重组,表连接等产生的临时数据。SQL00002.INX数据文件存放表中的索引。还有LF后缀的存放LONG VARCHAR或LONG VARGRAPHIC数据,LB后缀的存放BLOB,CLOB和DBLOB数据,LBA后缀的存放LB后缀文件的分配和可用空间信息等。另外顺便说下图中的SQLTAG.NAM文件。事实上每一个容器都有一个TAG数据结构用于标识容器属于哪一个实例的哪一个数据库的哪一个表空间。对于DMS表空间的容器,TAG位于第一个Extent内,对于SMS表空间的容器,则是以SQLTAG.NAM文件的形式存在。
使用SMS表空间的每一个表都会在表空间的容器(也就是目录)下对应产生一系列的SQL*.DAT ,SQL*.INX等文件。表和其对应的文件的信息存放在SYSIBM.SYSTABLES这个系统编目表中,每个表对应一个FID(表所在的文件组编号)和TID(表所在的表空间编号),可以使用查询语句进行查询:
Select fid,tid, name from sysibm.systables where;
数据库管理表空间(DMS,Database-Managed Space)
DMS表空间由数据库管理系统(DBMS)自己管理控制,本质上讲,这种类型的表空间是为了最大程度满足数据库管理器的需要而设计并实现的一种特定目的的文件系统。DMS表空间是由有限数量的容器所组成的,DMS表空间可以使用的容器有设备容器和文件容器,这些容器的空间都是预先分配的且不允许修改大小的,但是与SMS表空间不同的是,DMS表空间允许添加容器。也就是说,SMS表空间和DMS表空间分别通过扩大容器大小和增加容器数量的方式实现表空间大小的增加。DMS表空间创建时需要手动指定一个或多个容器。以文件为容器的表空间创建完以后就是一个单独的文件。使用DMS表空间的表的数据可以分开存储,即为常规数据,索引和大对象数据指定不同的DMS表空间。
DMS自动存储表空间(Automatic Storage DMS)