1.1 用户环境配置
n 增加用户
useradd –g数据库实例属组–G 数据库实例属组 用户名
例如:
useradd –g db2iadm1 –G db2iadm1 cam
n 配置环境变量
在用户的profile中加入db2相关环境变量,在.bash_profile 中增加如下几行:
DB2INSTHOME=/home/db2inst1/sqllib #/home/db2inst1是数据库实例管#理者的主目录
export DB2INSTHOME
if [ -f $DB2INSTHOME/db2profile ]; then
. $DB2INSTHOME/db2profile
fi
1.2 应用数据库创建
应用数据库推荐采用数据库管理表空间模式。
例:
db2set DB2CODEPAGE=1386
CREATE DATABASE cam DFT_EXTENT_SZ 4 CATALOG TABLESPACE MANAGED BY DATABASE USING (FILE '/home/db2data/cam/catalog.dat' 128000) EXTENTSIZE 4 PREFETCHSIZE 8 TEMPRARY TABLESPACE MANAGED BY DATABASE USING (FILE '/home/db2data/cam/tmp.dat' 6400) USER TABLESPACE MANAGED BY DATABASE USING (FILE '/home/db2data/cam/user.dat' 512000) EXTENTSIZE 4 PREFETCHSIZE 8
利用db2 命令运行。
注意:
n 路径 /home/db2data/cam必须存在,应用用户有读/写/执行执行权限
1.3 应用数据库的配置
为达到生产系统的要求,至少应配置如下参数:
1.3.1 缓冲池大小
n 背景知识
缓冲池是内存中的一块存储区域,用于临时读入和更改数据库页(包含表行或索引项)。缓冲池的用途是为了提高数据库系统的性能。从内存访问数据要比从磁盘访问数据快得多。因此,数据库管理器需要从磁盘读取或写入磁盘的次数越少,性能就越好。对一个或多个缓冲池进行配置之所以是调优的最重要方面,是因为连接至数据库的应用程序的大多数数据(不包括大对象和长字段数据)操作都在缓冲池中进行。
缺省情况下,应用程序使用缓冲池 IBMDEFAULTBP,它是在创建数据库时创建的。当 SYSCAT.BUFFERPOOLS 目录表中该缓冲池的 NPAGES 值为 -1 时,DB2 数据库配置参数 BUFFPAGE 控制着缓冲池的大小。否则会忽略 BUFFPAGE 参数,并且用 NPAGES 参数所指定的页数创建缓冲池。
n 更改方法
1. db2 -v connect to DB_NAME
2. db2 -v select * from syscat.bufferpools
3. db2 -v alter bufferpool IBMDEFAULTBP size -1
4. db2 -v connect reset
5. db2 -v update db cfg for dbname using BUFFPAGE bigger_value
6. db2 -v terminate
1.3.2 锁
n 背景知识
锁相关的控制都是数据库配置参数:
- LOCKLIST 表明分配给锁列表的存储容量。每个数据库都有一个锁列表,锁列表包含了并发连接到该数据库的所有应用程序所持有的锁。锁定是数据库管理器用来控制多个应用程序并发访问数据库中数据的机制。行和表都可以被锁定。根据对象是否还持有其它锁,每把锁需要 32 个或 64 个字节的锁列表:
- 需要 64 个字节来持有某个对象上的锁,在这个对象上,没有持有其它锁。
- 需要 32 个字节来记录某个对象上的锁,在这个对象上,已经持有一个锁。
· MAXLOCKS 定义了应用程序持有的锁列表的百分比,在数据库管理器执行锁升级之前必须填充该锁列表。当一个应用程序所使用的锁列表百分比达到 MAXLOCKS 时,数据库管理器会升级这些锁,这意味着用表锁代替行锁,从而减少列表中锁的数量。当任何一个应用程序所持有的锁数量达到整个锁列表大小的这个百分比时,对该应用程序所持有的锁进行锁升级。如果锁列表用完了空间,那么也会发生锁升级。数据库管理器通过查看应用程序的锁列表并查找行锁最多的表,来决定对哪些锁进行升级。如果用一个表锁替换这些行锁,将不再会超出 MAXLOCKS 值,那么锁升级就会停止。否则,锁升级就会一直进行,直到所持有的锁列表百分比低于 MAXLOCKS。MAXLOCKS 参数乘以 MAXAPPLS 参数不能小于 100。
虽然升级过程本身并不用花很多时间,但是锁定整个表(相对于锁定个别行)降低了并发性,而且数据库的整体性能可能会由于对受锁升级影响的表的后续访问而降低。
下面是一些控制锁列表大小的建议:
-
- 经常进行提交以释放锁。
- 当执行大量更新时,更新之前,在整个事务期间锁定整个表(使用 SQL LOCK TABLE 语句)。这只使用了一把锁从而防止其它事务妨碍这些更新,但是对于其他用户它的确减少了数据并发性。
- 使用 ALTER TABLE 语句的 LOCKSIZE 参数控制如何在持久基础上对某个特定表进行锁定。
- 查看应用程序使用的隔离级别。使用可重复读隔离级别在某些情况下可能会导致自动执行表锁定。当有可能减少所持有共享锁的数量时,可以使用游标稳定性(Cursor Stability)隔离级别。如果没有损害应用程序完整性需求,那么可以使用未提交的读隔离级别而不是游标稳定性隔离级别,以进一步减少锁的数量。
使用下列步骤确定锁列表所需的页数:
1. 计算锁列表大小的下限:(512 * 32 * MAXAPPLS) / 4096,其中 512 是每个应用程序平均所含锁数量的估计值,32 是对象(已有一把锁)上每把锁所需的字节数。
2. 计算锁列表大小的上限:(512 * 64 * MAXAPPLS) / 4096,其中 64 是某个对象上第一把锁所需的字节数。
3. 对于您的数据,估计可能具有的并发数,并根据您的预计为锁列表选择一个初始值,该值位于您计算出的上限和下限之间。
使用数据库系统监视器调优 MAXLOCKS 值。
设置 MAXLOCKS 时,请考虑锁列表的大小(LOCKLIST):
MAXLOCKS = 100 * (512 锁/应用程序 * 32 字节/锁 * 2) / (LOCKLIST * 4096 字节)
该样本公式允许任何应用程序持有的锁是平均数的两倍。如果只有几个应用程序并发地运行,则可以增大 MAXLOCKS,因为在这些条件下锁列表空间中不会有太多争用。
4. LOCKTIMEOUT 指定了应用程序为获取锁所等待的秒数。这有助于应用程序避免全局死锁。
o 如果将该参数设置成 0,那么应用程序将不等待获取锁。在这种情形中,如果请求时没有可用的锁,那么应用程序立刻会接收到 -911。
o 如果将该参数设置成 -1,那么将关闭锁超时检测。在这种情形中,应用程序将等待获取锁(如果请求时没有可用的锁),一直到被授予了锁或出现死锁为止。
n 更改方法
db2 -v update db cfg for DB_NAME using LOCKLIST a_number
db2 -v update db cfg for DB_NAME using MAXLOCKS b_number
db2 -v update db cfg for DB_NAME using LOCKTIMEOUT c_number
db2 -v terminate
1.3.3 联机日志文件
n 背景知识
数据库事务操作时需要写联机日志。当联机日志空间使用完,而事务没有完成时,数据库会阻塞。在DB2数据库默认配置中,联机日志文件可以循环使用,即事务占用的日志空间在事务提交后可以回收使用。循环日志不支持数据库的前滚回复。在一般的应用中,为减少管理复杂度,推荐使用默认设置。
相关参数:
LOGFILSIZ:日志文件大小
LOGPRIMARY:主日志文件个数,预先分配
LOGSECOND:辅助日志文件个数,主日志文件满时按需分配
n 更改方法
db2 -v update db cfg for DB_NAME using LOGFILSIZ a_number
db2 -v update db cfg for DB_NAME using LOGPRIMARY b_number
db2 -v update db cfg for DB_NAME using LOGSECOND c_number
db2 -v terminate