前言:
插件就是原软件的扩展功能。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.sql3 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=# \dxList of installed extensionsName | Version | Schema | Description
--------------------+---------+------------+--------------------------------------------------------------pg_stat_statements | 1.7 | public | track execution statistics of all SQL statements executedplpgsql | 1.0 | pg_catalog | PL/pgSQL procedural languagepostgres=# \dvList of relationsSchema | Name | Type | Owner
--------+--------------------+------+----------public | pg_stat_statements | view | postgres
(1 row)
四,
使用此插件
当然了,在使用以下查询的时候,最好是有一些实际的查询SQL语句执行,否则会看不出来效果。
最耗 IO SQL
执行如下命令,查询单次调用最耗 IO SQL TOP 5。
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。
select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time) desc limit 5;
最耗时 SQL
执行如下命令,查询单次调用最耗时 SQL TOP 5。
select userid::regrole, dbid, query from pg_stat_statements order by mean_time desc limit 5;
执行如下命令,查询总最耗时 SQL TOP 5。
select userid::regrole, dbid, query from pg_stat_statements order by total_time desc limit 5;
响应时间抖动最严重 SQL
执行如下命令,查询响应时间抖动最严重 SQL。
select userid::regrole, dbid, query from pg_stat_statements order by stddev_time desc limit 5;
最耗共享内存 SQL
执行如下命令,查询最耗共享内存 SQL。
select userid::regrole, dbid, query from pg_stat_statements order by (shared_blks_hit+shared_blks_dirtied) desc limit 5;
最耗临时空间 SQL
执行如下命令,查询最耗临时空间 SQL。
select userid::regrole, dbid, query from pg_stat_statements order by temp_blks_written desc limit 5;
小结:
postgresql的插件种类非常多,但pg_stat_statements这个插件是非常有用的基础插件,此插件安装是比较简单的,但需要注意,postgresql.conf 文件内的关于此插件的任何改动都需要重启数据库才可以生效。