2016-09-27 58 views
1

我想尽可能找出哪些主机有特定类型的更新查询来自哪里。通过pgbouncer查找查询源

我的数据库是PostgreSQL 9.0.23本地运行pgbouncer连接池。池类型是事务池。

保存来自pg_stat_activity的信息的数据库中的一个触发器告诉我有关pgbouncer的连接,但无法帮助我找出是谁在后面。

有问题的数据库是负载下的生产数据库。因此删除pgbouncer不是一个选项。让pgbouncer写一个详细的日志可能也是一个坏主意。

是否有任何合理的方法来找出查询最终来自哪个主机?

回答

1

我用来跟踪pgbouncer客户端的方式是使用pgbouncer show clients命令加入pg_stat_statements。这里有一个例子:

t=# create extension "postgres_fdw"; 
CREATE EXTENSION 
t=# CREATE SERVER pgbouncer FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '10.10.10.10', port '6432', dbname 'pgbouncer'); 
CREATE SERVER 

(通过一切手段,你可以只使用DBLINK或者只是postgres_fdw - 我用混以支持PROD过时的使用。如果你没有任何票据,只是忽略了.. 。)

t=# create extension "dblink"; 
CREATE EXTENSION 
t=# create view bnc_client AS SELECT _.type, 
     _."user", 
     _.database, 
     _.state, 
     _.addr, 
     _.port, 
     _.local_addr, 
     _.local_port, 
     _.connect_time, 
     _.request_time, 
     _.ptr, 
     _.link, 
     _.remote_pid, 
     _.tls 
     FROM dblink('pgbouncer'::text, 'show clients'::text) _(type text, "user" text, database text, state text, addr text, port integer, local_addr text, local_port integer, connect_time timestamp with time zone, request_time timestamp with time zone, ptr text, link text, remote_pid smallint, tls text); 
CREATE VIEW 
t=# create user mapping FOR vao server pgbouncer options (user 'pgbouncer_known_user', password 'password_here'); 
CREATE USER MAPPING 

现在我们可以pg_stat_statements加入pgbouncer观点:

t=# select 
     datname 
     , usename 
     , p.state 
     , case when b.user is not null then 'pgBouncer' else application_name end app 
     , case when b.user is null then client_addr else addr::inet end ip 
     , b.user 
     , b.state "bState" 
     , case when waiting then true else null end w 
     , b.connect_time 
     , query_start 
     , md5(query)::uuid 
     , pid 
    from pg_stat_activity p 
    left outer join bnc_client b 
     on addr||':'||b.port = regexp_replace(p.application_name,'^.{0,}(-)','') 
    where pid <> pg_backend_pid() 
    ; 
datname | usename | state |   app   |  ip  | user | bState | w | connect_time |   query_start 
|     md5     | pid 
---------+---------+-------+------------------------+--------------+------+--------+---+--------------+------------------------------- 
+--------------------------------------+------- 
dbn | usr | idle |      | 192.168.0.1 |  |  | |    | 2017-03-09 17:19:46.206643+00 
| d1730c52-dffd-3650-a399-23f4dd4aa456 | 12614 
dbn | usr | idle | app - 10.10.10.10:24514 | 10.10.10.10 |  |  | |    | 2017-03-10 11:24:34.999174+00 
| 92a0340c-9ecc-9375-37c0-e70e8b225db4 | 22563 
(2 rows) 

这里app - 10.10.10.10:24514意味着这个pid是从pgbouncer,并pgbouncer从0.10.10连接。 10