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

Ian*_*lor 10 database postgresql heroku

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

我知道有一种简单的方法来执行一次性复制,使用heroku pg:

heroku pg:copy SOURCE_APP::SOURCE_DATABASE DESTINATION_DATABASE --app DESTINATION_DATABASE
Run Code Online (Sandbox Code Playgroud)

但这只是一次性的事情.

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

我尝试过使用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';
Run Code Online (Sandbox Code Playgroud)

限制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;
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗?

Jul*_*lie 5

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

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


Dav*_*dge 4

您没有理由不能在 dyno 上下载并安装 CLI,作为生产数据库每个副本的先驱。

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

简单的两步过程...

  1. 安装命令行界面
  2. 使用 CLI 执行数据库复制

事实上,它可以是一个独立的应用程序,没有任何网络或工作进程来运行它。

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