共计 1349 个字符,预计需要花费 4 分钟才能阅读完成。
VACUUM FULL 是 KingbaseES 中用于深度回收表与索引磁盘空间、消除数据膨胀的运维命令,是普通 VACUUM 的强化版本。
KingbaseES 中数据被删除 / 更新后,旧数据(死元组 dead tuple)不会立即从物理文件中清除,只是被标记为「不可见」。
- 普通 VACUUM:仅将死元组标记为「可复用」,表文件的物理大小不变,释放的空间只能被后续新增数据复用,不会还给操作系统。
- VACUUM FULL:采用重建式收缩机制,真正实现空间释放:
- 创建全新的表文件和索引文件;
- 将原表中所有存活的有效数据完整复制到新文件中,彻底剔除死元组、碎片和空洞;
- 替换旧文件,将多余的磁盘空间直接释放给操作系统。
普通 VACUUM 与 VACUUM FULL 核心对比
| 对比维度 | 普通 VACUUM | VACUUM FULL |
|---|---|---|
| 空间回收效果 | 仅标记死元组可复用,表物理大小不变,不释放给操作系统 | 重建表文件,彻底收缩体积,空闲空间直接还给操作系统 |
| 锁级别 | 共享锁,执行期间不阻塞表的正常读写 | ACCESS EXCLUSIVE 排它锁,执行期间完全阻塞该表所有读写操作 |
| 执行速度 | 快,增量处理死元组,资源占用低 | 慢,全量复制数据,大表可能执行数小时 |
| 磁盘额外开销 | 极低,仅产生少量 WAL 日志 | 需要占用与原表大小相当的额外磁盘空间存放临时文件 |
| 使用频率 | 日常高频维护(autovacuum 自动后台执行) | 低频急救操作,仅在严重膨胀时使用 |
| 业务影响 | 几乎无感知,后台轻量运行 | 表级业务中断,等同于停机维护 |
核心作用与适用场景
核心作用
- 真正释放磁盘空间,收缩表和索引的物理文件体积;
- 根治表 / 索引膨胀,解决「实际数据少、占用磁盘大」的问题;
- 数据紧凑排列后,全表扫描、索引扫描的 IO 开销降低,查询性能有一定提升。
适用场景
- 表经历过批量删除、大量更新后出现严重膨胀,实际数据量远小于表文件大小,磁盘空间紧张;
- 索引严重碎片化、膨胀,普通
REINDEX无法满足空间收缩需求; - 历史数据归档清理后,需要收缩表体积释放磁盘;
- 测试环境重置表空间,为下一轮压测准备干净的数据集。
注意事项
1. 全程锁表,业务完全中断
执行期间会对表加
ACCESS EXCLUSIVE 排它锁,所有 SELECT、INSERT、UPDATE、DELETE 操作都会被阻塞,直到执行完成。生产业务库严禁在业务高峰期执行,必须在维护窗口操作。2. 需要充足的剩余磁盘空间
执行过程需要创建临时新表文件,要求磁盘剩余空间 ≥ 当前表的实际大小。空间不足会导致执行失败,且已占用的临时空间不会自动释放。
3. 大表执行时长不可控
几十 GB 以上的大表,执行时长可能从几十分钟到数小时不等,期间表完全不可用。执行前务必评估业务停机窗口。
4. 主从集群会放大延迟
主库执行 VACUUM FULL 会生成巨量 WAL 日志,同步到备库后会造成备库回放延迟飙升,备库只读业务会受长时间影响。
5. 禁止全库批量执行
不要直接执行
VACUUM FULL; 对全库所有表操作,会导致全库锁表、业务整体瘫痪。必须逐表评估、逐表执行。语法
-- 收缩单张表(含表上所有索引)
VACUUM FULL 表名;
-- 收缩表并输出执行进度详情
VACUUM FULL VERBOSE 表名;
-- 收缩表同时更新统计信息
VACUUM FULL ANALYZE 表名;
-- 仅收缩单个索引(不推荐,一般随表一起处理)
VACUUM FULL 索引名;正文完
发表至: 资源
近一天内

