跳至内容

如何结束我的 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 兼容版数据库实例中长时间运行的查询?

2 分钟阅读
0

我想要结束 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版数据库 (DB) 实例中长时间运行的进程。

简短描述

根据您的使用案例,您可以使用 pg_cacnel_backend(pid)pg_terminate_backend(pid) 函数。

使用 pg_cancel_backend(pid) 函数向特定的后端进程发送 SIGINT 信号,并取消当前长时间运行的查询。在此过程中,与数据库的连接保持活动状态。在该函数正常终止当前查询后,后端可以继续处理其他查询或事务。

使用 pg_terminate_backend(pid) 函数结束查询并关闭连接。使用此函数向特定的后端进程发送 SIGTERM 信号,并强制终止与该进程关联的连接。此过程会回滚并释放该连接中的未完成事务或持有的锁。

有关详细信息,请参阅 PostgreSQL 网站上的 Server signaling functions(服务器信令函数)

**注意:**即使满足所有系统要求,某些 Aurora PostgreSQL 兼容版本也无法结束 autovacuum 进程。当您尝试结束这些版本中的 autovacuum 进程时,您可能会收到以下错误消息:

"ERROR: 42501: must be a superuser to terminate superuser process LOCATION: pg_terminate_backend, signalfuncs.c:227."

一些次要版本允许 rds_superuser 结束与角色未显式关联的 autovacuum 进程。要检查您的版本是否允许 rds_superuser 结束 autovacuum 进程,请参阅 Amazon Aurora PostgreSQL 更新

解决方法

要使用 pg_cacnel_backend(pid)pg_terminate_backend(pid),您必须是以下用户之一:

  • 您是 rds_superuser 或者默认角色 pg_signal_backend 的成员。
  • 您以想要取消会话的同一个数据库用户身份连接到数据库。

要结束长时间运行的查询,您必须拥有事务的进程 ID (PID)。要查找 PID,请运行 pg_stat_activity 查询并查看 pid 列。有关详细信息,请参阅 PostgreSQL 网站上的 pg_stat_activity

使用 pg_cancel_backend(pid) 函数

当您从另一个会话运行以下命令时,该函数会使用长时间运行的查询的 PID 从数据库后端取消查询:

SELECT pg_cancel_backend(8121);

**注意:**在上述命令中,查询的 PID 为 8121

预期输出:

pg_cancel_backend
 ------------------------
 t

在上述输出中,值为 t 表示 "true",表明该函数已取消查询。如果查询已不存在或没有活动的数据库连接,则输出会显示值为 f 表示 "false"。

使用 pg_terminate_backend(pid) 函数

当您从其他会话运行以下命令时,该函数会以 pid 8121 结束数据库连接:

SELECT pg_terminate_backend(8121);

预期输出:

pg_terminate_backend
------------------------
 t

尽管该函数并未取消查询,但上述输出仍显示为 t。响应表明该函数已成功发送 SIGTERM 信号。该函数不会立即中断后端进程。为了使共享内存保持一致状态,该命令会在 CHECK_FOR_INTERRUPTS 期间启动正常关闭过程。

取消长时间运行但未结束的进程

当您在可中断的部分中运行 pg_cancel_backend(pid)pg_terminate_backend(pid) 时,这些函数无法取消查询。例如,该进程尝试获取轻量级锁。或者,该进程正在等待来自存储的读取或写入系统调用完成。在这些情况下,后端进程无法接收到取消信号,并且该进程会无限期地停滞。

如果该进程对取消方法没有响应,则重新启动整个数据库引擎,并强制结束已停滞的进程。

最佳做法是调整超时参数,例如 PostgreSQL 版本 14 及更高版本的 statement_timeoutidle_in_transaction_session_timeoutidle_session_timeout。配置客户端和服务器端超时也是最佳做法,例如 tcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_count

**注意:**由于这些超时参数是动态的,因此您无需重启数据库即可使更改生效。

根据您的需求配置参数。例如,您可以在以下级别设置参数:

  • 针对特定查询的单个语句级别
  • 针对特定用户所有查询的用户级别
  • 用于控制整个数据库行为的数据库级别
  • 用于建立全局设置的实例参数组级别

**注意:**由于短暂超时会取消故意长时间运行的查询,因此不要在实例级别或数据库级别设置短暂超时。如果您将 log_min_error_statement 设置为 ERROR 或更低级别,则 Amazon RDS 会记录超时的语句。有关详细信息,请参阅 PostgreSQL 网站上的 Statement behavior(语句行为)

相关信息

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

如何确定我的 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 兼容版数据库实例中的性能问题和运行缓慢的查询并对其进行故障排除?