Nov2013ReplicationIssue

来自 PostgreSQL wiki
转至导航转至搜索

2013 年 11 月复制数据丢失问题

什么是 2013 年 11 月复制数据丢失问题?

这是一个在 2013 年 11 月 18 日发现的问题,当热备份副本(通过重新)启动时可能会导致其数据损坏,方法是将已提交的事务标记为未提交。此问题在 2013 年 12 月 5 日的更新版本中已修复。

黑客邮件列表在此处讨论

该问题有哪些症状?

此损坏的主要症状是行

  • 现在主数据库中,但在副本中缺失
  • 已在主数据库中删除但在副本中仍然可见
  • 已被更新,而其旧版本会与新的更新版本一起显示在副本上

以上任何问题都可能导致损坏的表中的键和约束违规。

即使出现该问题,也常常由于设置了正确的 提示位 而不会产生明显影响。

谁有面临该问题的风险?

用户 who

  • 正在使用以下 PostgreSQL 版本之一:9.3.0、9.3.1、9.2.5、9.1.10 和 9.0.14。早期版本不受影响。

Replicas which

  • 已启用热备份:配置中 hot_standby = on
  • 使用 recovery.conf 来配置流式复制、基于归档的复制或 PITR
  • 使用任何受影响版本重新)启动数据库

问题可能性增加

  • 通过频繁重新启动备用数据库
  • 在重启备用数据库时,有很多执行写查询的短事务
  • 不常进行检查点(高的 checkpoint_timeout、checkpoint_segments 设置)
  • 在从节点上从未读取数据
  • 在配置了 full_page_writes = off 时

何时将修复此问题?

PostgreSQL 项目于 12 月 5 日发布了一个修复此问题的更新版本。我们强烈建议所有使用内置复制的用户应用该更新。问题补丁已提交至所有受影响版本的 git 分支。

在修复之前,我可以做些什么来防止此问题?

如果你当前使用的是 9.2.4、9.1.9 或 9.0.13,并且使用任何形式的内置复制,请不要安装最新的更新。相反,请等待下一个更新(9.2.6、9.1.11 和 9.0.15)出现。

对于已更新或运行 9.3 的用户,可用的选项包括

  • 如果你使用的是 9.2.5、9.1.10 或 9.0.14,请将你的从服务器降级到先前的更新版本(9.2.4、9.1.9 或 9.0.13)。
  • 在安装了修复版本之前,通过设置 hot_standby=off 禁用对从设备的只读访问
  • 通过在主设备上停止写流量(即停机)来执行新的基础备份,从而启动你的从设备
  • 尽量减少重启从设备的次数
  • 应用修复此问题的源代码补丁。这要求用户从源安装或构建自己的软件包。

无论如何,我们建议使用受影响版本之一运行流复制的所有用户从新的基础备份重新创建他们的每个从设备,具体方法是

  • 在降级从设备后,或
  • 在应用补丁后,或
  • 在发布更新后应用更新,或
  • 在通过设置 hot_standby = off 禁用热备后,或
  • 在停止对主设备的写访问后

如何验证我是否已经遇到过此损坏?

没有已知的方法可以识别问题过去是否影响过备用,但可以比较主设备和备用设备的数据。