You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL RDS磁盘数据库大小与实际表大小差异过大问题排查

数据库总大小与对象总和差异过大的排查方案

执行以下查询得到数据库总大小为459GB:

SELECT
    pg_size_pretty(pg_database_size('MY_DB')) AS total_database_size;

但执行表大小统计语句后,结果总和不足10GB:

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_relation_size(C.oid)) AS "size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  ORDER BY pg_relation_size(C.oid) DESC;

已执行vacuum analyse无效果,补充环境信息:

  • 使用DBT(会创建临时表,当前未运行);
  • 使用Fivetran导入数据。

可能原因及排查步骤

1. 统计范围不完整

当前查询仅计算了表本身的大小(pg_relation_size),但数据库总大小包含索引、TOAST大字段表、序列、物化视图等所有对象,以及WAL日志、临时文件。先修改查询统计完整用户对象大小:

SELECT 
    nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  AND relkind IN ('r', 'i', 'm') -- 覆盖表、索引、物化视图
ORDER BY pg_total_relation_size(C.oid) DESC;

若总和仍远小于459GB,继续排查以下点。

2. WAL日志未及时归档

PostgreSQL的pg_wal目录存储事务日志,若归档配置失效或同步异常,WAL文件会持续堆积占用空间。

  • 检查WAL目录大小:
cd $(psql -d MY_DB -t -c "SHOW data_directory;")
du -sh pg_wal/
  • 验证归档配置:
SHOW archive_mode;
SHOW archive_command;

确保archive_mode为on且archive_command可正常执行,修复后用pg_archivecleanup工具清理过期WAL(禁止手动删除文件)。

3. 残留临时对象或长事务阻塞回收

  • DBT或Fivetran异常终止时,可能残留未清理的临时表;

  • 长事务持有快照,会导致DROP后的对象无法被VACUUM回收。

  • 查询当前临时对象:

SELECT nspname || '.' || relname AS temp_relation,
       pg_size_pretty(pg_total_relation_size(C.oid)) AS size
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname LIKE 'pg_temp%';

若存在大量临时对象,重启PostgreSQL可清空所有临时对象。

  • 查询长事务:
SELECT pid, now() - xact_start AS duration, query
FROM pg_stat_activity
WHERE state = 'idle in transaction'
ORDER BY duration DESC;

终止长时间idle的事务后,在业务低峰执行VACUUM FULL(注意该操作会锁表)。

4. Fivetran同步日志或中间表占用

Fivetran通常会创建fivetran_log等专属schema,存储同步日志、错误记录或中间表,这些可能占用大量空间:

SELECT 
    nspname AS schema_name,
    pg_size_pretty(sum(pg_total_relation_size(C.oid))) AS schema_total_size
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname LIKE 'fivetran%'
GROUP BY nspname;

若日志表过大,可按Fivetran文档调整日志保留策略或清理旧记录。

5. 数据目录其他异常文件

扫描数据库数据目录下所有子目录的大小,定位异常占用:

cd $(psql -d MY_DB -t -c "SHOW data_directory;")
du -sh */

重点检查pg_blobs(大对象存储)、pg_stat_tmp等目录是否异常。


内容的提问来源于stack exchange,提问作者Eitank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:18:31