PostgreSQL pg_rewind實例--could not find previous WA

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

二、查找分叉點
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/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

相關文章
相關標籤/搜索