首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过pgbouncer查找查询源

通过pgbouncer查找查询源
EN

Stack Overflow用户
提问于 2016-09-28 04:55:29
回答 1查看 1.2K关注 0票数 1

我正在尽可能多地了解某个特定类型的update查询来自哪个主机。

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

在数据库中保存来自pg_stat_activity的信息的触发器告诉我有关pgbouncer连接的信息,但并不能帮助我找出幕后黑手。

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

有没有什么合理的方法来找出查询最终来自哪个主机?

EN

回答 1

Stack Overflow用户

发布于 2017-03-10 19:37:55

我用来从pgbouncer跟踪客户端的方法是使用pgbouncer show clients命令加入pg_stat_statements。下面是一个示例:

代码语言:javascript
运行
复制
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 -I使用mix来支持prod上过时的用法...如果您没有任何注释,请忽略它...)

代码语言:javascript
运行
复制
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

现在我们可以把pgbouncer视图和pg_stat_statements连接起来了

代码语言:javascript
运行
复制
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,它从0.10.10.10连接到pgbouncer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39734161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档