如何终止 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