2016-11-14 70 views
0

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

我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数据库的人多的例子,但是,他们都没有解决的“全局“使用pg_dump将被忽略。我误解了文档吗?执行我的pg_restore后,我的登录未在数据库上创建。

任何帮助您可以提供有关获取完整数据库(包括全局)到我们的异地位置将不胜感激。

+3

'pg_dump'从不包含全局变量。你需要在'--globals-only'选项中使用'pg_dumpall'。 –

+0

这就是我发现的,但是,这不是AWS中的选项,因为它需要超级用户访问权限。当我尝试运行pg_dumpall时,收到错误“拒绝关系pg_authid的权限”。有没有人能够避开AWS限制? – Wendy

+0

我认为这是设计,而不是AWS的限制。我可能是错的。 –

回答

1

我一直无法在网上找到我的问题的答案。以防万一别人可能遇到这个问题,我想我会发布我的“解决方案”的高级概要。我走在我的胳膊肘去我的膝盖,但是这是我想出了: - 在内的每个PostgreSQL数据库

  1. 创建一个表(1角色,以及一个用于登录我创建2) AWS。这个表格将需要所有需要动态创建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语句时,我会传递一个默认值来进行更新。

我还没有完成这个过程,但它花了我好几天的时间才找到一个可行的选项,以避免pg_dumpall的功能。如果有人在我的逻辑中看到任何缺陷,或者有更好的解决方案,我很乐意阅读它。祝你好运!

0

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

你需要编译二进制文件,然后使用它,但它的工作原理!如果您发现任何问题,请随时发表评论。

您可以阅读更多关于内部工作here

+0

嗨Robbins。这看起来很不错。感谢您的分享。我可能需要一段时间才能让它通过。那么,这段代码手动编写pg_dumpall并存储在一个.sql文件中?它是否对源数据库进行了任何更改,还是只是模拟代码以便在目标数据库上执行? – Wendy

+0

(1)它是一个WIP。 (2)它不会对数据库进行任何*更改(否则整个练习是没有意义的)(3)我很快可能会在我的博客上发布更新,但遗憾的是这是我现在可以提供的最多的。 com。感谢 –

+0

已经将URL(在上面的答案中)更新到分支,而不是提交。应该可以在AWS RDS postgres上的大多数数据库中工作,让我知道如果不是这样。 –