如何在Heroku上安排从生产到登台的数据库的连续副本?

时间:2016-12-31 00:41:21

标签: database postgresql heroku

我正在设置一个计划,以便我的登台数据库始终是我的生产数据库的副本,并且每天或每小时一次复制。

我知道使用heroku pg可以轻松执行一次性复制:

heroku pg:copy SOURCE_APP::SOURCE_DATABASE DESTINATION_DATABASE --app DESTINATION_DATABASE

但这只是一次性的事情。

我也知道使用Heroku调度程序运行预定命令很容易,这些命令在一次性dynos中运行。但是dynos上没有安装Heroku Toolbelt,因此heroku pg:copy不可用。

我尝试过使用pg_dump | pg_restore,但我遇到了两个问题之一:

在不限制架构的情况下,它失败了,因为我认为我没有正确的权限:

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 3205; 0 0 COMMENT EXTENSION plpgsql 
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

pg_dump限制为仅--schema=public,它会失败,因为某些扩展依赖于公共架构,并且它们不会被删除。

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 9; 2615 16385 SCHEMA public Storm
pg_restore: [archiver (db)] could not execute query: ERROR:  cannot drop schema public because other objects depend on it
DETAIL:  extension citext depends on schema public
extension pg_stat_statements depends on schema public
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
    Command was: DROP SCHEMA IF EXISTS public;

最好的方法是什么?

2 个答案:

答案 0 :(得分:5)

您是否考虑过创建数据库关注者(也称为主/从配置)? https://devcenter.heroku.com/articles/heroku-postgres-follower-databases

这将使用生产中的数据不断更新您的关注者数据库。请注意,如果您直接在关注者数据库上更改了数据,那么这不一定会被覆盖,因此不确定这是否是您所需要的可能解决方案。

答案 1 :(得分:3)

没有理由不能在dyno上下载和安装CLI作为生产数据库的每个副本的前身。

您需要的只是从调度程序调用的shell脚本,并让shell脚本安装CLI并使用适当的环境变量来保存所需的凭据。

简单的两步过程...

  1. 安装CLI
  2. 使用CLI执行数据库副本
  3. 事实上,它可以是一个独立的应用程序,没有任何运行此工作的Web或工作进程。

    我们使用类似的方法运行我们自己的备份,并将它们上传到AWS S3存储桶,独立于Heroku自己的备份,因此我们安装了Heroku和AWS CLI。