AWS pg_dump不包含全局

时间:2016-11-14 17:07:32

标签: postgresql amazon-web-services

我们在AWS RDS中有多个PostgreSQL实例。我们需要维护每个数据库的内部部署副本,以符合我们的灾难恢复策略。我成功地使用pg_dump和pg_restore将数据库模式和表导出到我们的内部部署服务器,但是我在导出角色和表空间方面没有成功。我发现这只能通过使用pg_dumpall来实现,但由于这需要超级用户访问权限,并且RDS中不允许这样做,我如何将数据库的这些方面导出到我们的内部部署服务器上?

我的pg_dump命令:

Pg_dump -h {AWS Endpoint} -U {Master Username}-p 5432 -F c -f C:\AWS_Backups\{filename}.dmp {database name}

我的pg_restore命令:

pg_restore -h {AWS Endpoint} -p 5432 -U {Master Username} -d {database name} {filename}.dmp

我找到了多个使用pg_dump导出PostgreSQL数据库的人的例子,但是,他们没有解决" Globals"使用pg_dump忽略的。我误读了文档吗?执行我的pg_restore后,我的登录没有在数据库上创建。

我们非常感谢您将 FULL 数据库(包括全局数据)提供给我们的非现场位置所提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

我无法在网上找到问题的答案。为了防止其他人遇到这个问题,我想我会发布一个关于我的“解决方案”的高级概述。我绕着肘部走到膝盖,但这是我提出的选择:

  1. 在AWS中的每个PostgreSQL数据库中创建一个表(我为角色创建了2 - 1,为登录创建了一个)。这个表需要包含动态创建SQL以进行CREATE,GRANT,REVOKE等所需的所有列。
  2. 将所有角色,登录,权限和权限插入此表。这些分散在各处,但这里是我使用的:
    • pg_auth_members(角色和登录关系)
    • pg_roles(角色和登录权限,即可以登录,继承父级等)
    • information_schema.role_usage_grants(架构权限)
    • information_schema.role_table_grants(表格权限)
    • information_schema.role_routine_grants(功能特权)
  3. 为了填补空白,下面的网页上有一些聪明的查询,可以使用内置函数来检查访问权限。您必须循环遍历表并一次处理一行
  4. 一旦所有数据都在这些表中,您就可以执行pg_dump,它会将每个数据库中的信息提取到您的内部部署位置。我是通过Python脚本完成的。
  5. 在服务器上,使用表中的数据动态创建运行CREATE,GRANT,REVOKE等脚本所需的SQL语句。保存在.sql文件中,您可以指示Python脚本针对数据库执行并重新创建AWS角色和登录。
  6. 有一件事我忘了提及 - 因为我们无法访问AWS中的pg_auth_id表,我发现无法从AWS中提取密码。我们将把它们存储在密码管理器中,当我创建CREATE ROLE语句时,我将传递一个默认值进行更新。
  7. 我还没有完成这个过程,但是我花了几天的时间来找到缺少pg_dumpall功能的可行选项。如果有人发现我的逻辑存在任何缺陷,或者有更好的解决方案,我很乐意阅读它。祝你好运!

答案 1 :(得分:0)

解决方案:我的工作解决方案已发布到我的Github帐户。

您需要编译二进制文件并使用它,但它可以工作!如果您发现任何问题,请随时发表评论。

您可以详细了解内部工作原因here