HOME

【DB2 数据库】04 模拟故障排查系列:表空间扩容方式对比(ADD、EXTEND)

文章目录21 节

一、这篇文章要解决什么问题

DB2 DMS 表空间容量不足时,最容易混淆的两个操作是:

  • EXTEND
  • ADD

它们都会增加表空间容量,但底层动作不同:

EXTEND 是扩大已有容器;ADD 是向表空间新增容器。

这篇文章使用同一个 DB2 9.7 FP6 实验库中的两次真实操作做对比:

  • ASSP_CLOB 执行 EXTEND,把唯一容器从 100 MiB 扩到 150 MiB。
  • 对另一个同为 4 KiB 页、手工管理的 DMS 表空间 ASSP 执行 ADD,从一个 50 MiB 容器变成两个 50 MiB 容器。

数据库名、主机名和存储路径已脱敏。ASSP_CLOBASSP、页数、容量和操作结果均保留为实测值。

二、先看结论

对比项EXTENDADD
操作对象已有容器新容器
容器数量不变增加
原容器文件变大大小不变
是否创建新文件
数据重平衡通常不需要可能触发 rebalance
路径条件必须是已登记容器必须是尚未使用的新容器路径
适用场景原文件系统有足够空间希望使用新路径、新挂载点或新存储单元

最简单的记忆方法是:

EXTEND = 原地扩建
ADD    = 新接入一个存储单元

三、实验边界

项目实验值
DB2 版本DB2 v9.7.0.6 Fix Pack 6
实例db2inst1
数据库LABDB(脱敏名)
目标表空间ASSP_CLOB / ASSP
类型DMS
页大小4 KiB
管理方式手工,AUTORESIZE=NO

本文不讨论自动扩容。两次操作前后都验证了 TBSP_AUTO_RESIZE_ENABLED=0

四、执行前先定位表空间和容器

1. 查询表空间 ID

风险等级:INFO(只读)

作用: 查询当前数据库的表空间 ID、页大小、容器数量和状态。 需替换: LABDB 是脱敏后的数据库别名。

db2 connect to LABDB
db2 list tablespaces show detail

本次实验中:

ASSP      Tablespace ID = 4
ASSP_CLOB Tablespace ID = 6

表空间 ID 不是固定配置,在其他数据库中执行前必须重新查询。

2. 查询容器详细信息

风险等级:INFO(只读)

作用: 根据表空间 ID 获取容器路径、页数和可访问状态。 注意事项: EXTEND 使用已有路径,ADD 使用新路径,两者不能写反。

db2 list tablespace containers for 6 show detail
db2 list tablespace containers for 4 show detail

3. 检查底层文件系统

风险等级:INFO(只读)

作用: 确认容器所在文件系统有足够空间承载本次增量。

df -h /db2data
findmnt /db2data

如果文件系统空间不足,应先完成底层存储扩容,不能在容量边界不清楚时直接执行 ALTER TABLESPACE

五、EXTEND:扩大 ASSP_CLOB 已有容器

扩容前,ASSP_CLOB 只有一个文件容器:

Container ID                         = 0
Name                                 = /db2data/labdb/tablespaces/assp_clob_01
Total pages                          = 25600
Useable pages                        = 25568
Accessible                           = Yes

25600 × 4 KiB = 100 MiB

风险等级:CAUTION(持久扩大已有容器)

作用:ASSP_CLOB 的唯一容器增加 50 MiB。 执行前检查: 核对表空间名、ID 6、容器路径、当前页数和 /db2data 剩余空间。 参数含义: 50M 表示在当前容量上再增加 50 MiB。重复执行会继续累加。 回退边界: 扩大文件容器后不能通过删除或截断容器文件回退,必须按 DB2 表空间管理边界评估收缩或重建方案。

db2 "
ALTER TABLESPACE ASSP_CLOB
EXTEND (
  FILE '/db2data/labdb/tablespaces/assp_clob_01' 50M
)
"

扩容后的实测结果:

Container ID                         = 0
Total pages                          = 38400
Useable pages                        = 38368
Accessible                           = Yes

容器数量 = 1
容器大小 = 150 MiB
AUTORESIZE = 0

从底层看,是原来的容器文件从 100 MiB 变成 150 MiB,没有出现第二个容器。

六、ADD:新增第二个容器

为了不把“对 ASSP_CLOB 执行过 ADD”写成虚假实验证据,这里使用同一实验库中 ASSP 的真实 ADD 结果做对比。ASSPASSP_CLOB 都是 4 KiB 页、AUTORESIZE=NO 的 DMS 表空间。

扩容前 ASSP 只有:

Container ID = 0
Name         = /db2data/labdb/tablespaces/assp_data_01
Total pages  = 12800
Size         = 50 MiB

风险等级:CAUTION(新增 DMS 文件容器)

作用:ASSP 新增一个 50 MiB 文件容器。 执行前检查: 确认新路径尚未被其他表空间使用,文件系统剩余容量充足,并记录扩容前容器列表。 影响: ADD 会创建新文件,并可能触发数据重平衡。数据量大时会增加 I/O 和执行时间。 完成验证: 查询容器列表、表空间总页数、utility 状态和新容器文件。

db2 "
ALTER TABLESPACE ASSP
ADD (
  FILE '/db2data/labdb/tablespaces/assp_data_02' 50M
)
"

扩容后的实测结果:

Container ID = 0
Name         = /db2data/labdb/tablespaces/assp_data_01
Total pages  = 12800

Container ID = 1
Name         = /db2data/labdb/tablespaces/assp_data_02
Total pages  = 12800

容器数量 = 2
表空间容量 = 100 MiB
AUTORESIZE = 0

原容器没有变大,而是多了一个新文件容器。

如果要对 ASSP_CLOB 使用 ADD

下面只是同版本语法模板,本次没有对 ASSP_CLOB 执行这条命令:

风险等级:CAUTION(未在本次 ASSP_CLOB 实验中执行的模板)

作用:ASSP_CLOB 新增一个容器,而不是扩大原容器。 需替换: <NEW_CONTAINER_PATH> 必须是未被 DB2 使用的新文件路径。

db2 "
ALTER TABLESPACE ASSP_CLOB
ADD (
  FILE '<NEW_CONTAINER_PATH>' 50M
)
"

七、ADD 后一定能看到 rebalance 吗

不一定。

风险等级:INFO(只读)

作用: 查询当前正在执行的 DB2 utility,用于观察数据重平衡。

db2 list utilities show detail

本次 ASSP 已使用的页很少,ADD 命令返回后立即查询,得到:

SQL1611W  No data was returned by Database System Monitor.
SQLSTATE=00000

这不代表 ADD 失败,而是重平衡已经很快结束,当前没有可观察的活动 utility。

数据量大时,LIST UTILITIES SHOW DETAIL 可能显示进行中的 rebalance。不应在文章中承诺一定会看到 Executing 或某个固定表空间状态码。

八、容量数字怎么看

当页大小为 4 KiB 时:

12800 页 = 50 MiB
25600 页 = 100 MiB
38400 页 = 150 MiB

EXTEND ... 50M 表示增加 50 MiB,不是把容器设置到 50 MiB。

例如:

当前 100 MiB + EXTEND 50M = 150 MiB
当前 150 MiB + EXTEND 50M = 200 MiB

数字不带 K/M/G 时表示页数。同样是 12800,对 4 KiB 页是 50 MiB,对 8 KiB 页则是 100 MiB。

九、最终容量查询

风险等级:INFO(只读)

作用: 同时显示总容量、可分配容量、已用容量、剩余容量、使用率和自动扩容状态。 计算边界: 使用率以 TBSP_USABLE_PAGES 为分母,容量使用 1024.0 保留 MiB 小数。

db2 "
SELECT
    SUBSTR(TBSP_NAME, 1, 20) AS NAME,
    TBSP_TYPE AS TYPE,
    DECIMAL(BIGINT(TBSP_TOTAL_PAGES) * TBSP_PAGE_SIZE / 1024.0 / 1024.0, 12, 2) AS TOTAL_MIB,
    DECIMAL(BIGINT(TBSP_USABLE_PAGES) * TBSP_PAGE_SIZE / 1024.0 / 1024.0, 12, 2) AS USABLE_MIB,
    DECIMAL(BIGINT(TBSP_USED_PAGES) * TBSP_PAGE_SIZE / 1024.0 / 1024.0, 12, 2) AS USED_MIB,
    DECIMAL(BIGINT(TBSP_FREE_PAGES) * TBSP_PAGE_SIZE / 1024.0 / 1024.0, 12, 2) AS FREE_MIB,
    DECIMAL(TBSP_USED_PAGES * 100.0 / NULLIF(TBSP_USABLE_PAGES, 0), 5, 2) AS USED_PCT,
    TBSP_AUTO_RESIZE_ENABLED AS AUTO_RESIZE
FROM SYSIBMADM.TBSP_UTILIZATION
ORDER BY USED_PCT DESC
"

十、常见误区

1. 把新路径写进 EXTEND

EXTEND 只能扩大已有容器。如果要使用新路径,应使用 ADD

2. 扩容 ASSP,却查 ASSP_CLOB 的 ID

每条 ALTER TABLESPACE 都要与后续验证的表空间 ID 一一对应。本次 ASSP=4ASSP_CLOB=6,不能混用。

3. 用 TOTAL_PAGES 计算使用率

TOTAL_PAGES 包含管理页。如果需要表示“实际可分配页面已用多少”,分母应使用 USABLE_PAGES

4. 把 SQL1611W 当成 ADD 失败

SQL1611W 在本次实验中只表示当前没有活动 utility。是否扩容成功要结合容器数量、总页数和新文件验证。

5. 重复执行 EXTEND

EXTEND 是累加。执行前必须重新查当前页数,否则可能比计划多占用一个增量。

十一、怎么选

选择 EXTEND 的典型条件:

  • 现有容器路径还有足够空间。
  • 不想增加文件数量。
  • 只希望扩大某一个已有容器。
  • 希望减少本次变更面。

选择 ADD 的典型条件:

  • 要把新容量放到新挂载点或新存储上。
  • 希望保留原容器大小不变。
  • 接受新容器可能引发的 rebalance 和 I/O 影响。
  • 已为新容器准备好独立目录和容量规划。

十二、总结

这次对比实验最终得到的结论是:

  1. EXTEND 增大已有容器,容器数量不变。
  2. ADD 创建新容器,容器数量增加。
  3. EXTEND 50M 是增加 50 MiB,不是调整到 50 MiB。
  4. EXTEND 必须使用已有容器路径,ADD 必须使用新路径。
  5. ADD 可能触发 rebalance,但数据量很少时可能根本观察不到活动 utility。
  6. 两种方式都要同时检查 DB2 页面和底层文件系统空间。
  7. 本次环境始终保持 AUTORESIZE=NO,容量变化均由手工命令产生。
DB2 Linux DMS 表空间 存储