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