如何终止 Google Cloud SQL for PostgreSQL 中的会话?

Posted

技术标签:

【中文标题】如何终止 Google Cloud SQL for PostgreSQL 中的会话?【英文标题】:How do I terminate a session in Google Cloud SQL for PostgreSQL? 【发布时间】:2018-11-21 04:58:23 【问题描述】:

由于 Google Cloud SQL for PostgreSQL 没有为我们提供超级用户(甚至没有 postgres 用户),我无法看到其他会话正在从 pg_stat_activity 运行什么查询,也无法在需要时终止其他会话。

例如:

postgres@testdb=> select pg_terminate_backend(1584);
ERROR:  42501: must be a member of the role whose process is being terminated or member of pg_signal_backend
LOCATION:  pg_terminate_backend, misc.c:319
Time: 23.800 ms

如果没有真正的超级用户访问权限,我们如何在 Cloud SQL PostgreSQL 实例中执行这些操作?只有 cloudsqladmin 帐户是超级用户,AFAIK 我不能这样:

postgres@testdb=> \dg
                                            List of roles
     Role name     |                         Attributes                         |      Member of
-------------------+------------------------------------------------------------+---------------------
 cloudsqladmin     | Superuser, Create role, Create DB, Replication, Bypass RLS | 
 cloudsqlagent     | Create role, Create DB                                     | cloudsqlsuperuser
 cloudsqlreplica   | Replication                                                | 
 cloudsqlsuperuser | Create role, Create DB                                     | 
 don               | Create role, Create DB                                     | cloudsqlsuperuser
 postgres          | Create role, Create DB                                     | cloudsqlsuperuser

postgres@testdb=> set role cloudsqladmin;
ERROR:  42501: permission denied to set role "cloudsqladmin"
LOCATION:  call_string_check_hook, guc.c:9803
Time: 25.293 ms

FWIW,如果您以会话的用户身份登录,您可以终止会话。用户可以终止他们的任何会话,标准 PostgreSQL 的东西。

postgres@postgres=> select pg_terminate_backend(23644);
ERROR:  42501: must be a member of the role whose process is being terminated or member of pg_signal_backend
LOCATION:  pg_terminate_backend, misc.c:319

don@postgres=> select pg_terminate_backend(23644);
 pg_terminate_backend
----------------------
 t
(1 row)

【问题讨论】:

【参考方案1】:

pg_terminate_backend 说:

pg_terminate_backend(pid int) - 终止后端。如果调用角色是其后端被终止的角色的成员或调用角色已被授予pg_signal_backend,则也允许这样做,但是只有超级用户可以终止超级用户后端。

如果您是 Google 的 cloudsqlsuperuser(默认为 gcloud sql users create)的成员,您可以授予自己:

GRANT pg_signal_backend TO myuser;

然后您可以终止除超级用户之外的任何会话:

SELECT pg_terminate_backend(pid), * FROM pg_stat_activity
WHERE usename = 'rogue_user' AND pid <> pg_backend_pid();

pg_signal_backend 是在 v9.6 中引入的 - 正是 Google Cloud 上的版本!

另一种方法是在other 角色内能够终止会话me

GRANT other TO me;

【讨论】:

【参考方案2】:

无法在 Cloud SQL 中向 PostgreSQL 用户授予超级用户角色。 1

在任何情况下,您都可以在 Cloud Console 的 Cloud SQL 部分内的图表和日志中查阅有关实例的信息。 2

1:https://cloud.google.com/sql/docs/postgres/users#other_postgresql_users

2:https://cloud.google.com/sql/docs/postgres/diagnose-issues

【讨论】:

我早些时候试图发表评论,但显然它已经消失了。让我们再试一次。重新链接 2,它可能不会向我显示僵尸查询或阻塞锁之类的东西。我需要了解我们在 Google Cloud SQL 中也没有的 pg_stat_activity(除了用户名和应用程序)。我需要诸如客户端地址/主机名、连接和查询开始时间以及查询本身之类的东西。无论哪种方式,即使我确实掌握了这些信息,作为 DBA 的我仍然没有任何机制可以终止我需要的会话。 我已经创建了一个关于这个问题的功能请求。您可以在此处查看状态和更新:issuetracker.google.com/issues/110195685 谢谢,我也在 google-cloud-sql-discuss Google Groups 论坛上提交了这个,得到的回复基本上依赖于始终是同一用户。

以上是关于如何终止 Google Cloud SQL for PostgreSQL 中的会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Cloud Functions 连接 Google Cloud SQL?

如何连接到 Google Cloud SQL PostgresQL

如何将 Google Cloud SQL 与 Google Big Query 集成

如何通过 Exposed 连接到 Google Cloud SQL

如何将 Google Cloud SQL 与 C# 连接起来

如何增加 Google Cloud SQL Postgres 数据库的连接限制?