1、介紹ide
做爲pg_rewind報錯章節補充一個用例,說明其用法。工具
2、實例指針
一、history文件code
--新主 $ 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
二、查找分叉點
說明: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/1F000090blog
三、此時ControlFile_target.checkPoint < divergerec && target的chkptendrec!=divergerec,因此能夠進行pg_rewindci
四、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/%Xget
3、小結it
這裏pg_rewind執行時,判斷不出來沒有分叉的情景,即本文的場景。此時執行pg_rewind會報錯,讓用戶還覺得WAL文件由損壞致使執行pg_rewind失敗。這個工具若是可以將這種場景識別出來,報不須要rewind是否是更好?io
4、pg_rewind原理及報錯流程分析參考ast
http://www.javashuo.com/article/p-ptcsdjjs-hn.html
http://www.javashuo.com/article/p-flgmqpqr-cs.html