DB2 的自动存储管理表空间(Automatic Storage Managed Tablespace)并不是单纯的省略容器定义,它的底层仍然是数据库管理的表空间机制,只是把容器创建、扩展和路径分配交给数据库维护的存储路径组统一处理。很多 DBA 在建库时勾选了自动存储,却仍然用以前 DMS 表空间的思路去维护,等遇到文件系统写满、高水位居高不下或扩展抖动时才发现路径策略并不理想。本文围绕创建参数、路径扩展、监控与性能调整,整理自动存储表空间在实际运维中的可操作方法。

自动存储与 DMS、SMS 的机制差异
传统 SMS 表空间由操作系统目录管理文件,数据库在目录中按表自动创建和删除文件,管理成本低,但无法控制文件位置和增长大小,I/O 调优空间有限。DMS 表空间要求 DBA 预先创建容器文件或裸设备,容器数量、大小和增长策略都要手工维护,虽然可控性强,但在表数量增多后容易造成空间碎片和运维负担。自动存储表空间底层依然采用 DMS 的容器管理方式,只是容器不再由 DBA 在创建表空间时一一指定,而是由数据库根据存储路径列表和可用空间自动生成。
从可调参数角度,自动存储表空间仍可配置扩展块大小、预取大小、初始大小和最大大小等,因此它兼具 DMS 的性能控制能力与 SMS 的简化管理优点。生产中建议普通数据表空间、索引表空间和系统临时表空间优先使用自动存储;如果业务要求将特定表空间绑定到独占裸设备,或需要精细控制容器数量,则继续使用显式 DMS 容器。理解这一层区别后,才能用好后续的路径和扩容策略。
创建与扩容参数如何组合
创建数据库时可以通过 ON 子句一次性指定多个自动存储路径,这些路径应尽量位于不同物理磁盘或存储控制器上。示例如下:
CREATE DATABASE SAMPLE AUTOMATIC STORAGE YES ON /db2/data1, /db2/data2 USING CODESET UTF-8 TERRITORY CN;
自动存储表空间的创建重点在于控制边界,而不是完全放开。INITIALSIZE 用来分配第一个容器的初始大小,AUTORESIZE YES 表示允许容器自动增长,MAXSIZE 则限制整个表空间的总大小。下面示例设置 200M 初始大小,最大 20G,扩展块 32 页,并让预取大小自动计算:
CREATE TABLESPACE USER_TS MANAGED BY AUTOMATIC STORAGE INITIALSIZE 200 M AUTORESIZE YES MAXSIZE 20 G EXTENTSIZE 32 PREFETCHSIZE AUTOMATIC;
这里要特别注意,INITIALSIZE 并不是表空间最终大小,也不是单个容器的上限。自动存储表空间在增长时会根据路径可用空间创建新的容器文件,因此一个表空间可能对应多个容器,这些容器分布在不同存储路径上。MAXSIZE 限制的是所有容器合计可用页数,而不是文件系统容量。设置 MAXSIZE NONE 虽然灵活,但在生产环境中风险较高,容易因为应用端误操作或批量任务失败导致空间无限增长,最终写满整个文件系统。因此建议所有核心表空间都设置明确的 MAXSIZE。
如果部署后需要扩大表空间边界,可以直接调整 MAXSIZE,也可以为数据库增加新的存储路径。新增路径不会迁移已有数据,只影响后续自动扩展出的容器。常用语句如下:
ALTER DATABASE SAMPLE ADD STORAGE ON '/db2/data3'; ALTER TABLESPACE USER_TS MAXSIZE 50 G;
对于旧版本 Db2 或需要控制每次增长幅度的场景,还可以在创建表空间时通过 INCREASESIZE 指定增长百分比。例如 INCREASESIZE 20 PERCENT 表示每次自动扩展在当前已分配大小基础上增加 20%。如果系统已经升级到较新版本,通常更推荐只设置 MAXSIZE,让数据库根据剩余空间和增长速度自动决定扩展量,减少人工干预。
路径监控与高水位判断方法
自动存储表空间最容易被忽视的是高水位问题。DMS 表空间即使删除数据,已经分配给容器的扩展块也不会自动交还给文件系统,因此判断空间是否紧张不能只看 FreePgs,还要看高水位标记。使用 db2pd -d SAMPLE -tablespaces 可以查看表空间的使用页数、空闲页数和高水位等信息。输出中的 HWM 表示当前已分配的最大页号,若 HWM 接近表空间上限,即使显示有空闲页,后续写入仍可能触发空间不足。
SELECT TBSP_NAME,
TBSP_TYPE,
TBSP_STATE,
TBSP_USED_PAGES,
TBSP_FREE_PAGES,
TBSP_PAGE_SIZE,
TBSP_USABLE_PAGES
FROM SYSIBMADM.TBSP_UTILIZATION
WHERE TBSP_TYPE = 'DMS'
ORDER BY TBSP_NAME;
从路径维度看,应关注每个自动存储路径所在文件系统的剩余空间。可以调用 ADMIN_GET_STORAGE_PATHS 表函数查看路径、文件系统总大小和已用空间。查询示例如下:
SELECT STORAGE_GROUP_NAME,
FS_ID,
PATH,
FS_TOTAL_SIZE_KB,
FS_USED_SIZE_KB
FROM TABLE(ADMIN_GET_STORAGE_PATHS('', -2)) AS T;
当某个路径对应的文件系统使用率超过 75% 时,就应该提前规划扩容或清理。由于自动存储表空间会尽量在可用空间较多的路径上创建新容器,如果所有路径都接近写满,数据库仍可能继续请求空间,最终导致写入失败。此时单纯增加表空间 MAXSIZE 没有意义,因为操作系统层已经没有空间。遇到这种情况,需要先清理不再需要的数据,或者执行降低高水位操作回收部分空间。
降低高水位可以先重组表,再执行表空间命令。重组表能释放页内碎片和空页,降低高水位的前提是表空间尾部有可释放的连续扩展块。示例:
REORG TABLE APP.ORDER_ITEMS; ALTER TABLESPACE USER_TS LOWER HIGH WATER MARK; ALTER TABLESPACE USER_TS REDUCE MAX;
需要注意的是,降低高水位和缩减容器都属于在线操作,但仍会产生 I/O 压力,建议在低峰执行。如果高水位下降不明显,说明尾部仍有活跃数据,此时不能强行缩减,应通过表重组、分区迁移或归档历史数据来降低占用。
自动扩展与写入性能抖动控制
自动存储表空间在批量加载或大事务写入时,如果初始空间较小,数据库会在写入过程中频繁扩展容器。每次扩展都会触发文件系统分配、元数据更新和可能的页表同步,这可能造成应用侧写入延迟突然升高。为了避免这种抖动,一个简单有效的做法是提前分配足够的初始空间。例如预估批量加载数据量为 60G,可以把表空间初始大小设置为 80G,而不是从 1G 开始慢慢增长。
CREATE TABLESPACE LOAD_TS MANAGED BY AUTOMATIC STORAGE INITIALSIZE 80 G AUTORESIZE YES MAXSIZE 200 G NO FILE SYSTEM CACHING;
上面的 NO FILE SYSTEM CACHING 适合大块顺序读写场景,可以绕过操作系统文件缓存,减少双重缓存带来的内存浪费和延迟。对于 OLTP 场景,通常不建议开启该选项,因为小块随机读写更适合依赖文件系统缓存。是否设置应根据业务访问模式判断。
如果数据库已经运行一段时间,且表空间已经自动扩展出大量容器,可以通过重平衡改善数据在路径间的分布。重平衡会移动已有扩展块,使各路径负载更均匀。语句如下:
ALTER TABLESPACE USER_TS REBALANCE;
在执行重平衡前,应确认新增路径所在磁盘的性能与旧路径相当。如果新旧磁盘性能差异较大,完全均衡反而可能拖慢整体吞吐。对于只读历史表空间,不建议进行在线重平衡,因为移动大量冷数据收益有限,只需要让新的写入落在新路径即可。对于活跃表空间,可以在低峰执行,并通过 db2pd -d SAMPLE -tablespaces 观察表空间状态恢复为正常后再开放高并发任务。
生产环境检查清单与应急处理
自动存储表空间带来的管理成本下降并不意味着可以不做容量规划。相反,它的容器自动增长特性让空间问题更隐蔽,等发现时往往已经接近上限。下面列出一套适用于生产环境的常规检查项:
- 每个核心表空间都必须设置 MAXSIZE,禁止无上限自动增长;
- 自动存储路径应分散在不同物理磁盘或存储控制器,避免同一块盘下的多个目录虚假均衡;
- 定期记录
db2pd -d 数据库名 -tablespaces中的 HWM 和 FreePgs; - 文件系统使用率超过 75% 时告警,80% 时准备清理或扩容;
- 批量加载前根据预估数据量预分配表空间大小,减少运行时扩展;
- 事务日志路径不要与自动存储数据路径共用文件系统,防止互相挤占;
- 变更 MAXSIZE、添加路径或执行 REBALANCE 后,对比变更前后监控数据进行确认。
如果已经出现因文件系统写满导致的表空间不可访问,首要任务是恢复空间,而不是直接调整表空间参数。可以先确认应用连接是否产生大量临时表数据,终止异常会话,清理大表历史分区,或移走不再需要的备份和归档文件。临时表空间写满时,可创建新的临时表空间并调整用户或数据库默认临时表空间,必要时重新激活数据库。
CREATE TEMPORARY TABLESPACE TEMP_TS2 MANAGED BY AUTOMATIC STORAGE INITIALSIZE 10 G AUTORESIZE YES MAXSIZE 50 G; ALTER DATABASE SAMPLE ADD STORAGE ON '/db2/emergency';
应急处理时新增路径可以让后续扩展容器写入新文件系统,但不代表旧数据会自动搬移。稳定后还要排查是哪些表或任务导致空间快速增长,必要时调整 MAXSIZE、归档策略和自动扩展频率,避免同类问题反复出现。自动存储表空间最终考验的不是创建语法,而是对路径、高水位和增长边界的持续监控与主动调整。