跳至内容

如何检查我的 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 数据库实例正在运行的查询并诊断资源消耗问题?

2 分钟阅读
0

我想查看 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% 以了解系统内存的使用情况。

名称VIRTRESCPU%MEM%VMLIMIT
postgres: master postgres 27.0.3.145(52003) SELECT [14431]457.66MB27.7MB95.152.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 网站)