1

我在 GCP SQL 服务上运行 postgres。我有一个主副本和一个只读副本。

我已经在主节点上启用了 pg_stat_statements,但我仍然收到消息说我对几乎每一行都没有足够的权限。

当我尝试在只读副本上启用扩展时,它给了我一个错误:cannot execute CREATE EXTENSION in a read-only transaction.

我尝试对我拥有的最高权限用户执行的所有这些操作(使用属于 的成员的用户cloudsqlsuperuser,与默认用户基本相同postgres

所以我有两个问题:

  1. 如何解决权限问题,以便可以查看表中的统计信息?
  2. 如何在只读副本上启用扩展?

谢谢!

4

2 回答 2

1

postgres 9.6上运行了更多测试后,我也获得了这些消息<insufficient privilege>

我在postgres 9.613上运行了以下查询并获得了不同的结果:

SELECT userid, usename, query
FROM pg_stat_statements
INNER JOIN pg_catalog.pg_user
ON userid = usesysid;

我注意到在postgres 9.6中我看不到的查询来自角色/用户 cloudsqlagent 和 cloudsqladmin(预配置的 Cloud SQL postgres 角色)。

这不会发生在postgres 13或更好的版本 10 及更高版本中,这是因为在使用 EXTENSION pg_stat_statements 时,来自所有用户的 SQL 语句对具有cloudsqlsuperuser的用户可见。这是产品在不同版本中的行为,在此链接的蓝色框中进行了描述。

基本上只有在9.6版中,来自所有用户的 SQL 语句对于具有cloudsqlsuperuser角色的用户是可见的。

所以如果我在主服务器上启用它,它也应该在副本上启用?

是的,在 master 中启用扩展后,您可以连接到副本并使用以下命令检查 pg_stat_statements 是否已启用:

SELECT * FROM pg_extension;

如果您希望跨 postgres 版本的行为更加统一,或者如果您强烈需要所有用户的 SQL 语句对 cloudsqlsuperuser 角色可见,我建议您使用模板功能请求创建一个公共问题跟踪器。

希望这个对你有帮助。

于 2021-03-25T18:15:31.680 回答
0

在权限方面,cloudsqlsuperuser不是真正的超级用户(但与您在 GCP cloudsql 中获得的一样接近)。因此,我有时发现我需要明确授予它对对象/角色的访问权限才能访问事物。

因此我会尝试做:

GRANT pg_read_all_stats TO cloudsqlsuperuser;

不幸的是,我不太确定如何在只读副本上启用。

但是,您可能对最近发布的洞察功能感兴趣https://cloud.google.com/sql/docs/postgres/insights-overview - 我还不能正确使用它,但从我的已经看到它非常漂亮。

于 2021-03-06T08:32:22.607 回答