GCP pg_stat_statements 权限和只读副本不足

GCP pg_stat_statements insufficient privileges and read replicas

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

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

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

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

所以我有两个问题:

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

谢谢!

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

因此我会尝试这样做:

GRANT pg_read_all_stats TO cloudsqlsuperuser;

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

不过,您可能对最近发布的见解功能感兴趣 https://cloud.google.com/sql/docs/postgres/insights-overview - 我还不能正确使用它,但据我所知,它非常漂亮。

在 运行 对 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 中注意到,我看不到的查询来自 roles/users cloudsqlagent 和 cloudsqladmin(预配置的 Cloud SQL postgres 角色)。

postgres 13 或更好地说 版本 10 和更高版本 不会发生这种情况,这是因为在使用 EXTENSION pg_stat_statements, SQL 来自所有用户的语句对具有 cloudsqlsuperuser 的用户可见。这是产品在不同版本之间的行为,在link.

的蓝色框中进行了描述

基本上只有在版本 9.6 中,来自所有用户的 SQL 语句 NOT 对 [=34] 的用户可见=]cloudsqlsuperuser角色。

So if I enable it on the master, it should be enabled on the replica as well?

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

SELECT * FROM pg_extension;

如果您希望在 postgres 版本之间有更统一的行为,或者如果您强烈需要来自所有用户的 SQL 语句对 cloudsqlsuperuser 角色可见,我建议您创建一个 public issue tracker使用模板功能请求。

我希望你觉得这有用。