PostgreSQL bloat 检查与处理

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介:

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=# 

本文转自 pgmia 51CTO博客,原文链接:http://blog.51cto.com/heyiyi/1875439



相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
关系型数据库 数据库 PostgreSQL
PG技术大讲堂 - 第14讲:PostgreSQL 检查点
PG技术大讲堂 - 第14讲:PostgreSQL 检查点
338 1
|
SQL 关系型数据库 数据库
Postgresql lock锁等待检查
查看锁等待sql with t_wait as ( select a.mode,a.locktype,a.database,a.relation,a.page,a.tuple,a.
1885 0
|
关系型数据库 测试技术 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.5. 测试覆盖检查
32.5. 测试覆盖检查 PostgreSQL 源代码可以使用覆盖测试指令编译,因此可以检查哪些部分的代码被回归测试或任何其他测试套件所覆盖。当前使用 GCC 编译时支持该特性,并且需要gcov和lcov程序。
1358 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 13 章 并发控制_13.4. 应用级别的数据完整性检查
13.4. 应用级别的数据完整性检查 13.4.1. 用可序列化事务来强制一致性 13.4.2. 使用显式锁定强制一致性 对于使用读已提交事务的数据完整性强制业务规则非常困难,因为对每一个语句数据视图都在变化,并且如果一个写冲突发生即使一个单一语句也不能把它自己限制到该语句的快照。
1206 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.12. 检查索引使用
11.12. 检查索引使用 尽管PostgreSQL中的索引并不需要维护或调优,但是检查真实的查询负载实际使用了哪些索引仍然非常重要。检查一个独立查询的索引使用情况可以使用EXPLAIN命令,它应用于这种目的的内容在第 14.1 节中有介绍。
1297 0
|
关系型数据库 测试技术 调度
PostgreSQL 9.6 检查点柔性优化(SYNC_FILE_RANGE) - 在单机多实例下的IO Hang问题浅析与优化
背景 PostgreSQL检查点是将shared buffer中的脏页打标记,并集中将其刷到磁盘的动作(fsync)。(期间可能有刷盘的调度,降低当脏页很多时带来的IO影响) 在检查点之外,平时bgwriter进程则会使用bufferio的方式(write)将脏页写到OS的dirty page。
3562 0
|
SQL Cloud Native 关系型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
1304 1