我想要结束 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容数据库实例中长时间运行的进程。
简短描述
使用 pg_cancel_backend(pid) 结束查询但保持连接处于活动状态。使用 pg_terminate_backend(pid) 结束查询并关闭连接。此函数会终止完整连接,可能会影响正在进行的其他查询。仅在必要时使用 pg_terminate_backend(pid)。
要使用这些函数,您必须拥有以下权限之一:
- 您是 rds_superuser 或者默认角色 pg_signal_backend 的成员。
- 您以想要取消的会话的同一个数据库用户身份连接到数据库。
注意:
- 使用 pg_stat_activity 视图的 pid 列查找活动后端进程的进程 ID (PID)。有关详细信息,请参阅 PostgreSQL 网站上的 pg_stat_activity。
- pg_signal_backend 发送 SIGINT 信号,而 pg_terminate_backend 将 SIGTERM 信号发送到后端进程。有关详细信息,请参阅 PostgreSQL 网站上的服务器信令函数。
解决方法
**注意:**即使满足所有系统要求,某些兼容 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_cancel_backend(pid) 和 pg_terminate_backend(pid) 函数示例:
pg_cancel_backend(pid)
当您从另一个会话运行以下函数时,它会取消从数据库后端以 pid 8121 运行的查询
postgres=> SELECT pg_cancel_backend(8121);
预期输出:
pg_cancel_backend
------------------------
t
(1 row)
当您运行以下命令时,该查询被正确取消,该函数返回 true (t)。如果查询不再存在或数据库连接不存在,则该函数返回 false (f)。
pg_terminate_backend(pid)
当从另一个会话中运行时,以下函数以 pid 8121 结束数据库连接:
postgres=> SELECT pg_terminate_backend(8121);
预期输出:
pg_terminate_backend
------------------------
t
(1 row)
即使进程尚未取消,该函数也会返回 true (t)。响应仅表明 SIGTERM 信号已成功发送。该命令不会立即中断后端进程。为了使共享内存保持不一致状态,该命令会启动在 CHECK_FOR_INTERRUPTS 期间发生的正常关闭过程。
取消长时间运行但未结束的进程
当您在可中断的部分中运行 pg_cancel_backend(pid) 和 pg_terminate_backend(pid) 时,这些函数无法成功取消查询。例如,该进程可能正在等待获取轻量级锁或对网络存储设备的读取或写入系统调用。后端进程没有信号,会无限期地停滞。
要结束该进程,请重启数据库引擎。
最佳做法是调整超时参数,例如 PostgreSQL 版本 14 及更高版本的 statement_timeout、idle_in_transaction_statement_timeout 和 idle_session_timeout。设置客户端和服务器端超时也是最佳做法,例如 tcp_keepalives_idle、tcp_keepalives_interval、tcp_keepalives_count。
您可以在适当的级别(例如语句、用户级别、数据库或实例)设置 statement_timeout 参数。
**注意:**在实例级别或数据库级别设置短暂超时并不是最佳做法,因为短暂超时会取消故意长时间运行的查询。如果 log_min_error_statement 设置为 ERROR(错误)或更低,则会记录超时的语句。有关详细信息,请参阅 PostgreSQL 网站上的语句行为。
相关信息
如何为 Amazon RDS for PostrgreSQL 或 Aurora PostgreSQL 数据库实例检查正在运行的查询和诊断资源消耗问题?
如何确定我的 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 兼容版数据库实例中的性能问题和运行缓慢的查询并对其进行故障排除?