作者
digoal
日期
2019-07-12
标签
PostgreSQL , pg_stat_activity , query , 捕获SQL
背景
pg_stat_activity是PG的活跃会话视图,字段如下:
postgres=# \d pg_stat_activity
View "pg_catalog.pg_stat_activity"
Column | Type | Collation | Nullable | Default
------------------+--------------------------+-----------+----------+---------
datid | oid | | |
datname | name | | |
pid | integer | | |
usesysid | oid | | |
usename | name | | |
application_name | text | | |
client_addr | inet | | |
client_hostname | text | | |
client_port | integer | | |
backend_start | timestamp with time zone | | |
xact_start | timestamp with time zone | | |
query_start | timestamp with time zone | | |
state_change | timestamp with time zone | | |
wait_event_type | text | | |
wait_event | text | | |
state | text | | |
backend_xid | xid | | |
backend_xmin | xid | | |
query | text | | |
backend_type | text | | |
通过查看query可以得到当前或这个连接最后一次执行的SQL,但是需要注意的是,它记录的是最外层的SQL,当一个SQL里面又调用了函数,函数里面又执行了SQL时,不会展示在这里。
如果你想在一个某些地方跟踪当前最外层的SQL是什么,可以自定义一个函数来得到,或者直接查询当前会话的pg_stat_activity.query得到。
例子
create or replace function getquery() returns text as $$
select query from pg_stat_activity where pid=pg_backend_pid();
$$ language sql strict;
postgres=# select getquery() as sql,oid,relkind,relname from pg_class limit 1;
sql | oid | relkind | relname
---------------------------------------------------------------------+-------+---------+----------------
select getquery() as sql,oid,relkind,relname from pg_class limit 1; | 16393 | t | pg_toast_16390
(1 row)
postgres=# do language plpgsql $$
declare
begin
raise notice '%', getquery();
end;
$$;
psql: NOTICE: do language plpgsql $$
declare
begin
raise notice '%', getquery();
end;
$$;
DO
postgres=# select upper(getquery()) , getquery();
upper | getquery
----------------------------------------+----------------------------------------
SELECT UPPER(GETQUERY()) , GETQUERY(); | select upper(getquery()) , getquery();
(1 row)
参考
《PostgreSQL 事件触发器应用 - DDL审计记录 + 异步通知(notify)》
PostgreSQL 许愿链接
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.
9.9元购买3个月阿里云RDS PostgreSQL实例
PostgreSQL 解决方案集合
德哥 / digoal's github - 公益是一辈子的事.





