Home

DB2 表空间容器迁移指南

第一阶段:独立 LVM 存储准备 (不影响业务)

1. 确认新硬盘并创建物理卷 (PV)
确认系统已识别到 /dev/sdd/dev/sde/dev/sdf

lsblk

pvcreate /dev/sdd
pvcreate /dev/sde
pvcreate /dev/sdf

2. 创建独立的卷组 (VG)
为每个节点创建专属的 VG,实现彻底隔离。

vgcreate vg_node0001 /dev/sdd
vgcreate vg_node0002 /dev/sde
vgcreate vg_node0003 /dev/sdf

3. 创建逻辑卷 (LV)
使用 VG 中的全部可用空间(此处以使用 100% 空间为例,如果你只需分配特定大小,将 -l 100%FREE 改为 -L 500G 等)。

lvcreate -l 100%FREE -n lv_node0001 vg_node0001
lvcreate -l 100%FREE -n lv_node0002 vg_node0002
lvcreate -l 100%FREE -n lv_node0003 vg_node0003

4. 格式化逻辑卷 (ext3)
针对 SUSE 11 SP3 格式化为 ext3。

mkfs.ext3 /dev/vg_node0001/lv_node0001
mkfs.ext3 /dev/vg_node0002/lv_node0002
mkfs.ext3 /dev/vg_node0003/lv_node0003

第二阶段:停止 DB2 服务与清理 IPC

1. 停止实例

su - db2inst1
db2 force application all
db2stop force

2. 强杀残留进程并清理内存(非常关键)

db2_kill
ipclean -a
exit

切换回 root 后,使用 ps -ef | grep db2inst1 确保无任何残留。


第三阶段:目录重命名与新卷挂载 (Root 权限)

1. 备份旧目录

cd /db2fs/db2inst1/
mv NODE0001 NODE0001_old
mv NODE0002 NODE0002_old
mv NODE0003 NODE0003_old

2. 创建新挂载点并挂载

mkdir NODE0001 NODE0002 NODE0003

# 挂载 ext3 文件系统
mount -t ext3 /dev/vg_node0001/lv_node0001 /db2fs/db2inst1/NODE0001
mount -t ext3 /dev/vg_node0002/lv_node0002 /db2fs/db2inst1/NODE0002
mount -t ext3 /dev/vg_node0003/lv_node0003 /db2fs/db2inst1/NODE0003

第四阶段:全量数据同步

源路径末尾的 / 必须保留。

rsync -avh --progress /db2fs/db2inst1/NODE0001_old/ /db2fs/db2inst1/NODE0001/
rsync -avh --progress /db2fs/db2inst1/NODE0002_old/ /db2fs/db2inst1/NODE0002/
rsync -avh --progress /db2fs/db2inst1/NODE0003_old/ /db2fs/db2inst1/NODE0003/

第五阶段:权限修复与 fstab 持久化

1. 修正属主与权限
由于 ext3 格式化并挂载后,根目录下会自动产生 lost+found 目录,且整体属主变为 root,必须修复:

chown -R db2inst1:db2iadm1 /db2fs/db2inst1/NODE0001
chown -R db2inst1:db2iadm1 /db2fs/db2inst1/NODE0002
chown -R db2inst1:db2iadm1 /db2fs/db2inst1/NODE0003

chmod 755 /db2fs/db2inst1/NODE0001
chmod 755 /db2fs/db2inst1/NODE0002
chmod 755 /db2fs/db2inst1/NODE0003

**2. 写入 /etc/fstab**
为了防止盘符漂移,建议使用 UUID 挂载(通过 blkid 获取)。如果直接写设备路径,在 /etc/fstab 中添加:

/dev/vg_node0001/lv_node0001  /db2fs/db2inst1/NODE0001  ext3  defaults  0  0
/dev/vg_node0002/lv_node0002  /db2fs/db2inst1/NODE0002  ext3  defaults  0  0
/dev/vg_node0003/lv_node0003  /db2fs/db2inst1/NODE0003  ext3  defaults  0  0

完成上述步骤后,即可切换回 db2inst1 用户执行 db2start 启动数据库。


核心命令与参数深度解析

为了让你对底层操作心中有数,以下是刚才用到的几个关键命令的原理说明:

1. rsync -avh 参数详解

rsync 是 Linux 下极其强大的增量/全量同步工具。

  • -a** (archive,归档模式):** 这是最重要的参数。它等同于 -rlptgoD 的组合。它会递归拷贝目录,并完美保留文件的所属主 (owner)、所属组 (group)、读写权限 (permissions) 以及时间戳 (timestamps)。如果不用 -a,拷贝过去的文件全部变成 root 拥有,DB2 启动时会因为没有权限读取文件而直接宕机。
  • -v** (verbose,详细模式):** 在屏幕上输出正在拷贝的具体文件名,让你直观看到进度,而不是卡在一个空白屏幕上。
  • -h** (human-readable,人性化显示):** 将文件大小以 KB、MB、GB 的形式显示,而不是一长串难以阅读的字节数。
  • --progress 显示每个大文件的传输百分比和速度。

2. db2_kill 作用原理

db2_kill 是 DB2 自带的一个“大杀器”脚本。

  • 作用: 强制清理当前实例用户下所有与 DB2 相关的进程(如 db2sysc, db2sysc, db2wdog 等)。
  • 为什么需要: 有时候 db2stop force 会因为某些事务正在回滚或锁未释放而卡住。此时操作系统层面仍有进程占用着表空间文件(/db2fs/db2inst1/NODE000x)。如果不杀干净,后续的 mv 重命名或 rsync 读取操作可能会报错,甚至导致复制出的文件处于损坏状态。

3. ipclean -a 作用原理

  • 作用: ipclean 的全称是 Inter-Process Communication (IPC) clean。它用于清理 DB2 在操作系统内存中分配的 IPC 资源,主要包括:共享内存段 (Shared Memory)信号量 (Semaphores)消息队列 (Message Queues)
  • 为什么需要: DB2 尤其是 DPF 架构,高度依赖共享内存来进行分区间的通信和缓冲池管理。当数据库被 db2_kill 异常终止时,分配的内存和信号量并不会自动释放给操作系统。如果不执行 ipclean -a 将它们彻底抹除,下次 db2start 时,实例可能会因为无法分配新的共享内存或遇到冲突的旧信号量而报 SQL1032NSQL1042C 错误导致启动失败。
Linux LVM 存储