备份数据是应用程序最关键的活动之一。 Heroku PGBackups 使整个体验非常简单,但也具有很大的灵活性。
设置测试应用
Heroku 为每个 Rails 应用程序提供免费的 PostgreSQL 数据库,因为 Heroku 爱你。要了解备份功能,让我们从创建一个新的 Heroku 应用程序开始。如果您以前从未设置过 Heroku 应用程序,请查看他们的 入门页面 以了解您选择的语言。
Heroku 为每个 Rails 应用程序提供免费的 PostgreSQL 数据库,因为 Heroku 爱你。
Heroku 提供了一个已经配置了 PostgreSQL 的入门级 Ruby 应用程序,我将使用它。
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
好的,现在我们的测试应用程序已经运行,让我们加载一些示例数据。
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
Heroku PGBackups 基础知识
现在我们已经将一些关键数据加载到我们的系统中,我们想确保如果发生不好的事情我们可以将它恢复到原来的状态。 Heroku PGBackups 提供了很多用于执行此操作的选项,但我们将逐步完成所有这些选项。
创建手动备份
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
这将使用进度表立即开始备份。您可以按
CTRL + C
恢复提示,备份将在后台继续。它默认针对主 DATABASE_URL 运行,但如果您有多个数据库,您可以指定存储连接字符串的环境变量以在那里触发备份。
此外,如果您访问 Heroku Apps Web 界面并单击您的 Heroku PostgreSQL 数据库,您会注意到一个名为 PG Backups 的按钮。从这里您可以快速创建数据库快照并查看所有现有快照以下载或删除它们。
计划备份
如果您需要提取数据库的副本以运行一些测试或在对数据进行重大操作之前按原样保存内容,则手动备份非常有用。但对于大多数应用程序,我们希望定期安排这些备份。 Heroku PGBackups 允许您从命令行设置这些计划,如下所示:
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
刚刚安排了每晚美国东部标准时间凌晨 1 点的备份。 Heroku 为每个计划保留七次每日备份和一次每周备份。随着您的计划增加,您的备份保留也会增加。高级计划将包括 12 个月的保留,除了每日和每周备份外,还包括每月备份。
您可以使用以下命令查看计划备份列表:
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
并取消它们:
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
下载您的备份
无论是手动备份还是计划备份,有时您可能希望将其保存在 Heroku 之外。前面描述的 PG Backups 界面将为您提供指向和单击访问权限以下载其中任何一个。但我们都是关于自动化的,所以理想情况下这是我们想从命令行做的事情。
Heroku 提供了一个命令来给你一个过期链接。您可以使用不带参数的命令来获取最新备份,也可以指定特定快照的名称。要使用该命令自动下载我们的图像,我们可以使用 curl 并传入 Heroku 命令提供给我们的 url。
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
从备份恢复
从其中之一加载数据也相当简单。只需引用一个备份名称、一个应用程序名称::从您的另一个应用程序中提取的备份名称(例如从生产到暂存),或者 pg_dump 的公共 url 后跟数据库的配置引用以将数据恢复到其中。这里有一些例子:
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
以这种方式进行恢复时要小心;它将完全覆盖目标数据库。
数据库转储只是标准的 PostgreSQL
pg_dump
文件,因此您可以使用
pg_restore
轻松地将它们加载到任何其他非 Heroku PostgresSQL 数据库中。有关如何执行此操作的更多详细信息,请参阅
Heroku 导入/导出文档
。
您还可以使用几乎相同的语法从一个数据库直接复制到另一个数据库(假设下面列出的颜色是对数据库环境变量的引用)。
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
Heroku PGBackups 高级备份
在生产应用程序中,仅仅依靠夜间备份可能不够好。如果中午出现问题怎么办?每小时手动触发一次备份乍一看似乎是个好主意,但这可能会严重失控并给数据库带来很多额外压力。更糟糕的是,即使是夜间备份也会对数据库造成足够大的压力而您希望避免它们时会发生什么?
当夜间备份给数据库带来足够大的压力而您想避免时,您会怎么做?
预写日志 (WAL) 在提交实际写入数据库之前记录提交。这些提交的记录用于流式传输只读副本和备份以允许时间点恢复。有许多不同的方法可以利用这一点来解决我们的备份问题。
安排跟随者的备份
如果您使用的是标准级别或更高级别的数据库计划,则可以 创建关注者/只读副本 。关注者将收到流媒体更新;如果由于所涉及的压力而无法对主数据库进行夜间备份,那么针对跟随者安排这些备份将提供相同的好处,而不会降低应用程序性能。
时间点恢复
现在,想象一个场景,当一些非常重要的数据被意外删除、覆盖、更改或以某种方式损坏时。不管它是如何发生的,用户错误、开发人员错误、安全漏洞;重要的是它发生了。
这就是 Heroku 的持续保护 发挥作用的地方。要回滚到以前的时间点,您可以访问 Web 界面并创建回滚 — 数据库的克隆,但在特定时间点。只需指定日期和时间,然后噗……即时恢复(相对于数据库的大小)。
您还可以从命令行 创建回滚 。持续保护是使用开源工具 WAL-E 设置的,该工具允许将 PostgreSQL WAL 持续归档到 Amazon S3。
真实世界
现在让我们来看一个真实世界的场景。您需要在不关闭正在运行的应用程序的情况下从备份中获取数据。运行
pg:copy (pg_restore)
还不够好,因为这会覆盖现有数据库,使您失去备份后的所有新数据。时间点还原甚至会遇到同样的问题,尽管不太明显。
实际上,在这种情况下,您可以恢复备份或回滚数据库的副本,然后继续编写代码以查找并合并丢失的数据。我们现在就模拟一下。
如果您尚未使用我们的示例数据捕获备份,请立即执行此操作。这是真实世界的情况,所以我将使用生产层数据库(标准或更高),这意味着利用 Hobby 和 Free 层数据库不可用的功能来处理恢复。
如果您想继续,这里是 升级说明 。
现在打开
heroku run rails console
并运行以下命令以半随机方式删除我们一半的数据:
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
不好了!现在,使用上述技术之一,创建回滚或创建新数据库并将备份恢复到它。我要进行回滚,因此我将访问 Web 界面并选择几分钟前的数据库版本。
现在,让我们连接到我们的数据库并确保它包含所有内容。
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
完美的!现在我们如何合并数据?有很多方法可以做到这一点。您可以编写连接到两个数据库并插入缺失记录的脚本,或者使用包括数据同步的桌面客户端,如 Navicat。但是有一个更简单的方法。
PostgreSQL 包括一种称为 外部数据包装器 的东西,它允许一个 PostgreSQL 数据库连接到许多外部数据源,如 Redis 或另一个 PostgreSQL 数据库。 Heroku 通过 数据链接 使这更容易。您可以在那里阅读更多关于数据链接的信息,但出于我们的目的,我们希望将我们的主数据库(BRONZE)与我们恢复的备份(CYAN)链接起来,如下所示:
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
后一个命令将向您显示所有已配置的链接。如果出于某种原因你在第二个命令后收到错误,请确保你已经安装了 pg-extras 插件:
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
现在我们已连接,打开您的 psql 提示符,让我们将该数据与查询合并。
git clone https://github.com/heroku/ruby-getting-started.git
cd ruby-getting-started
heroku create
git push heroku master
heroku run rake db:migrate
heroku open
该查询针对我们为所有不在主表中的 ID 恢复的备份数据库进行选择,然后为我们将它们插入到主表中。
结论
PostgreSQL 可以管理您的数据完整性,而 Heroku PostgreSQL 可以确保它在紧急情况下是安全的,您几乎不需要付出任何努力。恢复是一个更复杂的野兽,但多亏了外部数据包装器(pg:links),合并我们需要的东西变得容易得多。始终备份您的数据。
由 Barry Jones 在 Codeship 博客上撰写。