一、介紹
成都創(chuàng)新互聯(lián)服務(wù)項目包括九龍坡網(wǎng)站建設(shè)、九龍坡網(wǎng)站制作、九龍坡網(wǎng)頁制作以及九龍坡網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,九龍坡網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到九龍坡省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
作為pg_rewind報錯章節(jié)補充一個用例,說明其用法。
二、實例
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的值,可以得出兩者相等,則轉(zhuǎn)到第2個條目的比較
2)比較sourceHistory[1]、targetHistory[1]的時間線和begin的值,可以得出兩者相等,則轉(zhuǎn)到第3個條目的比較
3)比較sourceHistory[2]、targetHistory[2]的時間線和begin的值,可以得出兩者相等,此時比較結(jié)束
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開始的記錄,然后根據(jù)該記錄的xl_prev指針定位前一個wal記錄
2)判斷第1)步得到的wal記錄是否是checkpoint,如果不是則重新返回到第1),直到找到checkpoint點
3)這里就有個問題,如果得到的分叉點正好是老主結(jié)束位置,即本例:1F000090為分叉點,實際上是老主和新主沒有發(fā)生數(shù)據(jù)分叉,可以認為是沒有作為備沒有接收完新主數(shù)據(jù)呢
4)target從1F000090這個位置開始獲取prev指針向前找checkpoint時,因為這個位置后都是0了,所以不能繼續(xù)向下遍歷找了,報錯:could not find previous WAL record at %X/%X
三、小結(jié)
這里pg_rewind執(zhí)行時,判斷不出來沒有分叉的情景,即本文的場景。此時執(zhí)行pg_rewind會報錯,讓用戶還以為WAL文件由損壞導致執(zhí)行pg_rewind失敗。這個工具如果能夠?qū)⑦@種場景識別出來,報不需要rewind是不是更好?
四、pg_rewind原理及報錯流程分析參考
http://blog.itpub.net/31493717/viewspace-2639207/
http://blog.itpub.net/31493717/viewspace-2286140/