上午刚刚上班,突然被拉到一个客户群里,咨询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"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"
可以看出不指定自动存储的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"
通过上面的命令就可以把表空间的自动增长关了,但是客户说没起效果,就让客户查了下表壳空间的信息。
通过查看发现对应表空间的自增长已经是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表空间在运维过程中总结的一些经验,希望可以帮助到大家,如有疑问欢迎一起讨论。