Azure PostgreSQL开发实例无访问无操作时存储自动增长,寻求解决办法
Azure PostgreSQL无操作时存储自动增长的排查与解决办法
一、先定位存储占用的具体来源
通过以下SQL查询,明确数据库内哪些对象(表、索引、WAL日志等)在占用空间:
- 查看各表的总大小、膨胀率:
SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))) AS total_size, pg_size_pretty(pg_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))) AS table_size, pg_size_pretty(pg_indexes_size(quote_ident(schemaname) || '.' || quote_ident(tablename))) AS index_size, round((1 - (pg_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))::numeric / pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))::numeric)) * 100, 2) AS bloat_percent FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename)) DESC;
- 查看当前数据库的整体存储使用:
SELECT datname, pg_size_pretty(pg_database_size(datname)) AS db_size FROM pg_database WHERE datname = current_database();
- 在Azure门户的服务器存储页面,查看WAL日志、服务器日志的单独占用情况。
二、针对性解决办法
1. WAL日志堆积导致增长
Azure PostgreSQL会保留WAL日志用于备份和高可用,若备份保留期过长或日志未及时清理,会占用大量空间:
- 登录Azure门户,找到你的PostgreSQL实例,进入备份设置,缩短备份保留天数(开发环境建议3-7天即可);
- 若为灵活服务器,进入服务器参数,调整
wal_retention_hours参数(设置为24-72小时即可,避免过长)。
2. 表/索引膨胀(死元组堆积)
即使无业务操作,PostgreSQL的旧行版本(死元组)若未被及时清理,会导致表膨胀:
- 若查询发现某表膨胀率过高,开发环境可手动执行:
VACUUM FULL your_table_name;
注意:
VACUUM FULL会锁表,需在业务空闲时执行;执行后会释放空间给操作系统,存储占用会下降。
- 优化autovacuum参数,让自动清理更及时:在Azure门户服务器参数中,降低
autovacuum_vacuum_threshold(比如设为50)和autovacuum_vacuum_scale_factor(比如设为0.1),让autovacuum更早触发。
3. 服务器日志过多
开启的日志(如错误日志、慢查询日志)若保留时间过长,会占用存储:
- 进入Azure门户服务器日志设置,减少日志保留天数;
- 关闭不必要的日志类型(比如开发环境不需要慢查询日志可直接关闭)。
4. 残留空闲事务
若存在长时间空闲的事务,可能会导致临时资源或WAL日志无法清理:
- 查询空闲事务:
SELECT pid, query_start, state FROM pg_stat_activity WHERE state = 'idle in transaction';
- 杀掉长时间未结束的事务:
SELECT pg_terminate_backend(目标pid);
内容的提问来源于stack exchange,提问作者ndm
相关产品推荐
相关产品推荐

