PostgreSQL pg_rewind例項--could not find previous WAL record at %X/%X

yzs87發表於2019-05-17

一、介紹

    作為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原理及報錯流程分析參考

    http://blog.itpub.net/31493717/viewspace-2639207/

    http://blog.itpub.net/31493717/viewspace-2286140/



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2644827/,如需轉載,請註明出處,否則將追究法律責任。

相關文章