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时,实例可能会因为无法分配新的共享内存或遇到冲突的旧信号量而报SQL1032N或SQL1042C错误导致启动失败。