>>与软件开发有关的知识:操作系统,数据库,网络通信等 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19625 个阅读者 刷新本主题
 * 贴子主题:  PostgreSQL pg_rewind实例--could not find previous WA 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-03-11 23:05:56     消息  查看  搜索  好友  邮件  复制  引用

  
一、介绍

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

     二、实例

     1、history文件    
--新主
$ cat 00000004.history
1    0/140000C8    no recovery target specified
2    0/19000060    no recovery target specified
3    0/1F000090    no recovery target specified

--老主
$ cat 00000003.history
1    0/140000C8    no recovery target specified
2    0/19000060    no recovery target specified

  2、查找分叉点  
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
说明: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/2368285
https://blog.51cto.com/yanzongshuai/2334303



----------------------------
原文链接:https://blog.51cto.com/yanzongshuai/2396533

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-13 11:02:11 重新编辑]
  Java面向对象编程-->数组
  JavaWeb开发-->Servlet技术详解(Ⅲ)
  JSP与Hibernate开发-->使用JPA和注解
  Java网络编程-->用Swing组件展示HTML文档
  精通Spring-->通过Axios访问服务器
  Vue3开发-->通过Vuex进行状态管理
  Mysql--所有版本安装以及完全卸载
  解决mysql问题:The server quit without updating PID file
  MySQL——mmm(Master-Master replication managerfor Mysql)...
  excel数据对比-----查找两列(表)的相同数据
  MySQL 处理重复数据
  SQL 撤销索引、表以及数据库
  SQL NOT NULL 约束
  SQL CREATE DATABASE 创建数据库语句
  SQL INSERT INTO SELECT 语句
  SQL FULL OUTER JOIN 关键字
  MySQL:如何用 SELECT 语句的 WHERE 子句过滤返回的数据
  网络运维 - 你与真相就差一层窗户纸
  从十年运维看“云”维趋势
  Mysql提升效率的神器: 索引
  程序员必须掌握的核心算法有哪些?
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。