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/[email protected]/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
请注意:备份恢复过程是不可逆的,你当前的数据将被备份数据完全替代。这个过程会比较久,如果备份文件较大的话。
(十二)关于备份的想法
不管你的数据库规模大小,总要有个备份。尤其是运行在云上的业务,不执行备份简直是自找麻烦。引用一个段子:
曾经有一个备份的机会摆在我面前,
我没有珍惜。
等到我失去的时候才后悔莫及。
人世间最痛苦的事莫过于此……
如果上天能够给我一个再来一次的机会,
我会对她说三个字:
我备份。
如果非要在前面加一个期限,
我希望是…..
一万年!