postgresql的時間線

參考:http://mysql.taobao.org/monthly/2015/07/03/

https://wiki.postgresql.org/images/e/e5/FOSDEM2013-Timelines.pdf

 

在做即時恢復時,爲了能支持恢復到任意時間點,引入了時間線的概念。

每當存檔恢復完成時,就會創建一個新的timeline來標識恢復後生成的一系列WAL記錄。時間軸ID號是WAL段文件名的一部分,所以新的時間軸不會覆蓋以前的時間軸生成的WAL數據。它的作用爲了區分因數據庫恢復造成的不同時間段的wal日誌,以支持dba在出現數據庫down機時依據基礎備份和wal日誌恢復大宕機之前的任意狀態。

wal文件的組成:由16進制命名總共24個字符由三部分組成: 時間線ID + LogId+ logSeg

0000000100000001000000C4
00000001 //時間線ID
00000001 //LogId
000000C4 //logSeg

何時會產生新的時間線?

兩種情況:

1、即時恢復(PITR) 配置recovery.conf文件,設置好recovery.conf文件後,啓動數據庫,將會產生新的timeline,而且會生成一個新的history文件。恢復的默認行爲是沿着與當前基本備份相同的時間線恢復。如果你想恢復到某些時間線,你需要指定的recovery.conf目標時間線recovery_target_timeline,不能恢復到早於基本備份分支的時間點。

比如:

 restore_command = 'cp /mnt/server/archivedir/%f %p' //從歸檔目錄恢復日誌
 recovery_target_time = '2015-7-16 12:00:00 ' //指定歸檔時間點,如沒指定恢復到故障前的最後一完成的事務
 recovery_target_timeline = '00000002.history' //指定歸檔時間線,’latest’代表最新的時間線分支,如沒指定恢復到故障前的pg_control裏面的時間線
 standby_mode = ‘off’ //打開後將會以備庫身份啓動,而不是即時恢復

 

2、主備架構,備庫promote爲主庫時,會切換時間線。

每次創建一個新的時間線,PostgreSQL都會創建一個“時間線歷史”文件,文件名類似.history,該文件可能含有多行記錄,每個記錄的內容格式如下:

<parentTLI> <switchpoint> <reason>
parentTLI:ID of the parent timeline
switchpoint: XLogRecPtr of the WAL position where the switch happened
reason: human-readable explanation of why the timeline was changed

image.png

比如上圖的00000002.history:

#cat 00000002.history
1       0/DE0000D8      no recovery target specified

當數據庫在從包含多個時間線的歸檔中進行恢復時,這些history文件幫助系統選取正確的wal文件。當我們在recovery.conf指定目標時間線tli進行恢復時,程序首先尋找.history文件,根據.history文件裏面記錄的時間線分支關係,找到從pg_control裏面的startTLI到tli之間的所有時間線對應的日誌文件,再進行恢復。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章