在 AWS RDS 上运行的 PostgreSql 今天出现了 TransactionID 耗尽的问题,原因是有一个 SQL 执行占用 CPU 超过 12 小时。
-- 查询正在执行的 SQL
select * from pg_stat_activity where datname='schema 名称 ';
-- 结束正在进行的 R 查询
select pg_cancel_backend(pid);
-- 结束正在执行的 CUD 操作
select pg_terminate_backend(pid);
如何找到那些执行时间长的 SQL? 步骤 1:开启 pg_stat_statements 扩展,这需要 PostgreSql 的支持,部分版本需要进行编译安装。
create extension pg_stat_statements;
select pg_stat_reset();
select pg_stat_statements_reset();
步骤 2:等待一段时间。 步骤 3:查询最耗时的 SQL。
select * from pg_stat_statements order by total_time desc limit 5;
步骤 4:查询使用 Buffer 次数最多的 SQL。
select * from pg_stat_statements order by shared_blks_hit+shared_blks_read desc limit 5;