PostgreSQL pg_rewind实例--could not find previous WA
一、介绍
作为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、查找分叉点
说明: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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
磁盘空间不足的故障处理和系统中增加swap(继续分享实战经验)
1、du命令的学习du 使用方法,磁盘block满了,使用这个命令找出哪些文件或目录占用的空间大大小三者的区别:du du -h--人类可以读的方式 du -sh 显示目录的2、du与sort的搭配使用 -h不能与n搭配使用,会报错倒序排列,使文件或者目录由大到小显示3、inode满了模拟并解决--案例第1个里程碑:创建1个100k文件: dd if=/dev/zero of=/tmp/100k bs=1k count=100 第2历程碑:格式化第3个里程碑-挂载到 /app/log目录(默认不存在)挂载后发出df -h完成后查看inode数量。查看inode号第4里程碑:现在模拟inode号满了4、linux下面删除大量小文件:(解决inode号满了导致磁盘空间不足的情况)命令不支持文件名过多使用find 搭配rm来解决删除大量文件(ls搭配rm删除文件范围有限)5、linux文件删除原理:6、模拟文件没有被彻底删除导致磁盘空间不足:(重启服务)只要有deleted,硬链接数为0,进程调用数不为0,没有删除干净,有人在使用。解决:重启对应的服务 (服务名字(软件名)是rsyslog....
- 下一篇
用Go语言异常机制模拟TryCatch异常捕捉
有的同学看到Go和TryCatch一起出现,心里可能会说,难道Go语言升级了,加入了try...catch语句。哈哈,其实Go语言从创建之初就没打算加入try...catch语句,因为创建Go的那帮大爷认为try...catch挺烦人的,如果滥用,会造成程序混乱,所以就不打算加入try...catch(以后加不加入不好说)。 既然Go语言中并没有try...catch语句,那么为何文章标题说要使用TryCatch呢?其实Go语言中只是没有try...catch语句,并不是没有异常处理机制。Go语言中的异常处理机制就是著名的异常三剑客:panic、defer和recover。通过这3个家伙,是完全可以模拟出try...catch语句效果的,对了,后面还应该有个finally。在正式模拟try...catch语句之前,先来回顾下Go语言中的异常处理机制是如何玩的。 Go语言中的异常处理机制 在前面提到,Go语言通过panic、defer和recover来处理异常的,那么这3个东西是什么呢? 不管是什么异常处理机制,核心的原理都是一样的,通常来讲,一个完善的异常处理机制需要由下面3部分组成。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- 设置Eclipse缩进为4个空格,增强代码规范
- Windows10,CentOS7,CentOS8安装Nodejs环境