基础环境规划
在准备安装软件前,需要大致规划下,安装什么版本,使用系统版本,是否有兼容性问题,预留多少资源给DB2,是否swap等。
软硬件兼容检查
在安装之前需要确认准备的OS版本与数据库版本是否一致
http://www-01.ibm.com/support/docview.wss?uid=swg27038033
打开上面地址,选择对应数据库版本(如db2 AESE v10.5),选择linux系统,会弹出如下兼容列表


注:为了避免意外(不可预知问题),正式环境最好遵循兼容列表来进行搭配,也是官方验证过的support list。
当然本次为了安装找不到RHEL 7版本,只能用来轻量云VM的centos 8来演示
软硬件准备
1.准备linux机器一台:云主机/本地VM均可,本列系统为:CentOS Stream release 8
2.准备数据库软件:v10.5fp11_linuxx64_server_t.tar
资源规划
内存:系统内存2G,分配给db2 64M使用
官方建议是:DB2 数据库系统至少需要 256 MB RAM
swap: 不使用
端口:50000
数据库目录: /data/db2data
环境准备
配置host
cat > /etc/hosts << here
127.0.0.1 localhost localhost.localdomain localhost4.localdomain4
10.0.4.7 node01
here
配置端口services
echo 'db2inst1_pri 60010/tcp' >> /etc/services
创建用户
安装DB2需要三个用户组/用户,通常以root来安装
缺省用户
| 用户 | 实例用户名 | 实例组名 |
|---|---|---|
| 实例所有者 | db2inst1 | db2iadm1 |
| 受防护的用户 | db2fenc1 | db2fadm1 |
| DB2 管理服务器用户 | dasusr1 | dasadm1 |
注:
实例所有者主目录是将在其中创建 DB2 实例的位置。
受防护的用户用于在 DB2 数据库所使用的地址空间之外运行用户定义的函数 (UDF) 和存储过程。
DB2 管理服务器用户*的用户标识用于在系统上运行 DB2 管理服务器
创建组
groupadd -g 1101 db2iadm1
groupadd -g 1102 db2fadm1
groupadd -g 1103 dasadm1
为每个组创建用户
useradd -u 1201 -g db2iadm1 -m -d /home/db2inst1 db2inst1
useradd -u 1202 -g db2fadm1 -m -d /home/db2fenc1 db2fenc1
useradd -u 1203 -g dasadm1 -m -d /home/dasusr1 dasusr1
设置初始密码:
passwd db2inst1
passwd db2fenc1
passwd dasusr1
数据库目录
创建数据库目录,活动日志,归档日志等目录
mkdir -p /db2data
mkdir -p /db2log/actlog/
mkdir -p /db2log/arclog
mkdir -p /db2diag/db2dump/
chown db2inst1:db2iadm1 -R /db2data
chown db2inst1:db2iadm1 -R /db2log/actlog/
chown db2inst1:db2iadm1 -R /db2log/arclog
chown db2inst1:db2iadm1 -R /db2diag/db2dump/
依赖包安装
yum -y install cpp install gcc gcc-c++ kernel-source binutils pam-*.el8.i686 pam-*.el8.x86_64
yum -y install iscsi* *compat-libstdc++* *ksh* *pam* pam*86* *compat-libstdc* perl-Sys-Syslog rsh*
yum -y install *libstdc* libstdc++.so.6 libstdc++.so.5 libaio* glibc*
yum -y install pam-devel-* pam-*.i686*
yum -y install kernel-devel* gcc gcc-c++ kernel-source pam-32bit* glibc-locale-32bit* libstdc-32bit*
yum -y install libstdc*i686 pam*i686 gcc* kernel-devel sg3_utils* sg_persist*
用户ulimit设置
ulimit设置
cat >> /etc/security/limits.conf <<here
* - nofile 65535
* - nproc 65535
* - stack unlimited
* - core 2048000
db2inst1 - nofile 65535
db2inst1 - nproc 65535
db2inst1 - stack unlimited
db2inst1 - core 2048000
here
检查验证
su db2inst1 -c "ulimit -a"
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sestatus
系统参数调整
cat >> /etc/sysctl.conf <<here
kernel.sem=250 1024000 250 4096
kernel.shmmni=4096
#kernel.shmmax = 2147483648
#2**1024*1024*1024
#kernel.shmall = 134217728
#2*1024*1024*1024/4/1024
kernel.msgmni=16384
kernel.msgmax=65536
kernel.msgmnb=65536
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_keepalive_probes = 6
vm.dirty_background_ratio = 5
vm.dirty_ratio= 15
vm.swappiness= 1
vm.overcommit_memory=1
#禁用zone_reclaim_mode
vm.zone_reclaim_mode=0
here
生效配置
sysctl -p
| IPC 内核参数 | 最低增强设置 |
|---|---|
| kernel.shmmni (SHMMNI) | 256 * <RAM 大小,以 GB 计> |
| kernel.shmmax (SHMMAX) | <RAM 大小,以字节计>1 |
| kernel.shmall (SHMALL) | 2* <缺省系统页中的 RAM 大小 >2 |
| kernel.sem (SEMMNI) | 256 * <RAM 大小,以 GB 计> |
| kernel.sem (SEMMSL) | 250 |
| kernel.sem (SEMMNS) | 256 000 |
| kernel.sem (SEMOPM) | 32 |
| kernel.msgmni (MSGMNI) | 1 024 * <RAM 大小,以 GB 计> |
| kernel.msgmax (MSGMAX) | 65 536 |
| kernel.msgmnb (MSGMNB) | 65 536 |
信号量
System V信号量用于进程间通讯,并发控制、互斥 ;解决多个进程或线程对共享资源的访问问题
SEMMSL 每组中信号量最大数量
SEMMNS 系统中所有信号量的最大数量 SEMMSL *SEMMNI
SEMOPM 系统调用可以同时执行的最大信号量操作的数量
SEMMNI 统中信号量组的最大数量
SEMMNI 解释:
IBM:
应该是系统上需要的最大代理程序数乘以数据库服务器计算机上的逻辑分区数
再加上数据库服务器计算机上的本地应用程序连接数的和的两倍
ORACLE:
2 * sum (process parameters of all database instances on the system)
+ overhead for background processes + system and other application requirements倍
实际使用验证:
SEMMNI设置过小报错,设置过大SYS CPU 100%
即设置过小正常连接不能满足,设置过大并发控制量敞开大门,系统充斥共享资源争用消耗
从实际来看与连接数agent关联不唯一,还与操作的共享资源即内存数量有关
核心需要关注的是SEMMNS
消息参数
MSGMNI 参数将影响可以启动的代理程序数;
MSGMAX 参数将影响队列中可以发送的消息的大小,MSGMNB 参数将影响队列的大小
应该将 MSGMAX 参数更改为 64 KB(即,65536 个字节),并且应该将 MSGMNB 增大到 65536
THP
集中式数据库吃大量资源,使用手动大页分配内存可以减少CPU内存管理开销提升性能,但大页对于小块内存分配是种浪费,便衍生了自动分配大页的技术Transparent Huge Page 即THP,在实际使用中发现开启THP自动分配连续大页内存以及频繁的page compact诱发的性能抖动,是极具不稳定因素,通常所有类型数据库都建议关闭THP
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
cat >> /etc/rc.d/rc.local<<EOF
if test -f /sys/kernel/mm/transparent_hugepage/enabled;then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag;then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
chmod a+x /etc/rc.d/rc.local
DB2安装
解压软件验证依赖
#解压软件
tar -xvf v10.5fp11_linuxx64_server_t.tar.gz
#系统软件包检查
cd server_t
./db2prereqcheck
提示找不大libstdc++.so.5,没办法centos8 这种不在兼容列表的OS安装db2v10.5,建链接欺骗一下(非常规操作,只是在资源有限情况下,演示安装流程)
yum -y install gcc-c++
yum -y install libstdc++.so.6
ln -s /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.5
ln -s /usr/lib/libstdc++.so.6 /usr/lib/libstdc++.so.5
再次检查依赖包,提示成功
./db2prereqcheck
Validating "/lib/libpam.so*" ...
Requirement matched.
DBT3533I The db2prereqcheck utility has confirmed that all installation prerequisites were met.
安装版本
./db2_install
按提示,输入"yes"默认目录安装,版本选择 SERVER,不安装purescale( 类似ORACLE RAC)
Default directory for installation of products - /opt/ibm/db2/V10.5
***********************************************************
Install into default directory (/opt/ibm/db2/V10.5) ? [yes/no]
yes
Specify one of the following keywords to install DB2 products.
SERVER
CONSV
EXP
CLIENT
RTCL
Enter "help" to redisplay product names.
Enter "quit" to exit.
***********************************************************
SERVER
***********************************************************
Do you want to install the DB2 pureScale Feature? [yes/no]
no
DB2 installation is being initialized.
等待300秒左右即可安装完成
Task #1 start
Description: Checking license agreement acceptance
Estimated time 1 second(s)
Task #1 end
Task #2 start
Description: Base Client Support for installation with root privileges
Estimated time 3 second(s)
Task #2 end
……
Task #49 start
Description: Registering DB2 Update Service
Estimated time 30 second(s)
Task #49 end
Task #50 start
Description: Updating global profile registry
Estimated time 3 second(s)
Task #50 end
The execution completed successfully.
For more information see the DB2 installation log at
检查
db2ls
Install Path Level Fix Pack Special Install Number Install Date Installer UID
---------------------------------------------------------------------------------------------------------------------
/opt/ibm/db2/V10.5 10.5.0.11 11 Sat Jul 27 02:03:35 2024 CST 0
至此安装已经完成
创建数据库实例和数据库
创建实例
指定 auth 为server, fence user 为 db2fenc1, instance user 为db2inst1
/opt/ibm/db2/V10.5/instance/db2icrt -a server -u db2fenc1 db2inst1
300秒完成安装
DB2 installation is being initialized.
Total number of tasks to be performed: 4
Total estimated time for all tasks to be performed: 309 second(s)
Task #1 start
Description: Setting default global profile registry variables
Estimated time 1 second(s)
Task #1 end
Task #2 start
Description: Initializing instance list
Estimated time 5 second(s)
Task #2 end
Task #3 start
Description: Configuring DB2 instances
Estimated time 300 second(s)
Task #3 end
Task #4 start
Description: Updating global profile registry
Estimated time 3 second(s)
Task #4 end
The execution completed successfully.
For more information see the DB2 installation log at
"/tmp/db2icrt.log.1274751".
DBI1070I Program db2icrt completed successfully.
service服务配置
#添加对应端口60000,不存在则设置
vi /etc/services
DB2_db2inst1 60000/tcp
注册变量
#实例注册变量配置
su - db2inst1
db2 update dbm cfg using AGENT_STACK_SZ 1000 DEFERRED
db2 update dbm cfg using MON_HEAP_SZ AUTOMATIC DEFERRED
db2set db2comm=tcpip
db2set db2codepage=1208
db2set DB2_LOAD_COPY_NO_OVERRIDE=NONRECOVERABLE
db2set DB2_SKIPINSERTED=ON
db2set DB2_INLIST_TO_NLJN=YES
db2set DB2_MINIMIZE_LISTPREFETCH=Y
db2set DB2_EVALUNCOMMITTED=YES
db2set DB2_SKIPDELETED=ON
db2set DB2_USE_ALTERNATE_PAGE_CLEANING=ON
db2 terminate
license检查与添加
db2licm -l
Product name: "DB2 Advanced Enterprise Server Edition"
License type: "Trial"
Expiry date: "10/23/2024"
Product identifier: "db2aese"
Version information: "10.5"
如果有license则添加
db2licm -a db2_aese.lic
建库
#建库调整参数,开归档
db2start
db2 "create db testdb automatic storage yes on /db2data dbpath on /db2data using codeset UTF-8 TERRITORY CN PAGESIZE 16384"
db2 connect to testdb
db2 get db cfg for testdb |grep -i log
考虑到VM的系统资源,调整参数配置
db2 update dbm cfg using SVCENAME 'db2inst1_pri'
db2 update db cfg for testdb using LOGPRIMARY 60 #主日志数
db2 update db cfg for testdb using LOGSECOND 100
db2 update db cfg for testdb using LOGFILSIZ 10240 #vm 环境设置40M,生产以15~30分切换一个日志文件
db2 update db cfg for testdb using NEWLOGPATH /db2log/actlog/ #设置活动日志目录
db2 update db cfg for testdb using LOGARCHMETH1 DISK:/db2log/arclog #设置归档日志目录
db2 update db cfg for testdb using NUM_LOG_SPAN 40 #事务最大日志跨度
db2 update db cfg for testdb using MAX_LOG 20 #事务可以消耗的主日志空间的百分比
db2 update db cfg for testdb using DBHEAP AUTOMATIC #数据库堆分配的最大内存量,LOGBUFSZ ,AUDIT_BUF_SIZE,DB2_HADR_BUF_SIZE
db2 update db cfg for testdb using LOCKLIST 10240 # VM设置40M ,通常设置为每个连接消耗512个锁 (512 * 256 * maxappls) / 4096
db2 update db cfg for testdb using maxlocks 20 #VM设置20, 锁定升级前锁定列表的最大百分比,maxlocks = 2 * 100 / maxappls 允许应用程序保留两次锁定的平均数
db2 update db cfg for testdb using LOGBUFSZ 2048 #VM 设置8M,通常redolog 4M~64M可以适用任意繁忙系统
db2 update db cfg for testdb using LOCKTIMEOUT 60
#软检查点(checkpoint )以 logfilsiz 的百分比,( (记录的状态和当前状态之间的空间) / logfilsiz ) * 100 .可接受的恢复窗口是一个日志文件则为100
db2 update db cfg for testdb using SOFTMAX 1000
db2 update db cfg for testdb using PCKCACHESZ 10240 #程序包高速缓存,减少编译;VM设置40M
db2 update db cfg for testdb using STAT_HEAP_SZ AUTOMATIC #收集统计信息时所用的最大堆大小
db2 update db cfg for testdb using STMTHEAP AUTOMATIC
db2 update db cfg for testdb using UTIL_HEAP_SZ 5000 #实用程序堆大小,load,backup,reorg等操作
db2 update db cfg for testdb using DATABASE_MEMORY 65536 #数据库内存,缓冲池、数据库堆、锁定列表、实用程序堆、程序包高速缓存、目录高速缓存
db2 update db cfg for testdb using AUTO_STMT_STATS ON #收集统计信息
db2 update db cfg for testdb using STMT_CONC LITERALS #动态绑定变量,语句集中器
db2 update dbm cfg using DIAGPATH /db2diag/db2dump/ #实例诊断日志目录
db2 update dbm cfg using HEALTH_MON OFF
db2 terminate
重启生效配置
db2stop force
db2start
开启归档后需要全备,否则数据库不可连接
SQL1116N A connection to or activation of database "TESTDB" failed because
the database is in BACKUP PENDING state. SQLSTATE=57019
备份重连数据库
db2 "backup db testdb to /dev/null " #(OFFLINE BACKUP)
db2 activate db testdb
查看
db2 list active databases;
Active Databases
Database name = TESTDB
Applications connected currently = 0
Database path = /db2data/db2inst1/NODE0000/SQL00001/MEMBER0000/
最常见坑点
个人认为可以称为隐式重启
-
DEACTIVATE DATABASE 命令或 db2stop 命令时,由 ACTIVATE DATABASE 命令激活的数据库才会停止(主动激活)
-
由connect to 激活数据库,在关闭了最后一个连接之后会停止数据库(连接激活)






