我正在设置一个计划,以便我的登台数据库始终是我的生产数据库的副本,并且每天或每小时一次复制。
我知道使用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;
最好的方法是什么?
答案 0 :(得分:5)
您是否考虑过创建数据库关注者(也称为主/从配置)? https://devcenter.heroku.com/articles/heroku-postgres-follower-databases
这将使用生产中的数据不断更新您的关注者数据库。请注意,如果您直接在关注者数据库上更改了数据,那么这不一定会被覆盖,因此不确定这是否是您所需要的可能解决方案。
答案 1 :(得分:3)
没有理由不能在dyno上下载和安装CLI作为生产数据库的每个副本的前身。
您需要的只是从调度程序调用的shell脚本,并让shell脚本安装CLI并使用适当的环境变量来保存所需的凭据。
简单的两步过程...
事实上,它可以是一个独立的应用程序,没有任何运行此工作的Web或工作进程。
我们使用类似的方法运行我们自己的备份,并将它们上传到AWS S3存储桶,独立于Heroku自己的备份,因此我们安装了Heroku和AWS CLI。