walminer

如何在PostgreSQL故障切换后找回丢失的数据

瘦欲@ 提交于 2020-04-06 21:29:48
1. 背景 PostgreSQL的HA方案一般都基于其原生的流复制技术,支持同步复制和异步复制模式。 同步复制模式虽然可以最大程度保证数据不丢失,但通常需要至少部署三台机器,确保有两台以上的备节点。 因此很多一主一备HA集群,都是使用异步复制。 在异步复制下,主库宕机,把备节点切换为新的主节点后,可能会丢失最近更新的少量数据。 如果这些丢失的数据对业务比较重要,那么,能不能从数据库里找回来呢? 下面就介绍找回这些数据的方法 2. 原理 基本过程 备库被提升为新主后会产生一个新的时间线,这个新时间线的起点我们称之为分叉点。 旧主故障修复后,在旧主上从分叉点位置开始解析WAL文件,将所有已提交事务产生的数据变更解析成SQL。 前提是旧主磁盘没有损坏,能够正常启动。不过,生产最常见的故障是物理机宕机,一般重启机器就可以恢复。 业务拿到这些SQL,人工确认后,回补数据。 为了能从WAL记录解析出完整的SQL,最好 wal_level 设置成logical,并且表上有主键。 此时,对于我们关注的增删改DML语句,WAL记录中包含了足够的信息,能够把数据变更还原成SQL。 详细如下: INSERT WAL记录中包含了完整的tuple数据,结合系统表中表定义可以还原出SQL。 UPDATE WAL记录中包含了完整的更新后的tuple数据,对于更新前的tuple,视以下情况而定。 -

PostgreSQL WAL解析与闪回的一些想法

匆匆过客 提交于 2020-04-06 10:34:03
PostgreSQL WAL解析与闪回的一些想法 1. 背景 最近在walminer基础做了不少修改,以支持我们的使用场景。详细参考 如何在PostgreSQL故障切换后找回丢失的数据 修改也花了不少精力和时间,这个过程中有些东西想记录下来,方便以后查阅。 所以,这篇东西有点像流水账。 2. WAL文件格式 解析WAL的第一步是要了解WAL的文件格式,我觉得最详细易懂最值得看的资料是下面这个。 http://www.interdb.jp/pg/pgsql09.html 但是,以上还不够。细节的东西还是要看源码。我主要看的是写WAL记录的地方。 walminer作者李传成的博客里也有不少WAL解析相关的文章,是后来才发现的,我还没有看过。 https://my.oschina.net/lcc1990 3. walminer的解析流程 walminer解析WAL的入口是pg_minerXlog()函数。其主要过程如下 加载数据字典 起点搜索解析阶段 遍历WAL,根据输入的起始时间和起始xid找到匹配的第一个事务。 这个阶段只解析事务类型的WAL记录,其他WAL记录快速跳过。 完全解析阶段 紧接着2的位置,继续往下进行完整的解析。 这个阶段,会收集所有FPI(FULL PAGE IMAGE)并反映它们的变更, 还会收集所有DML(insert/update/delete)类型的WAL记录