【问题标题】:Cloud SQL - PostgreSQL - Import failed due to the lack of superuser permissionCloud SQL - PostgreSQL - 由于缺少超级用户权限,导入失败
【发布时间】:2021-03-11 10:37:50
【问题描述】:

我正在通过生成转储文件将所有角色从托管在 GCE VM 中的 PostgreSQL 迁移到 Cloud SQL

sudo -Hu postgres pg_dumpall -U postgres --globals-only --file=globals.sql

当我在 Cloud SQL 中导入相同的(globals.sql)时,我遇到了以下错误:

exit status 3 SET SET SET CREATE ROLE ERROR: must be superuser to alter superusers

注意: 我使用 postgres 用户将此转储文件导入云端 sql 数据库。

我很好奇,由于 postgres 用户没有超级用户权限,还有其他方法可以解决这个问题吗?

我尝试使用 cloud shell 从 globals.sql 文件中执行一个查询,输出如下:

postgres=> CREATE ROLE vipinm;
CREATE ROLE
postgres=> ALTER ROLE vipinm WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS;
ERROR:  must be superuser to alter superusers

提前致谢!

【问题讨论】:

    标签: postgresql google-cloud-sql postgresql-11 cloud-sql-proxy


    【解决方案1】:

    psql documentation 说:

    如果 psql 正常完成,则返回 0 给 shell,如果发生它自己的致命错误(例如,内存不足,未找到文件),则返回 1,如果与服务器的连接出错并且会话不是交互式的,则返回 2 , 如果脚本中发生错误并且设置了变量 ON_ERROR_STOP,则为 3。

    所以不要设置ON_ERROR_STOP

    错误意味着您无法从转储中执行以下行:

    ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS;
    

    没关系,你可以忽略错误。

    【讨论】:

    • 感谢您的回答!我尝试在云外壳中执行查询,以下是输出:在我的情况下,用户是 NOSUPERUSER postgres=> CREATE ROLE vipinm; CREATE ROLE postgres=> ALTER ROLE vipinm WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS;错误:必须是超级用户才能更改超级用户
    【解决方案2】:

    这是一个错误。作为非超级用户,您甚至不能重申另一个角色仍然不是超级用户,因为即使提及有关超级用户的任何内容,即使它没有任何效果也会引发错误。您可以通过在角色的最终状态下创建角色来解决此问题,而不是像 pg_dump 喜欢做的那样先创建然后再改变。

     CREATE ROLE vipinm WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS;
    

    或者,您可以从 ALTER 语句中删除所有不会导致任何更改而只是重申当前状态的属性,留下:

     ALTER ROLE vipinm WITH LOGIN;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2019-09-24
      • 2018-04-25
      相关资源
      最近更新 更多