上午刚刚上班,突然被拉到一个客户群里,咨询DB2数据库怎么关闭表空间自动增长,看到这个问题,我想简单啊,和oracle一样,一条命令就行了,然后我就把这个命令发给客户了,过了一个客户说执行成功了,但是增加表空间大小还是不行,我就想到了DB2数据库空间的特殊性,根据不通类型的表空间增加表空间大小的方式也不一样,下面请跟着我的步伐一起了解下DB2表空间的类型,及如何维护管理。

DB2表空间简介:

管理方式:SMS,DMS,自动存储管理

存储类型:系统表空间,数据表空间,系统临时表空间,用户临时表空间。

DB2数据库在建库的时候会自动创建三个表空间

系统表空间(system   tablespace),用来存储系统表,也就是数据字典的信息,一个数据库只能有一个系统表空间;

临时表空间(temporarytablespace),用来保存语句执行时产生的中间临时数据,如join,排序等操作都可能产生一些临时数据;

用户表空间(user     tablespace),用来存储表,索引,大对象等数据;

下面我们就详细的看看怎么对DB2的表空间进行管理。

创建表空间

在创建表空间前,还需要创建一个缓冲池

db2"CREATE BUFFERPOOL BP32K SIZE 10000 PAGESIZE 32K"

问:什么是缓冲池呢?

答:缓冲池(),Bufferpool是数据库最重要的内存区,用来缓存数据,提高性能。创建缓冲池时,size表示页数,pagesize表示大小,size*pagesize就是缓冲池的内存大小。

在建库的时候,DB2会自动创建一个名为IBMDEFAULEBP的缓冲池,如果在建库时候没有指定pagesize那么IBMDEFAULEBP的默认pagesize是4K。

每个表空间都有一个Bufferpool与之对应,多个表空间可以共享一个Bufferpool,但要求Bufferpool的pagesize大小必须与表空间的pagesize匹配,否则无法创建。缓冲池创建完成过后,再继续创建表空间。

创建DMS管理的数据表空间

db2 "CREATE LARGE TABLESPACE tbs_data  PAGESIZE 32K MANAGED BY DATABASE USING (FILE '/data1/data/cont0' 5M,FILE '/data1/data/cont1' 5M) 
EXTENTSIZE 32 PREFETCHSIZE automatic BUFFERPOOL BP32K NO FILE SYSTEM CACHING"

MANAGEDBY DATABASE表示表空间的分配和管理由DB2负责,即DMS(database-managedspace),Using指定表空间的容器,DMS支持的容器类型是文件(file)和裸设备(rawdevice)。

DMS类型的表空间在创建时即分配空间,创建后可通过命令对表空间容器进行增删改。对于数据来说,建议用DMS管理。

NOFILE SYSTEM CACHING 该选项的目的是关闭文件系统缓存原因是DB2使用Bufferpool缓存数据,为了减小额外的开销,不必使用文件缓存,这个选项是DB29.5 版本的默认选项。

注意:大对象()数据的获取直接通过磁盘,无法通过Bufferpool缓存,因为可以考虑将大对象创建在独立的表空间上,并使用filesystem caching 选项。

创建SMS管理的临时表空间

db2"CREATE TEMPORARY TABLESPACE tbs_temp PAGESIZE 32K MANAGEDBY SYSTEM USING('/data1/data/tbs_temp') BUFFERPOOL BP32K"

系统临时表空间用来存储DB2产生的一些临时数据。

MANAGEDBY SYSTEM表示空间的分配和管理由操作系统负责,即SMS(system-managedspace)Using指定表空间的容器,

SMS支持的容器类型只能是目录,无需指定大小,只要路径所属的文件系统有空间,就可以被表空间使用。

SMS的优点是比较容易管理,缺点是性能比DMS差一些,大概差5%~10%左右,对于临时表空间来说,建议使用SMS管理。

创建SMS管理的用户临时表空间

db2"CREATE USER TEMPORARY TABLESPACE tbs_user_temp PAGESIZE 32KMANAGED BY SYSTEM USING ('/data1/data/tbs_usertemp') BUFFERPOOLBP32K"

与系统表空间类似,用户临时表空间也用保存临时数据,但他存储的是用户自定义的临时表,对于用户临时表空间来说,建议使用SMS管理。

创建自动存储管理(Automatic Storage)的表空间

创建数据页为32kb的自动存储管理表空间

createtablespace tbs_index pagesize 32k bufferpool bp32k

创建初始大小为100MB,增量为100MB,最大大小为100GB的自动存储管理表空间

createtablespace tbs_data2 initialsize 100M increasesize 100M maxsize 100G

上面这种直接创建的自动存储的表空间,他的容器路径在哪里呢,我们查看下

db2"SELECT substr(TBSP_NAME,1,30) as  TBSP_NAME,STORAGE_GROUP_NAME FROM table (MON_GET_TABLESPACE('', -2))"

db2 表空间降低高水位 db2表空间自动增长_数据

db2"SELECT VARCHAR(STORAGE_GROUP_NAME, 30) AS STOGROUP,STORAGE_GROUP_ID, VARCHAR(DB_STORAGE_PATH, 40) AS STORAGE_PATH FROMTABLE(ADMIN_GET_STORAGE_PATHS('',-1)) AS T"

db2 表空间降低高水位 db2表空间自动增长_db2 表空间降低高水位_02

可以看出不指定自动存储的group情况下,会使用系统默认的自动存储空间,如果在创建数据库的时候没有指定自动存储的路径,默认路径就会在实例用户的文件下。

那该如何把自动存储的表空间放在规划好的空间呢

需要我们先创建一个STOGROUP

db2"CREATE STOGROUP sg ON  '/data1/path1', '/data1/path2' "

在添加表空间的时候指定对应的组就行了

db2"create tablespace tbstest managed by automatic storage USINGSTOGROUP sg"

注意:以上两个命令在V9.7版本中是不存在的

修改表空间

上面扯了一堆,把DB2的表空间类型和创建方式讲了一下,然后我们回到最开始的问题,客户的问题,如何关闭表空间自动增长的问题,看着这个问题,直接一条命令发给了客户,客户执行后说没有关闭啊,我扩展表空间还是扩展不了啊。

db2"alter tablespace tablespacename  autoresize no"

通过上面的命令就可以把表空间的自动增长关了,但是客户说没起效果,就让客户查了下表壳空间的信息。

db2 表空间降低高水位 db2表空间自动增长_with as 与临时表的区别_03

通过查看发现对应表空间的自增长已经是NO了啊,然后就看到这个表空间的AS类型是自动存储的表空间。然后客户通过非自动存储表空间扩展的方式来的增加表空间大小的,这肯定不对啊。那下面我们就详细说下DMS管理的表空间在自动存储和非自动存储下怎么扩展表空间。

自动存储表空间

DB2是个很有意思的数据库,不同版本之间一些函数,命令等会有差异。在V9.7版本中自动存储的表空间通过以下命令来扩展。

db2 "alter database sample  add storage on '/home/db2inst1/test'"
db2 "alter tablespace USERSPACE1 rebalance"

扩展好自动存储路径后,通过对表空间进行重新平衡,使表空间使用新的路径,在V10以上的版本中,通过一下命令扩展。

db2"alter STOGROUP sg add '/data1/path2'"

找到对应表空间所在存储组,然后对该组进行空间添加。

非自动存储表空间

非自动扩展的表空间,在扩展的时候需要添加容器或者扩展容器,容器类型也分为文件和裸设备两种:

DMS+文件

如果表空间容器已经没有剩余空间,可通过add选项增加容器,当然必要的情况下也可以通过drop选项删除容器。对于add和drop操作会在容器间发生数据重新平衡(rebalance)。如果数据量很大,rebalance时间有可能很久,对系统可能造成很大影响。

altertablespace tbs_data add(file '/database/tbs_data/cont2' 100m)

如果使用beginnew strip set选项则会在现有容器空间用完时使用新增容器,该选项使数据不会在容器间做rebalance,但会造成数据偏移。

altertablespace tbs_data begin new stripe set (file'/database/tbs_data/cont3' 100m)

扩展:

如果DMS表空间对应的存储中还有未分配空间,可通过altertablespace的extend、reduce或resize选项扩展已有表空间容器的大小。其中extend用来扩展容器大小,reduce用来缩减已有容器大小,resize重新设定容器大小。对于reduce和resize,需确保更改后的表空间有足够空间,否则DB2拒绝操作。

altertablespace tbs_data extend (file '/database/tbs_data/cont0' 10M)

DMS+裸设备

新增

db2 "alter tablespace tbs_data  ADD ( Device '/dev/rlv_8g_308' 8190M ) "
db2 "alter tablespace TBS_DATA begin new stripe set ( Device '/dev/rlv_8g_108' 8190M)"

扩展

db2"alter tablespace tbs_data  extend ( Device '/dev/rlv_8g_308'8190M )"

以上就是我对DB2表空间在运维过程中总结的一些经验,希望可以帮助到大家,如有疑问欢迎一起讨论。