【问题标题】:Unable to restore psql database from pg_dump with a different username无法使用不同的用户名从 pg_dump 恢复 psql 数据库
【发布时间】:2019-03-05 09:52:43
【问题描述】:

我需要使用 postgres 用户名 1 从计算机 1 转储一个 postgres 数据库,然后使用 postgres 用户名 2 在计算机 2 上恢复它。我一直遇到看起来备份文件想要使用 username1 的错误:

当我在 computer2 上运行它时:

psql dbname < backupname.pgsql

我收到此错误:

ERROR:  role "username1" does not exist

我试过了:

// Dumping from computer1:

pg_dump dbname > backupname.sql
pg_dump dbname > backupname.pgsql
pg_dump -U username1 dbname -N topology -T spacial_ref_sys > backupname.pgsql


// Restoring on computer2:

psql dbname < backupname.pgsql

是转储还是恢复需要修改才能克服这个问题?

【问题讨论】:

    标签: postgresql psql pg-dump pg-restore


    【解决方案1】:

    问题在于倾倒。借助this post 的见解,我能够使用以下方法解决此问题:

    // On Computer1
    
    pg_dump dbname -O -x > backupname.sql
    
    
    // On Computer2
    
    psql dbname < backupname.sql
    

    pg_dump 使用的选项标志是:

    -O   <-- No owner
             Do not output commands to set ownership of objects to match the original database
    
    -x   <-- No privileges
             Prevent dumping of access privileges (grant/revoke commands)
    

    有关选项标志的更多信息,请参阅PostgreSQL docs for pg_dump

    【讨论】:

      【解决方案2】:

      您不需要通过放弃所有者/特权来削弱您的转储。您可以在恢复时执行此操作。

      pg_restore--no-acl(可能还有--no-owner)选项一起使用:

      -x
      --无特权
      --no-acl
          防止恢复访问权限(授予/撤销命令)。
      
      --no-owner
          不要输出命令来设置对象的所有权以匹配
          原始数据库。默认情况下,pg_restore 发出 ALTER OWNER 或 SET
          SESSION AUTHORIZATION 语句设置创建模式的所有权
          元素。这些语句将失败,除非初始连接
          到数据库是由超级用户(或拥有
          脚本中的所有对象)。使用 -O,任何用户名都可以
          用于初始连接,该用户将拥有所有
          创建的对象。
      

      比如:

      pg_restore --no-privileges --no-owner -U postgres --clean ... $Your_sql_backup
      

      【讨论】:

        【解决方案3】:

        如果您使用的是 pgAdmin,那么您可以使用 Owner 删除 DumpOptions #2 中的复选框,否则删除类似的权限 --no-privileges 并在转储查询中删除所有权,如 --no-password,如
        /usr/bin/pg_dump --host localhost --port 5432 --username "postgres" --no-password --format custom --no-privileges --no-tablespaces --verbose --file "as" "databasename"。 此外,如果您对表有限制,则在创建转储时也要禁用触发器。

        如果您无法创建数据库的另一个备份,则另一种方法是将转储数据库的所有者和角色复制到新数据库。如果您不这样做,那么您将收到一条错误消息 'ACL 不存在'(不确定是不是早就遇到过)

        【讨论】:

        • 我没有使用 pgAdmin,但也许有人会看到。感谢您提供此选项。 @Piyush
        • 谢谢@Piyush。
        猜你喜欢
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 2017-03-06
        • 2020-07-27
        • 1970-01-01
        相关资源
        最近更新 更多