我想查看 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 数据库实例上正在运行的查询。或 Amazon Aurora PostgreSQL 兼容版数据库实例上正在运行的查询。
解决方法
检查正在运行的查询
您的用户账户必须具有 rds_superuser 角色才能查看 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 兼容版数据库实例上运行的所有进程。否则,pg_stat_activity 仅会显示其自身进程正在运行的查询。有关详细信息,请参阅 PostgreSQL 文档的 Statistics Collector(统计信息收集器)部分。
1. 连接到正在运行 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 的数据库实例。
2. 运行以下命令:
SELECT * FROM pg_stat_activity ORDER BY pid;
您也可以修改此命令以查看正在运行的查询列表。查询将按建立连接的时间排序:
SELECT * FROM pg_stat_activity ORDER BY backend_start;
如果 xact_start 列的值为空,则表示该会话中没有未完成事务:
SELECT * FROM pg_stat_activity ORDER BY xact_start;
或者,按上次查询开始的时间排序,查看正在运行查询的同一列表:
SELECT * FROM pg_stat_activity ORDER BY query_start;
要查看等待事件的汇总视图(如有),请运行以下命令:
select state, wait_event, wait_event_type, count(*) from pg_stat_activity group by 1,2,3 order by wait_event;
诊断资源消耗
您可以使用 pg_stat_activity 和增强监控来识别消耗大量系统资源的查询或进程。开启增强监控后,请将粒度设置为足以查看诊断问题所需信息的级别。然后,查看 pg_stat_activity 以了解数据库中的当前活动。您还可以同时查看增强监控指标。
1. 查看操作系统进程列表指标,确定消耗资源的查询。在以下示例中,该进程消耗了 RDS 数据库实例约 95% 的 CPU 时间。该进程的进程 ID (pid) 为 14431。该进程正在运行 SELECT 语句。您还可以查看 MEM% 以了解系统内存的使用情况。
| | | | | |
|---|
| 名称 | VIRT | RES | CPU% | MEM% | VMLIMIT |
| postgres: master postgres 27.0.3.145(52003) SELECT [14431] | 457.66MB | 27.7MB | 95.15 | 2.78 | 无限制 |
2. 连接到正在运行 PostgreSQL 或 Aurora PostgreSQL 的数据库实例。
3. 运行以下命令来识别会话的当前活动:
SELECT * FROM pg_stat_activity WHERE pid = PID;
**注意:**将 PID 替换为您在步骤 1 中识别出的 pid。
4. 查看命令的结果:
datid | 14008
datname | postgres
pid | 14431
usesysid | 16394
usename | master
application_name | psql
client_addr | 27.0.3.145
client_hostname |
client_port | 52003
backend_start | 2020-03-11 23:08:55.786031+00
xact_start | 2020-03-11 23:12:16.960942+00
query_start | 2020-03-11 23:12:16.960942+00
state_change | 2020-03-11 23:12:16.960945+00
wait_event_type |
wait_event |
state | active
backend_xid |
backend_xmin | 812
query | SELECT COUNT(*) FROM columns c1, columns c2, columns c3, columns c4, columns c5;
backend_type | client backend
要停止正在运行查询的进程,请从另一个会话中调用以下查询。将 PID 替换为您在步骤 3 中识别出的进程的 pid。
SELECT pg_terminate_backend(PID);
**重要事项:**在结束事务之前,评估每个事务对数据库和应用程序状态的潜在影响。
相关信息
如何排查 Amazon RDS 或 Aurora PostgreSQL 的高 CPU 利用率问题?
了解 PostgreSQL 角色和权限
创建角色
psql(位于 PostgreSQL 网站)
pg_stat_activity(位于 PostgreSQL 网站)