PostgreSQL主从日志分叉分析
最新的pg_rewind也加了很多功能,例如从备库上做数据源、可以让主库以单用户模式启动继续做rewind。网上有很多帖子在说pg_rewind的原理及使用方法,但大家在使用过程还是有不少的疑惑:
1、同步模式下,为什么还有日志分叉。
2、pg_rewind有时候会失败,有时候会拉取很久之前的wal日志,pg_rewind失败了,会破坏掉原来的数据库目录。
我们这里重点讨论第一个问题:
分叉说明:
1、同步模式下不会丢数据:任何一个commit操作,都会在备机上落盘才会返回成功,因此不会存在抹掉已经commit的记录。
2、为什么同步模式还有日志分叉:
1)原来主库启动时,会对checkpoint之后的wal日志进行重做,直到重做到最后一个wal,那么原来没有commit的日志,也会继续replay。
2)如果继续以主启动:那么这些没有提交的事务,都会在第一次查询的时候读取clog,读取到事务abort,让数据库正常的走。
3)如果以备节点加入集群:那么这些没有提交的事务,可能在新主库中只有一部分是同过来了(只有commit的时候才会追齐),如上图可能只接收到了800的长度。那么原主跟新主同步的时候,就日志分叉了。就需要找到他们的一致性点,然后重做。
3、为什么要找到最近一个checkpoint点:因为只有checkpoint之后,块的第一次修改会记录到wal日志,因此只有从这个点回放才会最正确的。
严以律己、宽以待人