问题现象
应用写入数据时报错:ERROR: could not extend file "base/16384/2619": No space left on device,同时磁盘使用率 100%。
紧急处理步骤
- 立即释放空间:清理过期 WAL 日志和临时文件。
cd /data/kingbase/data/sys_wal # 查看 WAL 大小 du -sh . # 在数据库中执行 checkpoint 后可安全删除已归档的旧 WAL SELECT sys_switch_wal(); -- 触发 WAL 切换 SELECT sys_walfile_name(sys_current_wal_lsn()); -- 当前 WAL 位置
- 清理膨胀的表和死元组
-- 查找占用最大空间的表 SELECT schemaname, relname, sys_size_pretty(sys_total_relation_size(relid)) AS total_size FROM sys_stat_user_tables ORDER BY sys_total_relation_size(relid) DESC LIMIT 10; -- 执行 VACUUM FULL 回收膨胀空间(会短暂锁表) VACUUM FULL big_table;
- 扩展表空间:将数据目录迁移或添加软链接到空间更大的磁盘。
# 添加新表空间(指向新磁盘路径) CREATE TABLESPACE ts_data2 LOCATION '/mnt/disk2/kingbase/data2'; # 将大表迁移到新表空间 ALTER TABLE orders SET TABLESPACE ts_data2;
- 配置自动清理(autovacuum)防止再次发生
# kingbase.conf 中确认 autovacuum 已开启 autovacuum = on autovacuum_vacuum_scale_factor = 0.05 # 5% 死元组触发 autovacuum_analyze_scale_factor = 0.02
VACUUM FULL 会对目标表加排他锁,建议在业务低峰期执行。对于不能停业务的情况,优先使用不加锁的普通 VACUUM,再逐步替换为普通 VACUUM + 索引 REINDEX CONCURRENTLY。