千家信息网

PostgreSQL bloat 检查与处理

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,1.工具软件pg_bloat_check.py(pg_bloat_check-master.zip)https://github.com/keithf4/pg_bloat_check软件包需求:1).
千家信息网最后更新 2026年10月31日PostgreSQL bloat 检查与处理

1.工具软件


pg_bloat_check.py(pg_bloat_check-master.zip)


https://github.com/keithf4/pg_bloat_check


软件包需求:

1).pgstattuple,Pg源码crontrib目录.

2).python 2.6以上.

3).argparse-1.4.0.tar.gz

4).psycopg2-2.6.2.tar.gz

5).setuptools-23.1.0.tar.gz


2.安装步骤:


1).安装Pg扩展pgstattuple

make

make install


2).安装Python扩展

系统包python-devel

setuptools

argparse

psycopg2

3).下载pg_bloat_check压缩包pg_bloat_check-master.zip

解压并赋予执行权限



3.配置用例执行检查


1).配置设置用例


# su - postgres

$ createdb -p 5431 testdb

$ psql -p 5431 -c "create extension pgstattuple"

$ psql -p 5431 testdb

psql (9.5.2)

Type "help" for help.


testdb=# \dx

List of installed extensions

Name | Version | Schema | Description

-------------+---------+------------+------------------------------

pgstattuple | 1.3 | public | show tuple-level statistics

plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language

(2 rows)


testdb=# create table t_test(id serial primary key, name text);

CREATE TABLE

testdb=# create index idx_t_test_name on t_test(name);

CREATE INDEX

testdb=# insert into t_test select generate_series(1,100000),md5(random()::text);

INSERT 0 100000

testdb=# insert into t_test select generate_series(100001,1000000),md5(random()::text);

INSERT 0 900000

testdb=# truncate t_test ;

TRUNCATE TABLE

testdb=# insert into t_test select generate_series(1,1000000),md5(random()::text);

INSERT 0 1000000

testdb=# truncate t_test ;

TRUNCATE TABLE

testdb=# insert into t_test select generate_series(1,100000),md5(random()::text);

INSERT 0 100000

testdb=# vacuum ANALYZE t_test ;

VACUUM

testdb=# \q




2).创建统计表

$ /home/soft/pg_bloat_check-master/pg_bloat_check.py -c "dbname=testdb port=5431" --create_stats_table


bloat开头的bloat_stats, bloat_indexes, bloat_tables3个表


testdb=# \dt

List of relations

Schema | Name | Type | Owner

--------+---------------+-------+----------

public | bloat_indexes | table | postgres

public | bloat_stats | table | postgres

public | bloat_tables | table | postgres

public | t_test | table | postgres

(4 rows)


testdb=# select objectname, pg_size_pretty(size_bytes) as object_size, pg_size_pretty(free_space_bytes) as reusable_space, pg_size_pretty(dead_tuple_size_bytes) dead_tuple_space, free_percent from bloat_stats ;

objectname | object_size | reusable_space | dead_tuple_space | free_percent

-----------------+-------------+----------------+------------------+--------------

idx_t_test_name | 7424 kB | 2164 kB | 0 bytes | 29.15

t_test_pkey | 2208 kB | 222 kB | 0 bytes | 10.04

(2 rows)


testdb=#


testdb=#

$ /home/soft/pg_bloat_check-master/pg_bloat_check.py -c "dbname=testdb port=5431" -t t_test -z 10485760 -p 5 -s 5242880

1. public.idx_t_test_name.....................................................(19.15%) 1422 kB wasted

2. public.t_test_pkey........................................................(0.04%) 993 bytes wasted

[postgres@localhost ~]$


测试2


testdb=# insert into t_test select generate_series(1,1000000),md5(random()::text);

ERROR: duplicate key value violates unique constraint "t_test_pkey"

DETAIL: Key (id)=(1) already exists.

testdb=# truncate t_test ;

TRUNCATE TABLE

testdb=# insert into t_test select generate_series(1,1000000),md5(random()::text);

INSERT 0 1000000

testdb=# delete from t_test where id <= 900000;

DELETE 900000

testdb=# vacuum ANALYZE t_test ;

VACUUM

testdb=#


[postgres@localhost ~]$ /home/soft/pg_bloat_check-master/pg_bloat_check.py -c "dbname=testdb port=5431" -t t_test -z 10485760 -p 5 -s 5242880

1. public.idx_t_test_name........................................................(81.1%) 59 MB wasted

2. public.t_test_pkey...........................................................(80.88%) 17 MB wasted

[postgres@localhost ~]$



测试3


testdb=# truncate t_test ;

TRUNCATE TABLE

testdb=# insert into t_test select generate_series(1,2000000),md5(random()::text);

INSERT 0 2000000

testdb=# delete from t_test where id <= 1900000;

DELETE 1900000

testdb=# vacuum ANALYZE t_test ;

VACUUM

testdb=# \q


[postgres@localhost ~]$ /home/soft/pg_bloat_check-master/pg_bloat_check.py -c "dbname=testdb port=5431" -t t_test -z 10485760 -p 5 -s 5242880

1. public.idx_t_test_name......................................................(87.94%) 907 MB wasted

2. public.t_test_pkey..........................................................(89.24%) 230 MB wasted

[postgres@localhost ~]$

[postgres@localhost ~]$


3).vacuum full处理

提别提示:

a.步骤进行前要做好相关表备份,以便意外恢复.

b.业务不活动期间,维护窗口时间进行vacuu full tablename.

c.如果要处理的表和索引较多,为了减小维护窗口,不对相关业务进行干预或者调整,需分期分批次按照影响程度和范围依次进行。

d.做好前后数据校验工作,确保回缩成功。


[postgres@localhost ~]$

[postgres@localhost ~]$ psql -p 5431 testdb

psql (9.5.2)

Type "help" for help.


testdb=# vacuum FULL t_test ;

VACUUM

testdb=# \q


4).查询空间回缩情况

[postgres@localhost ~]$ /home/soft/pg_bloat_check-master/pg_bloat_check.py -c "dbname=testdb port=5431" -t t_test

1. public.t_test_pkey........................................................(0.04%) 993 bytes wasted

2. public.idx_t_test_name.......................................................(0.0%) 0 bytes wasted

[postgres@localhost ~]$



5).数据检查正常


[postgres@localhost ~]$ psql -p 5431 testdb

psql (9.5.2)

Type "help" for help.


testdb=# select count(*) from t_test;

count

--------

100000

(1 row)


testdb=# select objectname, pg_size_pretty(size_bytes) as object_size, pg_size_pretty(free_space_bytes) as reusable_space, pg_size_pretty(dead_tuple_size_bytes) dead_tuple_space, free_percent from bloat_stats ;

objectname | object_size | reusable_space | dead_tuple_space | free_percent

-----------------+-------------+----------------+------------------+--------------

idx_t_test_name | 5792 kB | 575 kB | 0 bytes | 9.93

t_test_pkey | 2208 kB | 222 kB | 0 bytes | 10.04

(2 rows)


testdb=#


处理 检查 业务 数据 步骤 软件 测试 配置 不对 意外 成功 分期 备份 工具 工具软件 开头 情况 批次 时间 权限 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 涨乐互联网科技 鸠鸠互联网科技 互联网科技公司税收优惠 科技服务与互联网 互联网 科技创新 奔汉互联网科技 互联网科技创新企业排名 汉立互联网科技有限公司联系电话 湖南洣水互联网科技有限公司扣款 西藏七维空间互联网科技有限公司 互联网金融中的现代科技 福建科技产业互联网发展 深圳市优智互联网科技有限公司 电子科技大学互联网创业大赛 互联网保险科技创业 互联网科技和法律行业 有人说阿里系是互联网科技企业 南京一网一红互联网科技有限公司 互联网科技的前景 颐高云石互联网科技 新华互联网科技 科技互联网产品 互联网科技有限公司 翻译 科技类的互联网平台 华中科技有哪些互联网大佬 顶级互联网科技成果有哪些 中化能源互联网科技招聘 南山科技园互联网公司有哪些 米聚互联网科技南京有限公司排面 神州科技互联网有限公司
0