DB2 DPF (Database Partitioning Feature) 採用 Shared-Nothing 架構,將資料庫水平切分至多個邏輯分區,各分區擁有獨立 CPU、記憶體、磁碟,適合大規模分析查詢 (OLAP) 與海量資料載入。本文記錄在 Linux 虛擬化環境 (雙節點、每節點雙分區) 部署 DB2 10.5 DPF 的完整流程。
| 角色 | 主機名 | IP | 分區號 | 實例用戶 |
|---|---|---|---|---|
| Node 1 | cbusdb01 | 192.168.1.122 | 0, 1 | db2inst1 |
| Node 2 | cbusdb02 | 192.168.1.123 | 2, 3 |
分區對應檔 db2nodes.cfg:
0 cbusdb01 0
1 cbusdb01 1
2 cbusdb02 0
3 cbusdb02 1
groupadd -g 1997 db2igrp
groupadd -g 1998 db2fgrp
useradd -u 1997 -g db2igrp -d /cbusdb/db2inst1 db2inst1
useradd -u 1998 -g db2fgrp -d /cbusdb/db2fenc1 db2fenc1
groupadd db2fadmin
useradd -g db2fadmin db2admin
/opt/ibm/db2/V10.5/instance/db2icrt -s ese -u db2fenc1 db2inst1
/opt/ibm/db2/V10.5/instance/dascrt -u db2admin
su - db2admin -c "db2admin start"
su - db2inst1
db2iauto -on db2inst1
db2set DB2_SKIPINSERTED=on
db2set DB2_USE_ALTERNATE_PAGE_CLEANING=on
db2set DB2_EVALUNCOMMITTED=on
db2set DB2_SKIPDELETED=on
db2set DB2COMM=TCPIP
db2set DB2FCMCOMM=TCPIP4
db2set DB2RSHCMD=/usr/bin/ssh # 建議改用 SSH
db2set DB2CODEPAGE=1386
db2set DB2TERRITORY=86
db2set DB2_PARALLEL_IO=*
DB2c_db2inst1 61000/tcp
DB2_db2inst1 61001/tcp
DB2_db2inst1_1 61002/tcp
DB2_db2inst1_2 61003/tcp
DB2_db2inst1_3 61004/tcp
DB2_db2inst1_4 61005/tcp
DB2_db2inst1_END 61008/tcp
kernel.sem = "250 32000 32 1024"
kernel.msgmnb = 16384
kernel.msgmni = 1024
kernel.msgmax = 8192
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 1073741824
127.0.0.1 localhost
192.168.1.122 cbusdb01
192.168.1.123 cbusdb02
# 所有節點生成金鑰並互傳
ssh-keygen -t rsa
ssh-copy-id cbusdb01
ssh-copy-id cbusdb02
# 驗證
ssh cbusdb01 date
ssh cbusdb02 date
設定 DB2RSHCMD=/usr/bin/ssh 即可。
yum install -y chrony
# /etc/chrony.conf 指向內部 NTP 或外部源
systemctl enable --now chronyd
chronyc sources
yum install -y nfs-utils
mkdir -p /cbusdb /cbusdblog
cat > /etc/exports <<'EOF'
/cbusdb *(rw,sync,no_root_squash)
/cbusdblog *(rw,sync)
EOF
systemctl enable --now nfs-server rpcbind
exportfs -rv
mkdir -p /cbusdb /cbusdblog
mount cbusdb01:/cbusdb /cbusdb
mount cbusdb01:/cbusdblog /cbusdblog
echo "cbusdb01:/cbusdb /cbusdb nfs rw,hard,intr 0 0" >> /etc/fstab
echo "cbusdb01:/cbusdblog /cbusdblog nfs rw,hard,intr 0 0" >> /etc/fstab
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
su - db2inst1
db2start
# 輸出 SQL1063N 成功
db2 "create database cbusdb on /cbusdblog using codeset gbk territory cn"
# 驗證
db2 "select * from sysibmadm.dbpartitionnum"
# 應顯示 4 個分區
db2 "create table test (id int) distribute by hash (id)"
db2 "insert into test values (1),(2),(3),(4),(5),(6),(7),(8)"
db2 "select dbpartitionnum(id), count(*) from test group by dbpartitionnum(id)"
# 各分區應有資料分佈
| 現象 | 原因 | 解決 |
|---|---|---|
| db2start 失敗 SQL1220N | FCM 通訊失敗 | 檢查 /etc/hosts、防火牆、DB2FCMCOMM、SSH 免密 |
| 分區無法連線 | .rhosts 或 SSH 設定錯誤 | 確認 authorized_keys、DB2RSHCMD、/etc/ssh/sshd_config AllowUsers |
| 建立資料庫慢/卡住 | 共享儲存掛載問題 | 檢查 NFS 掛載、權限、磁碟空間、fsid 衝突 |