postgresql|数据库|插件学习(一)---postgresql-12的内置插件pg_stat_statements的启用和使用

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: postgresql|数据库|插件学习(一)---postgresql-12的内置插件pg_stat_statements的启用和使用

前言:

       插件就是原软件的扩展功能。postgresql有非常多的各种各样的插件,当然了,插件不安装对于我们使用数据库并没有什么太多的影响,可能只是不舒服一些而已,但有一些插件我们如果有安装,那么,对于数据库的维护,管理工作可能会更加的方便,快捷,pg_stat_statements这个插件就是这样的一个插件,概括起来,这个插件的功能就是提供postgresql监控的,提供了一种跟踪执行的所有SQL语句的统计信息的方法。

       这里多说一句,不像MySQL,开启binlog日志就可以统计慢查询了,postgresql需要启用这个插件来统计慢查询。(通常,postgresql安装完毕后,默认是不启用这个插件的,因为这个插件会消耗系统的内存,因此。如果数据库负载平时就比较重的情况下,谨慎开启此插件)

       OK,下面将就如何编译安装此插件并开启插件以及最后的使用此插件达到我们的数据库监控的目的做一个简单的介绍。

本文使用的数据库示例的版本是postgresql-12.5,安装方式为源码编译安装,操作系统是centos7

一,

源码安装包和安装目录

源码包指的是postgresql-12.5.tar.bz2

安装目录如下:

PGDATA=/opt/pgsql/data
export PGDATA
PGHOME=/opt/pgsql
export PGHOME
PATH=$PATH:$PGHOME/bin:$PGDATA
export PATH PGDATA

二,

编译安装

源码包内有如下目录:

[root@centos61 postgresql-12.5]# ll
total 1216
-rw-r--r--.  1 1107 1107    522 Nov 10  2020 aclocal.m4
drwxrwxrwx.  2 1107 1107   4096 Nov 10  2020 config
-rw-r--r--.  1 root root 434063 May 20 20:17 config.log
-rwxr-xr-x.  1 root root  39995 May 20 20:17 config.status
-rwxr-xr-x.  1 1107 1107 575329 Nov 10  2020 configure
-rw-r--r--.  1 1107 1107  84108 Nov 10  2020 configure.in
drwxrwxrwx. 56 1107 1107   4096 Nov 10  2020 contrib
-rw-r--r--.  1 1107 1107   1192 Nov 10  2020 COPYRIGHT
drwxrwxrwx.  3 1107 1107     87 Nov 10  2020 doc
-rw-r--r--.  1 root root   3998 May 20 20:17 GNUmakefile
-rw-r--r--.  1 1107 1107   3998 Nov 10  2020 GNUmakefile.in
-rw-r--r--.  1 1107 1107    284 Nov 10  2020 HISTORY
-rw-r--r--.  1 1107 1107  61479 Nov 10  2020 INSTALL
-rw-r--r--.  1 1107 1107   1665 Nov 10  2020 Makefile
-rw-r--r--.  1 1107 1107   1212 Nov 10  2020 README
drwxrwxrwx. 16 1107 1107   4096 May 20 20:17 src

contrib目录就是插件目录,进入该目录编译安装即可(make和make install):

[root@centos61 pg_stat_statements]# pwd
/root/postgresql-12.5/contrib/pg_stat_statements
[root@centos61 pg_stat_statements]# ll
total 240
drwxrwxrwx. 2 1107 1107    36 Nov 10  2020 expected
-rw-r--r--. 1 1107 1107  1128 Nov 10  2020 Makefile
-rw-r--r--. 1 1107 1107  1246 Nov 10  2020 pg_stat_statements--1.0--1.1.sql
-rw-r--r--. 1 1107 1107  1336 Nov 10  2020 pg_stat_statements--1.1--1.2.sql
-rw-r--r--. 1 1107 1107  1454 Nov 10  2020 pg_stat_statements--1.2--1.3.sql
-rw-r--r--. 1 1107 1107   345 Nov 10  2020 pg_stat_statements--1.3--1.4.sql
-rw-r--r--. 1 1107 1107   305 Nov 10  2020 pg_stat_statements--1.4--1.5.sql
-rw-r--r--. 1 1107 1107  1427 Nov 10  2020 pg_stat_statements--1.4.sql
-rw-r--r--. 1 1107 1107   376 Nov 10  2020 pg_stat_statements--1.5--1.6.sql
-rw-r--r--. 1 1107 1107   806 Nov 10  2020 pg_stat_statements--1.6--1.7.sql
-rw-r--r--. 1 1107 1107 92975 Nov 10  2020 pg_stat_statements.c
-rw-r--r--. 1 1107 1107    48 Nov 10  2020 pg_stat_statements.conf
-rw-r--r--. 1 1107 1107   191 Nov 10  2020 pg_stat_statements.control
-rw-r--r--. 1 root root 53528 May 20 20:28 pg_stat_statements.o
-rwxr-xr-x. 1 root root 43992 May 20 20:28 pg_stat_statements.so
-rw-r--r--. 1 1107 1107   449 Nov 10  2020 pg_stat_statements--unpackaged--1.0.sql
drwxrwxrwx. 2 1107 1107    36 Nov 10  2020 sql
[root@centos61 pg_stat_statements]# make
make -C ../../src/backend generated-headers
make[1]: Entering directory `/root/postgresql-12.5/src/backend'
make -C catalog distprep generated-header-symlinks
make[2]: Entering directory `/root/postgresql-12.5/src/backend/catalog'
make[2]: Nothing to be done for `distprep'.
make[2]: Nothing to be done for `generated-header-symlinks'.
make[2]: Leaving directory `/root/postgresql-12.5/src/backend/catalog'
make -C utils distprep generated-header-symlinks
make[2]: Entering directory `/root/postgresql-12.5/src/backend/utils'
make[2]: Nothing to be done for `distprep'.
make[2]: Nothing to be done for `generated-header-symlinks'.
make[2]: Leaving directory `/root/postgresql-12.5/src/backend/utils'
make[1]: Leaving directory `/root/postgresql-12.5/src/backend'
[root@centos61 pg_stat_statements]# make install
make -C ../../src/backend generated-headers
make[1]: Entering directory `/root/postgresql-12.5/src/backend'
make -C catalog distprep generated-header-symlinks
make[2]: Entering directory `/root/postgresql-12.5/src/backend/catalog'
make[2]: Nothing to be done for `distprep'.
make[2]: Nothing to be done for `generated-header-symlinks'.
make[2]: Leaving directory `/root/postgresql-12.5/src/backend/catalog'
make -C utils distprep generated-header-symlinks
make[2]: Entering directory `/root/postgresql-12.5/src/backend/utils'
make[2]: Nothing to be done for `distprep'.
make[2]: Nothing to be done for `generated-header-symlinks'.
make[2]: Leaving directory `/root/postgresql-12.5/src/backend/utils'
make[1]: Leaving directory `/root/postgresql-12.5/src/backend'
/usr/bin/mkdir -p '/usr/local/pgsql/lib'
/usr/bin/mkdir -p '/usr/local/pgsql/share/extension'
/usr/bin/mkdir -p '/usr/local/pgsql/share/extension'
/usr/bin/install -c -m 755  pg_stat_statements.so '/usr/local/pgsql/lib/pg_stat_statements.so'
/usr/bin/install -c -m 644 ./pg_stat_statements.control '/usr/local/pgsql/share/extension/'
/usr/bin/install -c -m 644 ./pg_stat_statements--1.4.sql ./pg_stat_statements--1.6--1.7.sql ./pg_stat_statements--1.5--1.6.sql ./pg_stat_statements--1.4--1.5.sql ./pg_stat_statements--1.3--1.4.sql ./pg_stat_statements--1.2--1.3.sql ./pg_stat_statements--1.1--1.2.sql ./pg_stat_statements--1.0--1.1.sql ./pg_stat_statements--unpackaged--1.0.sql  '/usr/local/pgsql/share/extension/'

观察发现,编译的内容在/usr/local/pgsql目录下,因此,将以下文件拷贝到/opt/pgsql目录下即可:

[root@centos61 pgsql]# tree -a ./
./
├── lib
│   ├── dblink.so
│   └── pg_stat_statements.so
└── share
    └── extension
        ├── dblink--1.0--1.1.sql
        ├── dblink--1.1--1.2.sql
        ├── dblink--1.2.sql
        ├── dblink.control
        ├── dblink--unpackaged--1.0.sql
        ├── pg_stat_statements--1.0--1.1.sql
        ├── pg_stat_statements--1.1--1.2.sql
        ├── pg_stat_statements--1.2--1.3.sql
        ├── pg_stat_statements--1.3--1.4.sql
        ├── pg_stat_statements--1.4--1.5.sql
        ├── pg_stat_statements--1.4.sql
        ├── pg_stat_statements--1.5--1.6.sql
        ├── pg_stat_statements--1.6--1.7.sql
        ├── pg_stat_statements.control
        └── pg_stat_statements--unpackaged--1.0.sql
3 directories, 17 files
[root@centos61 pgsql]# pwd
/usr/local/pgsql
[root@centos61 pgsql]# ls
lib  share
[root@centos61 pgsql]# cp lib/* /opt/pgsql/lib/
[root@centos61 pgsql]# cp share/* /opt/pgsql/share/

二,

激活pg_stat_statements插件的准备工作

编辑postgresql.conf文件,准备开启此插件:

shared_preload_libraries = 'pg_stat_statements' # (change requires restart)
pg_stat_statements.max = 10000
pg_stat_statements.track = all
track_activity_query_size = 4096

以上参数的说明:

  • pg_stat_statements.max(integer)
          pg_stat_statements.max是最大追踪的统计数据数量(即,视图中的最大行数)。如果数据量大于最大值,那么执行最少的语句将会被丢弃(本人测试,如果语句执行次数都为1时,其次是时间久的数据被丢弃),这个值默认是1000,这个变量在服务启动前设置。
  • pg_stat_statements.track(enum)
           pg_stat_statements.track控制统计数据规则,两个值top和all,top用于追踪top-level statement(直接由客户端方发送的,all还会追踪嵌套的statements(例如在函数中调用的statements,本例使用的是all)
  • pg_stat_statements.track_utility(boolen)
          pg_stat_statements.track_utility控制是否跟踪公共程序命令(utility commands),公共程序命令是SELECT/INSERT/UPDATE/DELETE以外的命令,默认值是开启,只有超级用户可以更改此设置。(因为默认是开启,所以这里不做显式设置)
  • pg_stat_statements.save(boolean)
          pg_stat_statements.save指定在服务器关闭时,是否保存统计信息。如果设置off,服务关闭时,统计信息将不会保存。默认值是on。这个值只能够在postgresql.conf中或者命令行设置。(因为默认是开启,所以这里不做显式设置)
  • track_activity_query_size

该模块需要额外的共享内存,内存大小大致为pg_stat_statements.max* track_activity_query_size。要注意的是,一旦模块被加载,即使pg_stat_statements.track设置为none,共享内存都会被消耗。假如 pg_stat_statements.max 值为 10000, track_activity_query_size值为4096, 也就消耗了 40 M内存。(本例为40M共享内存)

三,

命令行激活插件

postgres=# create extension pg_stat_statements;
ERROR:  extension "pg_stat_statements" already exists

(已经激活过了)

那么,激活过后的会出现一个视图和两个函数:

#注,可以看到dx命令后的插件说明,此插件的版本是1.7

postgres=# \dx
                                       List of installed extensions
        Name        | Version |   Schema   |                         Description                          
--------------------+---------+------------+--------------------------------------------------------------
 pg_stat_statements | 1.7     | public     | track execution statistics of all SQL statements executed
 plpgsql            | 1.0     | pg_catalog | PL/pgSQL procedural language
postgres=# \dv
               List of relations
 Schema |        Name        | Type |  Owner   
--------+--------------------+------+----------
 public | pg_stat_statements | view | postgres
(1 row)

四,

使用此插件

当然了,在使用以下查询的时候,最好是有一些实际的查询SQL语句执行,否则会看不出来效果。

最耗 IO SQL

执行如下命令,查询单次调用最耗 IO SQL TOP 5。

  1. select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time)/calls desc limit 5;

执行如下命令,查询总最耗 IO SQL TOP 5。

  1. select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time) desc limit 5;

最耗时 SQL

执行如下命令,查询单次调用最耗时 SQL TOP 5。

  1. select userid::regrole, dbid, query from pg_stat_statements order by mean_time desc limit 5;

执行如下命令,查询总最耗时 SQL TOP 5。

  1. select userid::regrole, dbid, query from pg_stat_statements order by total_time desc limit 5;

响应时间抖动最严重 SQL

执行如下命令,查询响应时间抖动最严重 SQL。

  1. select userid::regrole, dbid, query from pg_stat_statements order by stddev_time desc limit 5;

最耗共享内存 SQL

执行如下命令,查询最耗共享内存 SQL。

  1. select userid::regrole, dbid, query from pg_stat_statements order by (shared_blks_hit+shared_blks_dirtied) desc limit 5;

最耗临时空间 SQL

执行如下命令,查询最耗临时空间 SQL。

  1. select userid::regrole, dbid, query from pg_stat_statements order by temp_blks_written desc limit 5;

小结:

postgresql的插件种类非常多,但pg_stat_statements这个插件是非常有用的基础插件,此插件安装是比较简单的,但需要注意,postgresql.conf 文件内的关于此插件的任何改动都需要重启数据库才可以生效。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
12天前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
86 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
8天前
|
关系型数据库 分布式数据库 数据库
PostgreSQL+Citus分布式数据库
PostgreSQL+Citus分布式数据库
39 15
|
17天前
|
SQL 关系型数据库 数据库
PostgreSQL性能飙升的秘密:这几个调优技巧让你的数据库查询速度翻倍!
【10月更文挑战第25天】本文介绍了几种有效提升 PostgreSQL 数据库查询效率的方法,包括索引优化、查询优化、配置优化和硬件优化。通过合理设计索引、编写高效 SQL 查询、调整配置参数和选择合适硬件,可以显著提高数据库性能。
108 1
|
20天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
80 4
|
1月前
|
SQL NoSQL 关系型数据库
数据库学习
【10月更文挑战第8天】
20 1
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
61 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
64 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
1月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
23 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
1月前
|
SQL 关系型数据库 数据库
使用 PostgreSQL 和 Python 实现数据库操作
【10月更文挑战第2天】使用 PostgreSQL 和 Python 实现数据库操作
|
1月前
|
关系型数据库 MySQL 数据库
mysql关系型数据库的学习
mysql关系型数据库的学习
18 0