2016-09-27 57 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