博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL pg_rewind实例--could not find previous WA
阅读量:7223 次
发布时间:2019-06-29

本文共 1373 字,大约阅读时间需要 4 分钟。

一、介绍

作为pg_rewind报错章节补充一个用例,说明其用法。

二、实例

1、history文件

--新主$ cat 00000004.history1    0/140000C8    no recovery target specified2    0/19000060    no recovery target specified3    0/1F000090    no recovery target specified--老主$ cat 00000003.history1    0/140000C8    no recovery target specified2    0/19000060    no recovery target specified

2、查找分叉点

PostgreSQL pg_rewind实例--could not find previous WA
说明:findCommonAncestorTimeline:
  1)比较sourceHistory[0]、targetHistory[0]的时间线和begin的值,可以得出两者相等,则转到第2个条目的比较
  2)比较sourceHistory[1]、targetHistory[1]的时间线和begin的值,可以得出两者相等,则转到第3个条目的比较
  3)比较sourceHistory[2]、targetHistory[2]的时间线和begin的值,可以得出两者相等,此时比较结束
  4)取第3个条目进行返回:MinXLogRecPtr(sourceHistory[i].end, targetHistory[i].end),此时返回的是sourceHistory[i].end的值作为分叉点,即 0/1F000090

3、此时ControlFile_target.checkPoint < divergerec && target的chkptendrec!=divergerec,所以可以进行pg_rewind

4、findLastCheckpoint查找分叉点divergerec之前最近的checkpoint作为rewind起点。

  1)首先需要定位到分叉点divergerec开始的记录,然后根据该记录的xl_prev指针定位前一个wal记录
  2)判断第1)步得到的wal记录是否是checkpoint,如果不是则重新返回到第1),直到找到checkpoint点
  3)这里就有个问题,如果得到的分叉点正好是老主结束位置,即本例:1F000090为分叉点,实际上是老主和新主没有发生数据分叉,可以认为是没有作为备没有接收完新主数据呢
  4)target从1F000090这个位置开始获取prev指针向前找checkpoint时,因为这个位置后都是0了,所以不能继续向下遍历找了,报错:could not find previous WAL record at %X/%X

三、小结

这里pg_rewind执行时,判断不出来没有分叉的情景,即本文的场景。此时执行pg_rewind会报错,让用户还以为WAL文件由损坏导致执行pg_rewind失败。这个工具如果能够将这种场景识别出来,报不需要rewind是不是更好?

四、pg_rewind原理及报错流程分析参考

转载于:https://blog.51cto.com/yanzongshuai/2396533

你可能感兴趣的文章
python之路---07 join() fromkeys() 深浅拷贝
查看>>
web2py官方文档翻译02
查看>>
vector容器的简单用法
查看>>
Python3-join()和split()
查看>>
大型网站架构演变和知识体系
查看>>
Speed Limit
查看>>
计算直线的交点数
查看>>
Adding Reversed Numbers
查看>>
如何用dw新建一个网页
查看>>
中小型运维团队运维自动化平台设计
查看>>
读写,复制文件
查看>>
datetime的精度
查看>>
vue.js学习系列-第一篇
查看>>
On the way learning spring 3
查看>>
Hybris 预备知识学习列表
查看>>
求2个有序数组合并后的中位数,时间复杂度为O(lgn)
查看>>
Java之深入JVM(4) - 由一个栈溢出的问题看Java类和对象的初始化续
查看>>
nodejs mongoose populate 多层模型
查看>>
OC中NSDictionary(字典)、NSMutableDictionary(可变字典)、NSSet(集合)、NSMutableSet(可变集合)得常用方法...
查看>>
GB2312的编码规则
查看>>