PostgreSQL 崩溃恢复

Har*_*rry 6 postgresql

我们计划在我们的应用程序中使用 PostgreSQL,但担心崩溃安全和恢复。

我在 PostgreSQL 中找不到任何数据库崩溃恢复方法或进程。我知道 PostgreSQL 中一定有一些东西。

建议?所以如果有人能帮我找到这个,那就太好了。

Cra*_*ger 20

碰撞安全

PostgreSQL 在一定范围内是安全的。它保证始终如果数据库系统崩溃或它在重启/断电主机/意外崩溃保存提交的数据。这就是Din 的ACID意思——原子性、一致性、隔离性、持久性。

PostgreSQL 崩溃安全的关键特性是预写日志 (WAL)。文档对它的解释比我以往任何时候都好。

这种碰撞安全不能替代良好的备份

  • PostgreSQL 无法保护您免受文件系统损坏或硬盘驱动器故障的影响。它使用的存储系统需要可靠。

  • 硬盘驱动器和 SSD出现故障,因此 RAID 是必要的,但不足以提供保护。您需要备份和/或复制来防止多驱动器故障、文件系统损坏等。

  • PostgreSQL 中记录的某些设置削弱了它所做的崩溃安全保证。例如,如果您设置了,则您fsync=off授予 PostgreSQL 权限以在它崩溃时销毁您的数据以换取速度更快。

  • PostgreSQL 保证不会保存未提交的数据,如果在事务之前系统崩溃,数据就会丢失COMMIT。没有被包围的语句BEGINCOMMIT为此目的在语句返回时提交。

还有更多,但简短的版本是 Pg 是防崩溃和耐用的,但您仍然需要照顾基础设施中的其他层,这就是您需要的原因:

备份

不要只是每周pg_dump重复一遍又一遍地覆盖相同的转储文件,这会以流泪结束。使用多个备份策略,并保留历史备份而不仅仅是最近的备份。

例如,我保留转储连续存档/PITR 副本。我每天保存pg_dump一周,然后每周转储一个月,每月转储一年,以给我一些时间线保护。对于 PITR 设置,我每周从基本备份中刷新;它主要是为了让我能够从任何故障或灾难性错误中恢复到最近的 5 分钟。当我不小心删除一个表时,每晚转储不会帮助我恢复过去 23 小时的数据;PITR 会。

这里还有很多:

不要成为出现在 Pg 列表中说“我的硬盘崩溃了,我该如何恢复我的数据库?”的人之一。就像这个人一样,他问这个问题是为了好玩,因为他有备份,但很好奇他的数据库是否可以恢复。(答案:可能不是)。

修复或恢复损坏的数据库

如果您正在阅读本文是因为您在搜索中找到了它,并且您怀疑自己的 Pg 数据库已损坏,请在尝试任何修复之前阅读本文

如果崩溃恢复是指修复损坏的数据库的修复工具,不,没有什么。pg_resetxlog可能会使您免于损坏/丢失的事务日志,但可能会在此过程中损坏您的数据库,因此您通常需要在之后转储并重新加载。没有任何类型的fsck工具,也没有类似的东西,myisamchk因为与 MyISAM 不同,Pg 的表被设计为不会作为正常操作的例行部分损坏。拥有某种类型的pg_dbcheck.

数据库首先不会被损坏,除非:

  • 底层硬件故障
  • 操作系统或文件系统有错误
  • PostgreSQL 有一个错误
  • PostgreSQL 被明确配置为不持久
  • 用户做了一些愚蠢的事情,比如从数据库目录中删除东西

在所有这些情况下,自动修复无论如何都是不切实际的。

保留任何数据库的良好备份,而不仅仅是 Pg。不要指望能够修复损坏,因为您可能无法修复。


a_h*_*ame 5

听起来您正在寻找时间点恢复:http : //www.postgresql.org/docs/current/static/continuous-archiving.html

关于高可用性的章节对您来说也可能很有趣:http : //www.postgresql.org/docs/current/static/high-availability.html