Home

DB2表空间扩容

第一阶段:在虚拟化平台添加硬盘

  1. 在您的VMware vSphere、Proxmox、Hyper-V等管理界面中,为虚拟机db2server02添加一块新的SCSI硬盘(例如:100GB)。
  2. 确保硬盘控制器类型为SCSI(推荐使用LSI Logic SAS或PVSCSI)

第二阶段:在Linux操作系统中整合新硬盘

第1步:识别新硬盘

登录系统后,首先确认系统是否识别到了新硬盘。

sudo lsblk

输出示例:

NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                         8:0    0  100G  0 disk
├─sda1                      8:1    0  512M  0 part /boot/efi
├─sda2                      8:2    0    1G  0 part /boot
└─sda3                      8:3    0 98.5G  0 part
  ├─datavg-db2data_lv 253:0    0 88.5G  0 lvm  /db2data
  └─datavg-other_lv   253:1    0   10G  0 lvm  /other
sdn                         8:16   0  100G  0 disk  # <--- 这就是新添加的硬盘!
sr0                        11:0    1 1024M  0 rom

在这个例子中,新硬盘被识别为 /dev/sdn。请记下您的设备名。

重要提醒: 如果 lsblk 没有立即显示新硬盘,可以尝试让系统重新扫描SCSI总线来识别新设备:

# 重新扫描SCSI主机总线(host# 请根据您的系统调整,通常是host0)
echo "- - -" | sudo tee /sys/class/scsi_host/host0/scan
# 如果不行,可以尝试扫描所有主机
for host in /sys/class/scsi_host/host*/scan; do echo "- - -" | sudo tee $host; done

再次运行 sudo lsblk 确认新硬盘出现。

假设您新添加的硬盘在系统中识别为 /dev/sdn

第1步:创建物理卷 (PV)

# 跳过 fdisk 分区,直接在整个磁盘上创建物理卷
sudo pvcreate /dev/sdn

系统会提示你 Physical volume "/dev/sdn" successfully created.。这会将必要的 LVM 元数据直接写入磁盘的起始部分。

第2步:将新物理卷扩展到现有卷组 (VG)

# 假设您的卷组名是 datavg,不知道可以vgdisplay
sudo vgextend datavg /dev/sdn

使用 sudo vgdisplay datavg 确认 “Free PE / Size” 已经增加。

第3步:扩展逻辑卷 (LV)

# 将卷组中的所有空闲空间都扩展到你的逻辑卷
sudo lvextend -l +100%FREE /dev/mapper/datavg-datalv

(你也可以指定具体大小,如 -L +50G,但通常直接用完所有空间更方便)

第4步:扩展文件系统

# 扩展文件系统以使用新的空间(假设是XFS,挂载在 /db2data)
sudo xfs_growfs /db2data

# 如果是 ext4,命令如下:
sudo resize2fs /dev/mapper/datavg-datalv

DB2 表空间扩容流程

第 1 步:确认当前状态(基线)

在进行任何操作前,先记录下表空间的初始状态。

# 1. 连接到数据库
db2 connect to dzzf

# 2. 查看表空间详情,重点关注ASSP的ID、总页数、可用页数
echo "=== 当前所有表空间状态 ==="
db2 list tablespaces show detail
# 如下
db2inst1@db2server02:~> db2 list tablespaces | grep ASSP
 Name                                 = ASSP
 Name                                 = ASSP_INDEX
 Name                                 = ASSP_CLOB
# 检查当前连接的数据库所有表的表空间使用率MB显示
db2 "SELECT SUBSTR(TBSP_NAME, 1, 20) AS NAME, TBSP_TYPE AS TYPE, TBSP_TOTAL_PAGES * TBSP_PAGE_SIZE / 1024 / 1024 AS TOTAL_MB, TBSP_USED_PAGES * TBSP_PAGE_SIZE / 1024 / 1024 AS USED_MB, TBSP_FREE_PAGES * TBSP_PAGE_SIZE / 1024 / 1024 AS FREE_MB, DECIMAL((TBSP_USED_PAGES * 100.0) / NULLIF(TBSP_TOTAL_PAGES, 0), 5, 2) AS USED_PCT FROM SYSIBMADM.TBSP_UTILIZATION ORDER BY USED_PCT DESC"

# 3. 查看ASSP表空间的容器列表,记住容器路径和大小
echo "=== ASSP表空间的容器详情 ==="
# 首先获取ASSP的表空间ID(例如:6)
db2 list tablespaces | grep ASSP
# 假设查到的ID是 2,则查看其容器
  db2 list tablespace containers for 6

记录关键信息:

  • 表空间 ID (TSID): 例如 6
  • 总页数 (Total Pages): 例如 12800 (约50MB)
  • 容器路径: /db2data/assp_container1
  • 容器大小: 初始应为 50M

第 2 步:方法一扩展现有容器 (EXTEND)

我们将现有容器扩大 50MB。

# 1. 执行EXTEND命令,在原有50M基础上再增加50M
echo "=== 开始EXTEND扩容:为现有容器增加50M ==="
db2 "ALTER TABLESPACE ASSP_CLOB EXTEND (FILE '/db2data/assp_container1' 50M)"

# 2. 立即验证结果
echo "=== EXTEND操作完成,验证新大小 ==="
db2 list tablespace containers for 6
db2 list tablespaces show detail | grep -A 3 -B 3 ASSP_CLOB

预期结果:

  • 容器路径不变,但 total_pagesusable_pages 应该大约翻倍(例如从 ~12800 变为 ~25600)。
  • 操作几乎是瞬时的,因为不涉及数据移动。

第 3 步:方法二添加新容器 (ADD)

我们现在添加第二个大小为 50MB 的新容器。

# 1. 执行ADD命令,添加一个新容器
echo "=== 开始ADD扩容:添加一个新容器 ==="
db2 "ALTER TABLESPACE ASSP ADD (FILE '/db2data/assp_container2ASSP表空间的容器详情 (ID: 6)' 50M)"

# 2. 监控重新平衡(REBALANCE)进程
echo "=== 监控ADD触发的REBALANCE工具状态 ==="
db2 list utilities show detail
# 上述命令会显示一个状态为‘Executing’的REBALANCE utility。
# 可以多次运行此命令,直到其状态变为‘Completed’。
# 注意:Rebalance可能需要一些时间,即使数据量很小。

# 3. Rebalance完成后,验证最终结果
echo "=== REBALANCE完成,验证最终大小和容器列表 ==="
db2 list tablespace containers for 6
db2 list tablespaces show detail | grep -A 4 -B 4 ASSP

预期结果:

  • list tablespace containers 会显示两个容器/db2data/assp_container1 (100M) 和 /db2data/assp_container2 (50M)。
  • list tablespaces 显示的总页数应该是三个容器页数的总和(~25600 + ~12800 = ~38400)。
  • 表空间状态 (tbsp_state) 在 rebalance 期间可能是 0x0001000 (Quiesced: SHARE),完成后会恢复正常状态 0x0000000 (Normal)。

第 4 步:最终验证和总结

进行最后一次全面检查,确认扩容完全成功。

# 最终状态检查
echo "========== 扩容最终验证 =========="
echo "1. 表空间总体状态:"
db2 list tablespaces show detail | grep -A 1 -B 1 ASSP

echo "2. 容器详细列表:"
db2 list tablespace containers for 6
db2 "SELECT SUBSTR(TBSP_NAME, 1, 20) AS NAME, TBSP_TYPE AS TYPE, TBSP_TOTAL_PAGES * TBSP_PAGE_SIZE / 1024 / 1024 AS TOTAL_MB, TBSP_USED_PAGES * TBSP_PAGE_SIZE / 1024 / 1024 AS USED_MB, TBSP_FREE_PAGES * TBSP_PAGE_SIZE / 1024 / 1024 AS FREE_MB, DECIMAL((TBSP_USED_PAGES * 100.0) / NULLIF(TBSP_TOTAL_PAGES, 0), 5, 2) AS USED_PCT FROM SYSIBMADM.TBSP_UTILIZATION ORDER BY USED_PCT DESC"
echo "3. 文件系统空间检查(确认/db2data仍有充足空间):"
df -h /db2data

最终成果:
您已经成功将一个 50MB 的 ASSP 表空间通过两种方式扩容到了约 150MB。

  1. 纵向扩展 (EXTEND): 将第一个容器从 50M -> 100M。
  2. 横向扩展 (ADD): 新增一个 50M 的容器。
Linux VMware LVM ext4 虚拟化 AI