我正在尝试确定在 Amazon EC2 上备份 PostgreSQL 数据库的最佳方法。我读过几个选项。
1)每天对数据库正在使用的 EBS 卷进行快照。
我发现这种方法的问题是,如果在写入期间拍摄快照,会发生什么情况?我的数据会损坏吗?
2)使用pg_dump,压缩文件并存储在S3中。
pg_dump 不会创建损坏的数据,但是从 pg_dump 恢复数据库可能很耗时
应该使用什么策略?选项 1 看起来很诱人,因为它更容易实现和恢复,但使用这种方法会冒险吗?
答案1
我不能代表 PostgreSQL 发言,因为我不使用它,但我使用了选项 1 的变体来备份 EC2 上的 MySQL 数据库,并且成功恢复了它们,没有任何问题。
当然,第一个要求是您的数据库存储在 EBS 卷上,以便可以对其进行快照。我倾向于使用 XFS 作为文件系统,因为整个文件系统可以轻松冻结。
要开始快照过程,您需要冻结数据库并刷新表。有一个很棒的脚本可以执行此操作,以及冻结文件系统(如果是 xfs),名为ec2 一致快照(该网站确实有一些关于 PostgreSQL 的评论,可能会为您指明一个可接受的方向 - 它是为 Ubuntu 设计的,但可以在其他发行版(例如 Amazon 的 Linux/CentOS)上运行,没有太多问题)。我的理解是,使用 PostgreSQL,人们通常只需拍摄快照(在冻结文件系统后)并依靠 PostgreSQL 的内置恢复功能将所有内容恢复到正常运行状态。但是,xfs_freeze 对于获得一致的快照仍然很重要。
一旦文件系统冻结(并且如果可能,数据库已刷新并锁定),就拍摄快照(理想情况下,直接使用 API,而不是(非常)慢的基于 Java 的命令)。快照命令只需(几)秒钟即可返回,之后您可以解冻文件系统 - 创建的快照将保持一致,尽管有额外的读取。
鉴于快照在某种程度上是差异化的并且经过压缩,这种方法比使用 S3 更经济,并且提供更多选项,它还允许您以更快的速度恢复数据,并且应该比生成转储更短的时间来锁定数据库。还可以轮换快照以控制其数量 - 我写了一个perl 脚本帮我做那件事。
如果有疑问,请尝试第一个选项,然后创建一个 EBS 卷并测试数据库以查看一切是否正常 - 不要只是相信备份是好的。