我正在努力寻找适合我的 postgres 数据库的备份/恢复方法。
我的要求如下:
- DB 所有者是非超级用户帐户。它仅具有“可以登录”和“继承父角色权限”的权限。
- 备份应该可以在多个数据库主机之间转移(例如开发本地副本)
- 数据库恢复应该是一个明确的操作:只需制作原始数据库的精确副本即可
- 理想情况下(最好是这样),恢复将由非特权用户完成
因此,我尝试了以下方法,并获得了不同的效果:
使用“普通”pg_dump
这个在加载时会中断,因为它不会清除对象中的任何现有数据。如果我将 -c 添加到 pg_dump(在创建现有对象之前删除它们),则生成的 SQL 语句不会考虑其他数据库可能仍为空或只是过时且对象较少的可能性。因此删除语句会失败。
如果这个方法失败了,我就会去 -Fc...
使用自定义格式,pg_dump 似乎只有一种构建备份的方法。这很好。因此,变体将随 pg_restore 一起出现。我从 -C -c(重新创建数据库和对象)开始:
这个似乎什么都不做,永远无法以 postgres 用户身份运行。我收到很多“对象已存在”错误
当然,不使用删除/创建标志会导致更严重的失败。
如果不这样做,我采取了两个步骤:
删除架构公共级联
这个与 -O --role=non-admin-role 一起使用,但有一个语句失败。处理扩展的那个。
当由 postgres 运行并恢复对象所有权时,它不起作用。它只是不恢复所有权。公共架构中的所有内容都归 postgres 所有。
删除数据库/创建数据库/使用 postgresql 恢复
仅此一项似乎可以按预期工作(显然,当由 postgres 运行时),但对于我进行简单的备份/恢复而言,它非常激进。此外,它不满足“恢复应由非特权用户完成”的要求。
我现在在第 11 页,看看这是否有任何区别。
那么,我做错了什么?您有实际有效的简单双命令备份/恢复示例吗?我很想听听
答案1
你说“备份/恢复”,但我思考你的意思是“分发副本”。
如果你意思是“恢复”,然后使用标准工具标准方式。其他任何事情都只会增加发生 [严重] 错误的风险,而您最承受不起。是的,这些工具需要提升权限。这就是野兽的本性。
到分发副本对于数据库来说,“pg_dump -Fc”是可移植性最高的选项,甚至可以跨越操作系统界限,但可能会产生最大的转储文件(但“磁盘空间很便宜”)。
是的,这些文件的接收者必须知道他们正在做什么拥有自己的数据库。我认为这是一件好事,因为这让他们更加了解你的角色,即 DBA。
如果目的是为其他人提供数据库副本没有他们有权限为自己创建数据库,那么你只需要这样做对他们来说。您创建数据库,复制并填充表,授予这些表的相关权限,然后他们从那里拿走。