【问题标题】:Import postgres database without roles导入不带角色的 postgres 数据库
【发布时间】:2013-06-13 17:32:29
【问题描述】:

我有一个使用 pg_dump 导出的数据库,但现在当我尝试再次导入时:

psql -d databasename < mydump.sql

尝试将角色授予不存在的人失败。 (错误提示'角色“xxx”不存在')

有没有办法自动为我的用户导入和设置所有角色?

【问题讨论】:

    标签: sql database postgresql import psql


    【解决方案1】:

    是的,您可以使用 pg_dumpall 的 -g 选项从源数据库中转储所有“全局”对象:

    pg_dumpall -g  > globals.sql
    

    然后在导入前针对您的目标数据库运行 globals.sql。

    【讨论】:

      【解决方案2】:

      导入的默认行为是将所有它不知道的角色替换为您正在执行导入的角色。因此,根据您需要数据库的用途,您可能只需导入它并忽略错误消息即可。

      引用http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE

      在还原 SQL 转储之前,拥有对象或被授予对转储数据库中对象的权限的所有用户必须已经存在。如果不这样做,还原将无法重新创建具有原始所有权和/或权限的对象。 (有时这是您想要的,但通常不是。)

      【讨论】:

      • 自从我第一次阅读这个答案以来,我错过了“你可能会没事”的部分。为了澄清这个答案,该命令可能在运行时起作用。显示的错误并未停止数据的导入。源中使用的角色不在目标中,与它们关联的任何数据现在都将与运行命令的用户关联。
      【解决方案3】:

      使用pg_restore,您可以使用--role=rolename 选项强制使用角色名称来执行还原。但转储必须是非纯文本格式。
      例如,您可以转储:

      pg_dump -F c -Z 9 -f my_file.backup my_database_name
      

      您可以通过以下方式恢复它:

      pg_restore -d my_database_name --role=my_role_name my_file.backup
      

      更多信息: http://www.postgresql.org/docs/9.2/static/app-pgrestore.html

      【讨论】:

        【解决方案4】:

        好吧,您可以创建与您缺少的名称相同的新角色,然后导入转储而不会出现错误。

        错误说'角色“xxx”不存在' - 所以创建它:)

        【讨论】:

          【解决方案5】:

          您可能正在寻找的答案是将--no-owner 添加到pg_restore 命令。与目前接受的答案不同,即使数据库中不存在转储中的角色,该命令也应该使用当前用户创建每个对象。

          所以 pg_restore 不会跳过任何元素,但如果导入的某些元素由不同的用户拥有,那么据我所知,所有记录现在都将由一个用户拥有。

          【讨论】:

          • 如何使用psql实现?这就是问题
          【解决方案6】:

          在较新版本的 pg_restore 中,它会抱怨文本文件导入。

          但是,您可以使用 awk 删除这些行。您可以将其通过管道传输到一个新文件以确保它不会破坏任何内容,或者直接将其通过管道传输到 psql 中,如下所示:

          cat my-import-file.sql | awk '!/old-role/' | psql -U target_owner -d target_db_name -1 -v ON_ERROR_STOP=1
          
          • 用您的导入文件替换my-import-file.sql
          • target_owner 替换为您的用户名
          • target_db_name替换为要创建的数据库的名称
          • old-role 替换为它所抱怨的角色

          如果您有多个角色:

          cat my-import-file.sql | awk '!/role1|role2|role3/' | psql -U target_owner -d target_db_name -1 -v ON_ERROR_STOP=1
          

          这将删除所有提及该角色的行。一切都将由登录到 psql 的用户创建。

          【讨论】:

            【解决方案7】:

            我使用了以下内容:

            pg_dump --no-privileges --no-owner $OLD_DB_URL | psql $NEW_DB_URL
            

            来自

            https://www.postgresql.org/docs/12/app-pgdump.html

            -O

            --无所有者

            不要输出命令来设置对象的所有权以匹配 原始数据库。默认情况下,pg_dump 发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句设置创建数据库的所有权 对象。当脚本运行时,这些语句将失败,除非它 由超级用户(或拥有所有 脚本中的对象)。制作一个可以被任何人恢复的脚本 用户,但会给该用户所有对象的所有权,指定 -O。

            此选项仅对纯文本格式有意义。为了 归档格式,您可以在调用 pg_restore 时指定选项。

            -x

            --无权限

            --no-acl

            防止访问权限转储(授予/撤销命令)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-09-02
              • 2020-02-20
              • 1970-01-01
              • 2016-07-13
              • 1970-01-01
              • 1970-01-01
              • 2015-07-31
              相关资源
              最近更新 更多