我在GCP SQL服务上运行postgres。我有一个主副本和一个读副本。
我已经在主节点上启用了pg_stat_statements,但我仍然得到消息,我几乎每一行都没有足够的权限。
当我试图在读取副本上启用扩展时,它给了我一个错误:cannot execute CREATE EXTENSION in a read-only transaction
.
我尝试用最高权限用户执行的所有操作(使用cloudsqlsuperuser
成员的用户,基本上与默认的postgres
用户相同)
我有两个问题:
- 我如何修复特权问题,以便我可以看到表中的统计数据?
- 如何在读副本上启用扩展?
谢谢!
在postgres 9.6上运行了更多的测试后,我也获得了消息<insufficient privilege>
.
我在postgres 9.6上运行了以下查询13岁和并得到了不同的结果:
SELECT userid, usename, query
FROM pg_stat_statements
INNER JOIN pg_catalog.pg_user
ON userid = usesysid;
我注意到postgres 9.6我不能看到的查询来自角色/用户cloudsqlagent和cloudsqladmin(预配置的云SQL postgres角色)。
postgres 13不会出现这种情况或者说是版本10或更高这是因为当使用EXTENSION pg_stat_statements时,来自所有用户的SQL语句对于使用cloudsqlsuperuser的用户是可见的。. 这是产品在不同版本之间的行为,在这个链接的蓝色框中有描述。
基本只在9.6版本所有用户的SQL语句都是NOT使用命令cloudsqlsuperuser对用户可见作用。
所以如果我在主服务器上启用它,它应该在副本上启用吗?
是的,在主服务器中启用扩展后,您可以连接到副本,并使用以下命令检查pg_stat_statements是否已启用:
SELECT * FROM pg_extension;
如果你想在postgres版本之间有更统一的行为,或者如果你强烈需要来自所有用户的SQL语句对cloudsqlsuperuser角色可见,我建议然后用模板特性请求创建一个公共问题跟踪器。
我希望这对你有用。
在权限方面,cloudsqlsuperuser
并不是一个真正的超级用户(但在GCP cloudsql中是最接近的)。由于这个原因,我有时发现我需要显式地授予它对对象/角色的访问权限,以便能够访问事物。
所以我试着做:
GRANT pg_read_all_stats TO cloudsqlsuperuser;
我不太确定如何启用读取副本。
然而,你可能会对最近发布的见解功能https://cloud.google.com/sql/docs/postgres/insights-overview感兴趣-我还没有能够正确地玩这个,但从我所看到的来看,它非常漂亮。