实例管理
1.创建实例
什么是实例?
DB2的实例就是一组进程和一组共享内存。可把实例想象为一个数据库的集合,共同运行在一个逻辑服务单元中(同一个端口)。在一个系统中,用户可以创建若干个实例,每一个实例使用各自不同的端口服务于远程应用程序。每一个实例可以包含若干个数据库。
创建实例
创建服务端实例命令:db2icrt -a server -s ese -p 55555 -u db2fenc db2inst
上述命令创建了实例名为db2inst的服务端实例,实例的端口为55555,实例的受防护用户为db2fenc。
受防护的用户
- 表示用来运行受防护用户定义的函数 (UDF) 和受防护存储过程的用户的名称,受防护的用户用于在 DB2 数据库所使用的地址空间之外运行用户定义的函数(UDF)和存储过程(UDP)。缺省用户为 db2fenc1,缺省组为 db2fadm1。如果不需要此安全级别(例如,在测试环境中),那么可以使用实例所有者作为受防护的用户
- 如果您正在 DB2 客户机上创建实例,那么此标志不是必需的。
创建客户端实例命令:db2icrt -s client ark
上述命令创建了实例名为ark的客户端实例。
2. 启动/停止/列出实例
- 启动实例。实例创建后,需要通过db2start命令启动才能工作。在UNIX平台下,在实例用户环境下启动实例是:
db2start
- 停止实例。停止实例的命令是:
db2stop
如果当前实例下某数据库有应用连接,则db2stop会报错,这时可通过db2 force applications all
把所有应用连接断开,或通过db2stop force
强制停止实例。 - 列出实例。可以通过
db2ilist
查看某个DB2版本下有哪些实例。
实例停止不了的问题?
当遇到db2stop force
无法停止,而db2start
也无法启动的问题,在UNIX/LINUX下,可通过db2_kill
强制终止所有分区上执行的进程,然后执行ipcclear
清理IPC资源,当重新启动数据库时,DB2会做崩溃恢复。
3. 更新实例
实例更新命令是db2iupdt
,一般在打补丁或版本升级时使用。db2iupdt
命令需要root用户执行,执行前需要首先停止实例。
4. 删除实例
删除实例的命令是db2idrop
,使用root用户执行,删除前必须停止实例。注意:删除实例并不会删除实例下的数据库。
1. db2stop force
2. cd /opt/ibm/db2/V9.7/instance
3. ./db2idrop db2inst
5. 实例参数
每个实例都有一个配置参数文件用于控制实例相关的参数,如诊断路径,监控开关,安全相关的控制及服务端口号等。通过db2 get dbm cfg
命令查看实例参数,以下对一些重要的参数进行来标注:
! 实例参数1
! 实例参数2
! 实例参数3
数据库管理
1.数据库结构
创建完实例后,就可以创建数据库,一个实例可以包含多个数据库,但一个数据库只能归属于一个实例。每个数据库是由一组对象构成的,如表,视图,索引 等。表是二维结构,由一些行和列构成,表数据存放在表空间里,表空间是数据库的逻辑存储层,每个数据库包含多个表空间,每个表空间只能归属于一个数据库。 从实例->数据库->表空间->表构成了DB2的逻辑层次关系,从物理存储上,每个表空间由一个或多个容器构成,容器映射到物理存储, 容器可以是目录,也可以是文件或裸设备,每个容器只能属于一个表空间。根据数据的管理方式,表空间分为系统管理(SMS)和数据库管理(DMS)。 DB2将表和索引数据存在页里(PAGE),页是DB2最小的物理分配单元,表中每行数据只能包含在一页,不能跨页。DB2支持的页大小共4 种:4K,8K,16K和32K,假定一行数据大小是20K,那么需要的页的大小是32K。 每个表空间是由一个或多个容器构成的,表空间仅仅是逻辑存储层,具体的数据是存在容器里。容器是由多个extent构成的。 表空间->容器->extent->page就构成了DB2的存储模型。
2.创建数据库
db2 "create database zdb automatic storage yes on /db2auto dbpath on '/db2path' using codeset utf-8 territory cn collate using system";
DBPATH ON : 表示数据库创建目录
USING CODESET codeset TERRITORY territory : 表示数据库编码集(codeset)和区域(territory)。数据库一旦创建,编码就无法改变。
3.删除数据库
db2 drop database
表空间管理
缓冲池了解
创建完数据库后,就需要我们来创建表空间了。在创建表空间前,我们先了解下缓冲池。
缓冲池指的是从磁盘读取表和索引数据时,数据库管理器分配的用于高速缓存这些表或索引数据的主存储器区域。每个 DB2 数据库都必须具有一个缓冲池。
每个新数据库都定义了一个称为 IBMDEFAULTBP 的缺省缓冲池。可以使用 CREATE BUFFERPOOL、DROP BUFFERPOOL 和 ALTER BUFFERPOOL 语句来创建、删除和修改缓冲池。SYSCAT.BUFFERPOOLS 目录视图访问数据库中所定义的缓冲池的信息(具体参数可baidu or google)。
首次访问表中的数据行时,数据库管理器会将包含该数据的页放入缓冲池中。这些页将一直保留在缓冲池中,直到关闭数据库或者其他页需要使用某一页所占用的空间为止。缓冲池中的页可能正在使用,也可能没有使用,它们可能是脏页,也可能是干净页:
- 正在使用的页就是当前正在读取或更新的页。为了保持数据一致性,数据库管理器只允许一次只有一个代理程序更新缓冲池中的给定页。如果正在更新某页,那么它正在内一个代理程序互斥地访问。如果正在读取该页,那么多个代理程序可以同时读取该页。
- “脏”页包含已更改但尚未写入磁盘的数据。
- 将一个已更改的页写入磁盘之后,它就是一个“干净”页,并且可能仍然保留在缓冲池中。
简单点说:缓冲池是把存储在磁盘中的数据缓存起来,便于我们访问数据,提高应用程序对数据库的访问速度。
缓冲池和表空间关系
- 每个表空间都与一个特定的缓冲池相关。IBMDEFAULTBP 是缺省缓冲池。要使另一个缓冲池与表空间相关,那么该缓冲池必须存在并且它们具有相同的页大小。关联是在使用 CREATE TABLESPACE 语句创建表空间时定义的,但以后可使用 ALTER TABLESPACE 语句更改此关联。
- 缓冲池页大小。缺省缓冲池的页大小是在使用 CREATE DATABASE 命令时设置的。此缺省值表示所有将来 CREATE BUFFERPOOL 和 CREATE TABLESPACE 语句的缺省页大小。如果在创建数据库时不指定页大小,那么缺省页大小是 4 KB。
注: 如果确定数据库需要 8 KB、16 KB 或 32 KB 的页大小,那么必须至少定义一个具有相匹配的页大小并且与数据库中的表空间相关联的缓冲池。
创建缓冲池db2 "create bufferpool bp32k size 10000 pagesize 32k"
创建一个名为bp32k的缓冲池,包含10000页,页大小为32k。
建立数据库时,DB2会创建三个默认的表空间。
- 系统表空间(system tablespace),用来存储系统表,也就是数据字典的信息,一个数据库只能有一个系统表空间
- 临时表空间(temporary tablespace),用来保存语句执行时产生的中间临时数据,如join,排序等操作都可能产生一些临时数据
- 用户表空间(user tablespace),用来存储表,索引,大对象等数据
- 只有建库时启用了automatic storage yes,表空间才支持自动存储管理
- 创建缓冲池时,size表示页数,pagesize表示页大小,size*pagesize就是缓冲池的内存大小
2.表空间创建
#!/bin/bash # connect to db db2 connect to zdb; DMS="managed by database"; STMP_TBSP="temporary tablespace"; UTMP_TBSP="user temporary tablespace"; LARG_TBSP="large tablespace"; # 关闭文件系统缓存,减少系统开销,因为已使用bufferpool缓存数据 NFSC="no file system caching"; db2 "create $LARG_TBSP tbs_dat pagesize 32k $DMS using(FILE '/db2tbsp/zdb/dat_1' 10240M) bufferpool bp32k $NFSC"; db2 "create $LARG_TBSP tbs_idx pagesize 32k $DMS using(FILE '/db2tbsp/zdb/idx_1' 5120M) bufferpool bp32k $NFSC"; db2 "create $STMP_TBSP tbs_tmp pagesize 32k $DMS using(FILE '/db2tbsp/zdb/tmp_1' 5120M) bufferpool bp32k $NFSC"; db2 "create $UTMP_TBSP tbs_utmp pagesize 32k $DMS using(FILE '/db2tbsp/zdb/utmp_1' 5120M) bufferpool bp32k $NFSC";
3.表空间查看
常用的表空间监控方法:
# 显示每个表空间的最核心的信息 简单,直观
db2 list tablespaces [show detail]
# 显示表空间容器的相关信息
db2 list tablespace containers for [show detail]
# 显示表空间的配置信息、使用情况和容器信息
db2pd -d tablespaces
# 显示的信息比list tablespaces更全面,比如是否启用了自动存储功能,以及表空间map信息
db2 get snapshot for tablespaces on
# 通过查询管理视图 来查看表空间信息
db2 "select * from sysibmadm.snaptbsp" db2 "select * from sysibmadm.snapcontainer"
4.表空间修改
表空间更改。对于DMS表空间,提供了Add用来增加新的容器,Drop删除容器,Extend用来扩展已有容器大小,Reduce用来缩减已有容 器大小,Resize重新设定容器大小。对于Add和Drop操作,表空间容器间会发生数据重新平衡(Rebalance)。对于Reduce和 Resize操作,需要确保更改后的表空间容器有足够的空间,否则DB2会拒绝该操作。当遇到DMS表空间满的情况时,根据存储空间和对运维的影响,有以 下三种方案:
-
如果表空间容器对应的存储中还有未分配空间,可通过alter tablespace的extend或resize选项扩展已有表空间容器的大小。下例是在每个容器上扩展了50GB:
db2 "alter tablespace tbs_dat extend (file '/db2tbsp/zdb/dat_1' 10240M , file /db2tbsp/zdb/dat_2' 50G ) "
-
如果表空间容器对应的存储中没有剩余空间时,可通过alter tablespace的add选项增加新的容器。需要注意的是:通过add增加容器会在容器间进行数据Reblance,即数据重新平衡。如果数据量很 大,Reblance的时间会很长,对系统性能会造成很大影响。下例增加一个新容器,表空间发生reblance
db2 "alter tablespace tbs_dat add (file '/db2tbsp/zdb/dat_3' 50G ) "
-
通过alter tablespace begin new stripe set选项。Begin new stripe set选项是当已有容器使用完后,再使用新增加的容器。
db2 "alter tablespace tbs_dat begin new stripe set (file '/db2tbsp/zdb/dat_3' 50G ) "
5.表空间删除
db2 drop tablespace
参考
《DB2数据库最佳管理实践》
http://www.dblotus.com