Heroku黑客指南(九)

Postgresql数据库

(九)备份数据库

数据库备份当然很重要,不过执行并不容易。为了简化执行,heroku专门创造了一个数据库备份插件:pgbackups addon。目前所有的pgbackups插件计划都是免费的,也就是说可以免费备份你的数据库。

比如,我们打算使用最高的备份计划:auto-month,它包含如下内容:

  • 每天晚上自动备份DATABASE_URL(默认数据库)
  • 保留7个日备份
  • 保留5个周备份
  • 保留10个年备份

首先安装该插件:

$ heroku addons:add pgbackups:auto-month
Adding pgbackups:auto-month to myproject... done, v14 (free)
You can now use "pgbackups" to backup your databases or import an external backup.

插件一旦安装好,heroku就每天自动备份你的主数据库。查看已产生的备份任务,运行pgbackups命令。例如:

$ heroku pgbackups
! No backups. Capture one with ‘heroku pgbackups:capture‘.

因为我们刚安装好备份插件,所以还没有备份任务发生。可以强制执行一次手工备份:

$ heroku pgbackups:capture
HEROKU_POSTGRESQL_GREEN (DATABASE_URL) ----backup---> b001
Capturing... done
Storing... done

现在重新运行pgbackups命令,可以看到:

$ heroku pgbackups
ID | Backup Time | Size | Database
-----+---------------------+------------+------------------------
b001 | 2012/08/29 23:09.50 | 918.0bytes | HEROKU_POSTGRESQL_GREEN

随着时间增长,所有的已发生备份任务都会展现在这里。

在如上pgbackups列表里,ID以b打头的表示手工执行的备份,ID以a打头的表示自动执行的备份。你可以从命名方式区别它们。

请注意:上述我们只备份了默认数据库(DATABASE_URL)。如果你想备份不同的数据库,那么指定它的名字。例如:heroku pgbackups:capture HEROKU_POSTGRESQL_BLACK.

(十)下载数据库备份

下载数据库备份文件非常方便。假设你有下列已执行的备份任务:

$ heroku pgbackups
ID | Backup Time | Size | Database
-----+---------------------+------------+------------------------
b001 | 2012/08/29 23:09.50 | 918.0bytes | HEROKU_POSTGRESQL_GREEN

那么可以创建一个位于Amazon S3上的公共下载URL(该URL十分钟内有效),运行命令:

$ heroku pgbackups:url b001
"https://s3.amazonaws.com/hkpgbackups/blah@heroku.com/b001.dump?AWSAccessKeyId=blah&Expires=blah"

然后就使用wget, curl或其他工具下载这个URL的文件。备份文件是标准的Postgresql数据库导出文件,这意味着你可以将它恢复到任何Postgresql数据库,不管是不是位于heroku上。

(十一)从备份恢复数据库

假如发生了意外,你可能需要从数据库备份里恢复数据。比如有如下备份可用:

$ heroku pgbackups
ID | Backup Time | Size | Database
-----+---------------------+------------+------------------------
b001 | 2012/08/29 23:09.50 | 918.0bytes | HEROKU_POSTGRESQL_GREEN

你可以将上述备份任务b001的数据,恢复到你在heroku里的任何可用的数据库,使用pgbackups:restore命令:

$ heroku pgbackups:restore HEROKU_POSTGRESQL_GREEN b001
HEROKU_POSTGRESQL_GREEN (DATABASE_URL) <---restore--- b001
HEROKU_POSTGRESQL_GREEN
2012/09/20 23:09.50
918.0bytes
! WARNING: Potentially Destructive Action
! This command will affect the app: myproject
! To proceed, type "myproject" or re-run this command with --confirm myproject
> myproject
Retrieving... done
Restoring... done

请注意:备份恢复过程是不可逆的,你当前的数据将被备份数据完全替代。这个过程会比较久,如果备份文件较大的话。

(十二)关于备份的想法

不管你的数据库规模大小,总要有个备份。尤其是运行在云上的业务,不执行备份简直是自找麻烦。引用一个段子:

曾经有一个备份的机会摆在我面前,
我没有珍惜。
等到我失去的时候才后悔莫及。
人世间最痛苦的事莫过于此……

如果上天能够给我一个再来一次的机会,
我会对她说三个字:
我备份。
如果非要在前面加一个期限,
我希望是…..
一万年!

此条目发表在Common分类目录,贴了, 标签。将固定链接加入收藏夹。