进阶数据库系列(二十六):PostgreSQL 数据库监控管理

前面介绍了 PostgreSQL 数据库备份恢复数据目录同步工具 pg_rewind、数据库作业调度工具、性能优化日志与日常巡检运维管理等相关的知识点,今天我将详细的为大家介绍 PostgreSQL 数据库监控管理相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!

服务器配置

服务器配置的文件

在数据库集群中,有3个配置文件,分别是:postgresql.confpg_hba.confpg_ident.conf。其中postgresql.conf为服务器主要的配置文件,pg_hba.conf是客户端认证配置文件,pg_ident.conf用来配置哪些操作系统用户可以映射为数据库用户。

连接与认证

参考文章:

资源消耗

服务器的运行会消耗一定的资源,通过设置服务器的参数,可以提示服务器的性能。包括内存、自由空间映射、内核资源使用、基于开销的清理延迟和后端写进程。

自由空间映射用于跟踪数据库中未使用空间的位置。不在映射表里面的自由空间是不能重复使用的,通过合理地设置,可以提高磁盘的利用率。

在VACUUM和ANALYZE命令执行过程中,系统维护一个内部的记数器,跟踪所执行的各种I/O操作的开销。

在 PostgreSQL 中,有一个独立的服务器进程,叫做后端写进程,它唯一的功能就是发出写“脏”共享缓冲区的命令。这么做的目的是让持有用户查询的服务器进程应该很少或者几乎不等待写动作的发生,因为后端写进程会做这件事情。这样的安排同样也减少了检查点造成的性能下降。

预写式日志

预写式日志的设置主要包括对预写式日志的基本设置、检查点设置和归档设置等。

查询规划

在PostgreSQL中,查询优化器选择查询规划时,有时候并不是最优的方法。数据库管理员可以通过设置配置参数,强制优化器选择一个更好的查询规划。

错误报告和日志

数据库管理员也许想知道错误报告和日志记录在什么地方,什么时间开始记录的和记录了什么等等。

运行时统计

在 PostgreSQL 中,如果启用了统计搜集,那么生成的数据可以通过 pg_stat 和 pg_statio 系统视图查看服务器的统计信息。

自动清理

数据库管理员可以通过设置自动清理的缺省行为,从而提高工作效率。

客户端连接缺省

数据库管理员可以设置客户端连接时的语句行为、区域和格式化等。

锁管理

在数据库系统运行的过程中,会产生各种各样的锁。管理员可以通过设置锁管理的相关参数,从而提高服务器的高可用性。

版本和平台兼容性

PostgreSQL有很多版本,管理员可以设置各个版本之间兼容性。另外,PostgreSQL可以在不同的平台上安装,管理员可以设置各个平台之间兼容性更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

监控数据库的活动

配置统计收集器

PostgreSQL的统计收集器是一个支持收集和汇报服务器活跃性信息的子系统。目前,这个收集器可以给出对表和索引的访问计数,包括磁盘块的数量和独立行的项。PostgreSQL 还可以判断当前其它服务器进程正在执行的命令是什么。这个特性独立于统计收集器子系统,可以单独地被启用或禁用。

因为统计收集给查询处理增加了一些开销,所以可以启用或禁用统计收集。这是由配置参数控制的,通常在 postgresql.conf 里设置。

查看收集到的统计信息

PostgreSQL提供了预定义的视图用于显示统计收集的结果。

在使用统计观察当前系统活跃性的时候,必须意识到这些信息并不是实时更新的。每个独立的服务器进程只是在准备进入空闲状态的时候才向收集器传送新的块和行访问计数;因此正在处理的查询或者事务并不影响显示出来的总数。

另外一个需要着重指出的是,在请求服务器进程显示任何这些统计信息的时候,它首先抓取收集器进程发出的最新报 告,然后就拿这些数据作为所有统计视图和函数的快照,直到它当前的事务结束。因此统计信息在当前事务的持续期间内不会改变。

另外,可以使用底层的统计函数制作自定义的视图。这些底层统计访问函数和标准视图里使用的是一样的。

监控磁盘的使用

监控磁盘的使用量
  • 使用磁盘空间函数

  • 使用 VACUUM 信息

VACUUM 命令回收已删除行占据的存储空间。在 PostgreSQL 的操作中,那些已经被删除或者更新过的行,并没有从它们所属的表中物理删除,这些数据在完成 VACUUM 之前它们仍然存在。因此有必要周期地运行 VACUUM,特别是在经常更新的表上。VACUUM 命令可以选择分析一个特定的数据表,如果没有指定数据表,VACUUM处理当前数据库里每个表。具体语法格式如下。

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]
磁盘满导致的失效

一个数据库管理员最重要的磁盘监控任务就是确保磁盘不会写满。磁盘写满可能不会导致数据的丢失,但它肯定会导致系统进一步使用的问题。如果WAL文件也在同一个磁盘上(缺省配置就是这样),则会发生数据库服务器恐慌,并且停止运行。如果不能通过删除其它东西来释放磁盘空间,那么可以通过使用表空间把一些数据库文件移动到其它文件系统上去。

PostgreSQL 里的表空间允许数据库管理员在文件系统里定义那些代表数据库对象的文件存放位置。一旦创建了表空间,那么就可以在创建数据库对象的时候引用它。

通过使用表空间,管理员可以控制一个 PostgreSQL 安装的磁盘布局。更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

下面介绍一下常用的监控指标。最关键的一些数据库健康指标,趋势监测。

总连接数

主要看趋势,直接与业务量挂钩,如果连接数接近max_connection水位,需要注意。同时连接数应与数据库主机可用内存挂钩,每个连接保守估计10MB内存开销(这里还未计算SYSCACHE,RELCACHE)。

select count(*) from pg_stat_activity ;

演示,打印每秒的总连接数。

psql  
  
select count(*) from pg_stat_activity ;  
  
\watch 1

N秒内新建的连接数

主要看趋势,直接与业务量挂钩,  如果突发大量连接,可能是新增了业务服务器,或者是性能抖动过导致业务大量新建连接满足并发的请求。突然连接数下降,可能原因是业务服务器突然释放连接,或者业务服务器挂了。

select count(*) from pg_stat_activity where now()-backend_start > '? second';

演示,打印每秒的5秒内新建连接数。

psql  
  
select count(*) from pg_stat_activity where now()-backend_start > '5 second';  
  
\watch 1

SQL活跃统计

1、需要加载 pg_stat_statements,如果需要跟踪IO时间,需要开启track_io_timing

同时需要注意,由于 pg_stat_statements 跟踪的SQL有限,最近未访问过的SQL的跟踪信息可能被抛弃。所以统计并不是非常的精准。

postgres=# \d pg_stat_statements
                    View "public.pg_stat_statements"
       Column        |       Type       | Collation | Nullable | Default 
---------------------+------------------+-----------+----------+---------
 userid              | oid              |           |          | 
 dbid                | oid              |           |          | 
 queryid             | bigint           |           |          | 
 query               | text             |           |          | 
 calls               | bigint           |           |          | 
 total_time          | double precision |           |          | 
 min_time            | double precision |           |          | 
 max_time            | double precision |           |          | 
 mean_time           | double precision |           |          | 
 stddev_time         | double precision |           |          | 
 rows                | bigint           |           |          | 
 shared_blks_hit     | bigint           |           |          | 
 shared_blks_read    | bigint           |           |          | 
 shared_blks_dirtied | bigint           |           |          | 
 shared_blks_written | bigint           |           |          | 
 local_blks_hit      | bigint           |           |          | 
 local_blks_read     | bigint           |           |          | 
 local_blks_dirtied  | bigint           |           |          | 
 local_blks_written  | bigint           |           |          | 
 temp_blks_read      | bigint           |           |          | 
 temp_blks_written   | bigint           |           |          | 
 blk_read_time       | double precision |           |          | 
 blk_write_time      | double precision |           |          |

QPS

QPS指标来自 pg_stat_statements,由于这个插件有一个STATEMENT采集上限,可配置,例如最多采集1000条SQL,如果有新的SQL被采集到时,并且1000已用完,则会踢掉最老的SQL。所以我们这里统计的QPS并不是完全精确,不过还好PG内部会自动合并SQL,把一些条件替换成变量,这样即使不使用绑定变量,也能追踪到很多SQL。

对于业务SQL非常繁多并且大多数都是活跃SQL的场景,可以适当调大pg_stat_statements的track数,提高精准度。

除此之外,可以改进 pg_stat_statements 的功能,直接统计精准的QPS。主要看趋势,直接与业务量挂钩。我们可以使用 pg_stat_statements 分析查询

with                                               
a as (select sum(calls) s, sum(case when ltrim(query,' ') ~* '^select' then calls else 0 end) q from pg_stat_statements),   
b as (select sum(calls) s, sum(case when ltrim(query,' ') ~* '^select' then calls else 0 end) q from pg_stat_statements , pg_sleep(1))   
select   
b.s-a.s,          -- QPS  
b.q-a.q,          -- 读QPS  
b.s-b.q-a.s+a.q   -- 写QPS  
from a,b;

如果只想看QPS,使用

with                                               
a as (select sum(calls) s from pg_stat_statements),   
b as (select sum(calls) s from pg_stat_statements , pg_sleep(1))   
select   
b.s-a.s          -- QPS  
from a,b;

演示,打印每秒的QPS。

psql  
  
with                                               
a as (select sum(calls) s from pg_stat_statements),   
b as (select sum(calls) s from pg_stat_statements , pg_sleep(1))   
select   
b.s-a.s          -- QPS  
from a,b;  
  
\watch 0.000001
每秒处理了多少行

每秒处理了多少行,包括写入,读取,更新,删除等操作。

两次快照相减除以时间间隔

sum(pg_stat_statements.rows)
共享缓冲区:每秒缓存命中、未命中读
shared_blks_hit     | bigint           |           |          | 
shared_blks_read    | bigint           |           |          |
共享缓冲区:每秒产生多少脏页
shared_blks_dirtied | bigint           |           |          |
共享缓冲区:每秒异步write多少脏页
shared_blks_written | bigint           |           |          |
进程本地缓冲区:每秒缓存命中、未命中读
local_blks_hit      | bigint           |           |          | 
local_blks_read     | bigint           |           |          |
进程本地缓冲区:每秒产生多少脏页
local_blks_dirtied  | bigint           |           |          |
进程本地缓冲区:每秒异步write多少脏页
local_blks_written  | bigint           |           |          |
临时文件每秒读
temp_blks_read      | bigint           |           |          |
临时文件每秒写
temp_blks_written   | bigint           |           |          |
两次快照之间的读数据块耗时
blk_read_time       | double precision |           |          |
两次快照之间的写数据块耗时
blk_write_time      | double precision |           |          |

active session

主要看趋势,直接与业务量挂钩, 如果活跃会话数长时间超过CPU核数时,说明数据库响应变慢了,需要深刻关注。

select count(*) from pg_stat_activity where state='active';

演示,打印每秒的活跃会话数。

psql  
  
select count(*) from pg_stat_activity where state='active';  
  
\watch 1

更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

平均RT

活跃会话/qps = RT(秒)

long query

当前系统中执行时间超过N秒的SQL有多少条,LONG QUERY与活跃会话的比例说明当前LONG SQL的占比。占比越高,说明该系统可能偏向OLAP,占比越低,说明该系统偏向OLTP业务。

select count(*) from pg_stat_activity where state='active' and now()-query_start > interval '? second';

演示,打印每秒系统中执行时间超过5秒的SQL有多少条。

psql  
  
select count(*) from pg_stat_activity where state='active' and now()-query_start > interval '5 second';  
  
\watch 1

long transaction

当前系统中N秒未结束的事务有多少条

select count(*) from pg_stat_activity where now()-xact_start > interval '? second';

演示,打印每秒系统中5秒未结束的事务有多少条

psql  
  
select count(*) from pg_stat_activity where now()-xact_start > interval '5 second';  
  
\watch 1

idle in transaction

当前系统中在事务中并且处于空闲状态的会话有多少,很多,说明业务端的处理可能比较慢,如果结合锁等待发现有大量锁等待,并且活跃会话数有突增,可能需要关注并排查业务逻辑的问题。

select count(*) from pg_stat_activity where state='idle in transaction';

演示,打印每秒系统中在事务中并且处于空闲状态的会话有多少

psql  
  
select count(*) from pg_stat_activity where state='idle in transaction';  
  
\watch 1

long idle in transaction

当前系统中,有多少长期(超过N秒)处于空闲的事务。如果有较多这样的事务,说明业务端的处理时间超过N秒的情况非常普遍,应该尽快排查业务。

比如前端开启了游标,等待用户的翻页动作,用户可能开小差了。又比如业务上使用了一些交互模式,等用户的一些输入等。

这种情况应该尽量避免,否则长时间占用连接资源。

select count(*) from pg_stat_activity where state='idle in transaction' and now()-state_change > interval '? second';

演示,打印每秒系统中在事务中并且处于空闲状态(超过5秒)的会话有多少

psql  
  
select count(*) from pg_stat_activity where state='idle in transaction' and now()-state_change > interval '5 second';  
  
\watch 1

waiting

当前系统中,处于等待中的会话有多少。如果很多,说明出现了大量的锁等待,使用末尾文章进行排查。

select count(*) from pg_stat_activity where wait_event_type is not null;

演示,打印每秒系统中处于等待中的会话有多少。

psql  
  
select count(*) from pg_stat_activity where wait_event_type is not null;  
  
\watch 1

long waiting

当前系统中,等待超过N秒的会话有多少。

select count(*) from pg_stat_activity where wait_event_type is not null and now()-state_change > interval '? second';

演示,打印每秒系统中等待超过5秒的会话有多少。

psql  
  
select count(*) from pg_stat_activity where wait_event_type is not null and now()-state_change > interval '5 second';  
  
\watch 1

2pc

当前系统中,2PC的事务有多少。如果接近max_prepared_transactions,需要注意。建议调大max_prepared_transactions,或者排查业务是否未及时提交。

select count(*) from pg_prepared_xacts;

演示,打印每秒系统中未结束的2PC事务数。

psql  
  
select count(*) from pg_prepared_xacts;  
  
\watch 1

long 2pc

当前系统中,超过N秒未结束的2PC的事务有多少。如果很多,需要排查业务为什么未及时提交。

select count(*) from pg_prepared_xacts where now() - prepared > interval '? second';

演示,打印每秒系统中5秒仍未结束的2PC事务数。

psql  
  
select count(*) from pg_prepared_xacts where now() - prepared > interval '5 second';   
  
\watch 1

膨胀点监测 - 多久以前的垃圾可以被回收

时间间隔越大,说明越容易导致膨胀。排查这几个方向,长事务,长SQL,2PC,持有SNAPSHOT的QUERY。必要时把不合理的老的会话干掉。

with a as 
(select min(xact_start) m from pg_stat_activity where backend_xid is not null or backend_xmin is not null), 
b as (select min(prepared) m from pg_prepared_xacts) 
select now()-least(a.m,b.m) from a,b;

演示,打印每秒系统中多久以前的垃圾可以被回收

psql  
  
with a as 
(select min(xact_start) m from pg_stat_activity where backend_xid is not null or backend_xmin is not null), 
b as (select min(prepared) m from pg_prepared_xacts) 
select now()-least(a.m,b.m) from a,b;  
  
\watch 1

空间

看当前占用情况,打快照,看时间维度空间变化情况。按库划分:

postgres=# \l+  
                                                                   List of databases  
   Name    |  Owner   | Encoding  |  Collate   |   Ctype    |   Access privileges   |  Size   | Tablespace |                Description                   
-----------+----------+-----------+------------+------------+-----------------------+---------+------------+--------------------------------------------  
 postgres  | postgres | SQL_ASCII | en_US.UTF8 | en_US.UTF8 |                       | 54 GB   | pg_default | default administrative connection database  
 template0 | postgres | SQL_ASCII | en_US.UTF8 | en_US.UTF8 | =c/postgres          +| 7489 kB | pg_default | unmodifiable empty database  
           |          |           |            |            | postgres=CTc/postgres |         |            |   
 template1 | postgres | SQL_ASCII | en_US.UTF8 | en_US.UTF8 | =c/postgres          +| 578 MB  | pg_default | default template for new databases  
           |          |           |            |            | postgres=CTc/postgres |         |            |   
 test      | test     | SQL_ASCII | en_US.UTF8 | en_US.UTF8 |                       | 7489 kB | pg_default |   
(4 rows)

按表空间划分

postgres=# \db+  
                                                    List of tablespaces  
        Name        |  Owner   |               Location               | Access privileges | Options |  Size   | Description   
--------------------+----------+--------------------------------------+-------------------+---------+---------+-------------  
 dbt2_index1        | postgres | /data02/pg/tbs_tpcc/index1/ts        |                   |         | 452 MB  |   
 dbt2_index2        | postgres | /data02/pg/tbs_tpcc/index2/ts        |                   |         | 869 MB  |   
 dbt2_pk_customer   | postgres | /data02/pg/tbs_tpcc/pk_customer/ts   |                   |         | 451 MB  |   
 dbt2_pk_district   | postgres | /data02/pg/tbs_tpcc/pk_district/ts   |                   |         | 236 kB  |   
 dbt2_pk_item       | postgres | /data02/pg/tbs_tpcc/pk_item/ts       |                   |         | 2212 kB |   
 dbt2_pk_new_order  | postgres | /data02/pg/tbs_tpcc/pk_new_order/ts  |                   |         | 149 MB  |   
 dbt2_pk_order_line | postgres | /data02/pg/tbs_tpcc/pk_order_line/ts |                   |         | 4701 MB |   
 dbt2_pk_orders     | postgres | /data02/pg/tbs_tpcc/pk_orders/ts     |                   |         | 490 MB  |   
 dbt2_pk_stock      | postgres | /data02/pg/tbs_tpcc/pk_stock/ts      |                   |         | 1768 MB |   
 dbt2_pk_warehouse  | postgres | /data02/pg/tbs_tpcc/pk_warehouse/ts  |                   |         | 44 kB   |   
 pg_default         | postgres |                                      |                   |         | 46 GB   |   
 pg_global          | postgres |                                      |                   |         | 573 kB  |   
(12 rows)

更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

数据空间

数据占用的空间。

日志空间

WAL日志占用的空间。

备库发送延迟

select application_name,client_addr,client_hostname,client_port,state,sync_priority,sync_state,pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn)) from pg_stat_replication;

备库APPLY延迟

select application_name,client_addr,client_hostname,client_port,state,sync_priority,sync_state,pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lag)) from pg_stat_replication;

SLOT 延迟

select slot_name, plugin, slot_type, temporary, active, active_pid, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) from pg_replication_slots;

归档延迟

最后一次归档失败时间减去最后一次归档成功的时间,求时间差。

select last_failed_time - last_archived_time from pg_stat_archiver;

数据库活动信息

以下都可以针对单个数据库输出,也可以输出整个实例的统计。

postgres=# \d pg_stat_database  
                     View "pg_catalog.pg_stat_database"  
     Column     |           Type           | Collation | Nullable | Default   
----------------+--------------------------+-----------+----------+---------  
 datid          | oid                      |           |          |   
 datname        | name                     |           |          |   
 numbackends    | integer                  |           |          |   
 xact_commit    | bigint                   |           |          |   
 xact_rollback  | bigint                   |           |          |   
 blks_read      | bigint                   |           |          |   
 blks_hit       | bigint                   |           |          |   
 tup_returned   | bigint                   |           |          |   
 tup_fetched    | bigint                   |           |          |   
 tup_inserted   | bigint                   |           |          |   
 tup_updated    | bigint                   |           |          |   
 tup_deleted    | bigint                   |           |          |   
 conflicts      | bigint                   |           |          |   
 temp_files     | bigint                   |           |          |   
 temp_bytes     | bigint                   |           |          |   
 deadlocks      | bigint                   |           |          |   
 blk_read_time  | double precision         |           |          |   
 blk_write_time | double precision         |           |          |   
 stats_reset    | timestamp with time zone |           |          |
每秒事务提交数

多次查询计算

select sum(xact_commit) from pg_stat_database;  -- pg_stat_get_db_xact_commit 为stable函数,一个事务中两次调用之间只执行一次,所以需要外部多次执行。
每秒事务回滚数
select sum(xact_rollback) from pg_stat_database;
每秒全表扫描记录数
select sum(tup_returned) from pg_stat_database;
每秒索引扫描回表记录数
select sum(tup_fetched) from pg_stat_database;
每秒插入记录数
select sum(tup_inserted) from pg_stat_database;
每秒更新记录数
select sum(tup_updated) from pg_stat_database;
每秒删除记录数
select sum(tup_deleted) from pg_stat_database;
备库查询冲突数
select sum(conflicts) from pg_stat_database;
死锁数
select sum(deadlocks) from pg_stat_database;

PostgreSQL 监控工具

PoWA

PoWA(PostgreSQL Workload Analyzer) 是 PostgreSQL 的工作负载分析工具,它收集性能数据并提供实时的图标和图片展示,以帮助我们监控和调优 PostgreSQL 服务器。它和 Oracle AWR 或者SQL Server MDW很像。

PgCluu

pgCluu是一个PostgreSQL的性能监控和审计工具。它以视图的形式展示您从PostgreSQL数据库集群收集的所有统计信息。它能展示一份完成的数据库集群信息和系统使用率信息。

Pgwatch2

Pgwatch2是监控PostgreSQL数据库工具中最易用的一个。它基于Grafana并为PostgreSQL数据库提供开箱即用的监控功能。因为它已经集成到了容器里,所以我们不必担心各种依赖和复杂的安装步骤,几分钟即可将监控搭建完毕,所有的东西都已经提前配置好。我们只需要将数据库连接配置到监控中即可运行正常监控操作。

更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

PostgreSQL 性能监控pgWatch2

pgwatch2由到组件构成
  • pgwatch2 metrics gathering daemon written in Go 使用go语言编写的性能搜集

  • A PostgreSQL database for holding the configuration about which databases and metrics to gather 使用postgres存储性能收集的配置

  • InfluxDB Time Series Database for storing metrics 使用influx

  • db时序数据库存储指标

  • Grafana for dashboarding (point-and-click, a set of predefined dashboards is provided) 使用Grafana作为展示报表

  • A Web UI for administering the monitored DBs and metrics and for showing some custom metric overviews 使用webpy开发的后台管理和配置界面

安装与使用
通过 docke 安装

根据github上的readme,通过docker启动项目 https://github.com/cybertec-postgresql/pgwatch2.git

#检查docker是否启动
docker service start
#搜索pgwatch2
docker search pgwatch2
NAME                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
cybertec/pgwatch2   Flexible self-contained PostgreSQL metrics...   3
#下载pgwatch2代码
docker pull cybertec/pgwatch2
#注意:这里下载比较慢,一般需要重复尝试接近十遍才能下完
#在docker上打开一个容器运行pgwatch2
#-p IP:host_port:container_port,前者是host上的端口,后者是容器中暴露的端口
docker run -d -p 3000:3000 -p 5432:5432 -p 8083:8083 -p 8086:8086 -p 8080:8080 -p 8088:8088 --name pw2 cybertec/pgwatch2
打开127.0.0.1:8080/dbs对要监控的信息进行配置

Image

选择红圈中的exhaustive可以自定义CPU的默认监控区间,默认是一分钟一次,可以改成1s一次
 

Image

添加pg_stat_statement和plpythonu拓展,监控CPU,内存,IO和磁盘

#创建一个测试的角色
create role pgwatch2 with login password 'secret';
#添加pg_stat_statements 到 postgresql.conf 然后重启
#pg_stat_statements模块提供了一种跟踪执行的所有SQL语句的统计信息的方法。
#这个模块必须改写配置文件postgresql.conf中的shared_preload_libraries变量
找到postgresql.conf并在末尾追加
shared_preload_libraries = 'pg_stat_statements'
#切换postgres用户
[@97tools zhouguanglong]$ su postgres
bash-4.1$ psql -p 5432
#创建pg_stat_statements扩展, 可以查看sql的执行时的性能、
#创建plpython扩展,通过python操作数据库
postgres=# CREATE EXTENSION pg_stat_statements;
postgres=# CREATE EXTENSION plpythonu;
#注意,执行CREATE EXTENSION plpythonu;可能会出现如下错误
ERROR:  could not access file "$libdir/plpython2": No such file or directory
解决方法见下一步。

解决create extension plpythonu;出异常的思路

#在一个临时文件夹下重新安装编译postgres
wget  https://ftp.postgresql.org/pub/source/v9.6.2/postgresql-9.6.2.tar.bz2
tar -jxvf  postgresql-9.6.2.tar.bz2
cd  postgresql-9.6.2
./configure --prefix=/usr/local/pgsql9.6.2 --enable-cassert --with-python
make world -j 64
make install-world
#编译安装完,把以上SQL文件拷贝到老的$PGHOME/share/extension目录下. 将lib下的plpython2.so拷贝到$PGHOME/lib下
root@db-172-16-3-150-> cd postgresql-9.6.2/
root@db-172-16-3-150-> cd share/extension/
root@db-172-16-3-150-> ll|grep python
-rw-r--r-- 1 ocz  ocz   351 Jan  7 14:13 plpython2u--1.0.sql
-rw-r--r-- 1 ocz  ocz   196 Jan  7 14:13 plpython2u.control
-rw-r--r-- 1 ocz  ocz   402 Jan  7 14:13 plpython2u--unpackaged--1.0.sql
-rw-r--r-- 1 ocz  ocz   347 Jan  7 14:13 plpythonu--1.0.sql
-rw-r--r-- 1 ocz  ocz   194 Jan  7 14:13 plpythonu.control
-rw-r--r-- 1 ocz  ocz   393 Jan  7 14:13 plpythonu--unpackaged--1.0.sql

#创建成功
postgres=# create extension plpythonu;
CREATE EXTENSION
#这里可以参考http://blog.csdn.net/hewy0526/article/details/8576024
#创建plpython过程语言
#服务器上的PGSQL的端口是5432,增加-p 5432 是为了指定PGSQL的端口,以免系统按照默认的编译端口去寻找,默认编译端口可能不是5432
createlang -p 5432 plpythonu GEMPILE_DATA

psql -p 5432 -h 192.168.6.97 -U postgres -f /var/lib/pgsql/cpu_load_plpythonu.sql GEMPILE_DATA
#提示以下信息:
BEGIN
psql:/var/lib/pgsql/cpu_load_plpythonu.sql:11: NOTICE:  type "public.load_average" does not exist, skipping
DROP TYPE
CREATE TYPE
CREATE FUNCTION
GRANT
COMMENT
COMMIT
登录

http://127.0.0.1:3000/dashboard/db/db-overview相应的监控的ip进行查看各项监控信息

Image

Image

可以监控单独的queryid对应的查询状态:

Image

pgcenter 实时监控工具

版本
# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core) 
#
# su - postgres
Last login: Tue Oct 22 13:56:27 CST 2019 on pts/0
$
$ psql -c "select version();"
                                                 version                                                 
---------------------------------------------------------------------------------------------------------
 PostgreSQL 11.9 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)

下载安装
# yum install perl perl-CPAN 
# perl -MCPAN -e shell
cpan[1]> install Linux::Ethtool::Settings
cpan[1]> q
# su - postgres
$ wget https://github.com/lesovsky/pgcenter/releases/download/v0.6.5/pgcenter_0.6.5_Linux_x86_64.tar.gz
$ tar -zxvf ./pgcenter_0.6.5_Linux_x86_64.tar.gz
# cp /var/lib/pgsql/pgcenter /usr/local/bin
# which pgcenter
/usr/local/bin/pgcenter
使用
# su - postgres
$ which pgcenter
/usr/local/bin/pgcenter

$ pgcenter --help
pgCenter is a command line admin tool for PostgreSQL.

Usage:
  pgcenter [flags]
  pgcenter [command] [command-flags] [args]

Available commands:
  config configures Postgres to work with pgcenter
  profile wait events profiler
  record record stats to file
  report make report based on previously saved statistics
  top  top-like stats viewer

Flags:
  -?, --help  show this help and exit
      --version  show version information and exit

Use "pgcenter [command] --help" for more information about a command.

Report bugs to https://github.com/lesovsky/pgcenter/issues
postgres=# create extension plperlu;
CREATE EXTENSION
postgres=# 
postgres=# select * from pg_language ;
 lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl 
----------+----------+---------+--------------+---------------+-----------+--------------+--------
 internal |       10 | f       | f            |             0 |         0 |         2246 | 
 c        |       10 | f       | f            |             0 |         0 |         2247 | 
 sql      |       10 | f       | t            |             0 |         0 |         2248 | 
 plpgsql  |       10 | t       | t            |         13795 |     13796 |        13797 | 
 plperlu  |       10 | t       | f            |        412208 |    412209 |       412210 | 
(5 rows)
$ pgcenter top

Image

当然,监控工具非常多,我们也可以使用 Zabbix、Prometheus 等开源工具对其进行相关监控。主要还是看企业实际的业务需求,去选择相对应的工具即可。更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值