【DB2 数据库】04 模拟故障排查系列:表空间扩容方式对比(ADD、EXTEND)
文章目录21 节
一、这篇文章要解决什么问题
DB2 DMS 表空间容量不足时,最容易混淆的两个操作是:
EXTENDADD
它们都会增加表空间容量,但底层动作不同:
EXTEND是扩大已有容器;ADD是向表空间新增容器。
这篇文章使用同一个 DB2 9.7 FP6 实验库中的两次真实操作做对比:
- 对
ASSP_CLOB执行EXTEND,把唯一容器从 100 MiB 扩到 150 MiB。 - 对另一个同为 4 KiB 页、手工管理的 DMS 表空间
ASSP执行ADD,从一个 50 MiB 容器变成两个 50 MiB 容器。
数据库名、主机名和存储路径已脱敏。
ASSP_CLOB、ASSP、页数、容量和操作结果均保留为实测值。
二、先看结论
| 对比项 | EXTEND | ADD |
|---|---|---|
| 操作对象 | 已有容器 | 新容器 |
| 容器数量 | 不变 | 增加 |
| 原容器文件 | 变大 | 大小不变 |
| 是否创建新文件 | 否 | 是 |
| 数据重平衡 | 通常不需要 | 可能触发 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 detail3. 检查底层文件系统
风险等级: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 = Yes25600 × 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 结果做对比。ASSP 和 ASSP_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 MiBEXTEND ... 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=4、ASSP_CLOB=6,不能混用。
3. 用 TOTAL_PAGES 计算使用率
TOTAL_PAGES 包含管理页。如果需要表示“实际可分配页面已用多少”,分母应使用 USABLE_PAGES。
4. 把 SQL1611W 当成 ADD 失败
SQL1611W 在本次实验中只表示当前没有活动 utility。是否扩容成功要结合容器数量、总页数和新文件验证。
5. 重复执行 EXTEND
EXTEND 是累加。执行前必须重新查当前页数,否则可能比计划多占用一个增量。
十一、怎么选
选择 EXTEND 的典型条件:
- 现有容器路径还有足够空间。
- 不想增加文件数量。
- 只希望扩大某一个已有容器。
- 希望减少本次变更面。
选择 ADD 的典型条件:
- 要把新容量放到新挂载点或新存储上。
- 希望保留原容器大小不变。
- 接受新容器可能引发的 rebalance 和 I/O 影响。
- 已为新容器准备好独立目录和容量规划。
十二、总结
这次对比实验最终得到的结论是:
EXTEND增大已有容器,容器数量不变。ADD创建新容器,容器数量增加。EXTEND 50M是增加 50 MiB,不是调整到 50 MiB。EXTEND必须使用已有容器路径,ADD必须使用新路径。ADD可能触发 rebalance,但数据量很少时可能根本观察不到活动 utility。- 两种方式都要同时检查 DB2 页面和底层文件系统空间。
- 本次环境始终保持
AUTORESIZE=NO,容量变化均由手工命令产生。