PostgreSQL運維—深入淺出時間線Timelines
PostgreSQL運維—深入淺出時間線Timelines
時間線Timelines
時間先Timelines概述
為了區分因數據庫恢復造成的不同時間段的wal日志而產生的時間記錄
當歸檔文件恢復完成后,創建一個新的時間線用來區別新生成的WAL記錄。WAL文件名由時間線和日志序號組成
[postgres@lyp archive]$ ll total 4 lrwxrwxrwx. 1 postgres postgres 69 Feb 17 22:51 000000010000000000000001 lrwxrwxrwx. 1 postgres postgres 69 Feb 17 22:51 000000010000000000000002 lrwxrwxrwx. 1 postgres postgres 69 Feb 17 22:51 000000010000000000000003 [postgres@lyp archive]$ [postgres@lyp archive]$ pg_controldata |grep TimeLineID Latest checkpoint's TimeLineID: 2 Latest checkpoint's PrevTimeLineID: 2 [postgres@lyp archive]$
時間線ID號是WAL文件名組成之一,因此一個新的時間線不會覆蓋由以前的時間線生成的WAL。

每個時間線類似一個分支,在當前時間線的操作不會對其他時間線WAL造成影響。
時間線就是為了讓數據庫管理員在數據庫出現未知災難時候依據基礎備份和wal日志(包含已經歸檔的)恢復到宕機前的任意一個狀態。
- 當對數據庫進行了基于時間點的還原(PITR)后,就會產生一次新的時間線
- 當備庫切換成主庫也會產生一次時間線。
參數recovery_target_timeline
recovery_target_timeline ( ``string)
指定恢復到特定時間軸。默認設置是沿著執行基本備份時的當前時間線恢復。將此設置為 latest 將恢復到存檔中找到的最新時間軸,這在備用服務器中很有用。
除此之外,您只需要在復雜的重新恢復情況下設置此參數,您需要返回到在時間點恢復后到達的狀態。
在通過pg_basebackup進行備份的時候添加參數“-R”就可以在備中自動產生recovery.conf文件,在這里就可以指定recovery_target_timeline=’‘和recovery_target_time=’'參數來進行精準恢復了,而這里的recovery_target_timeline參數可以直接填寫時間線產生的“歷史文件”名字用來指定恢復到哪一條時間線上去。
[postgres@lyp pg_wal]$ ll
total 114696
-rw-------. 1 postgres postgres 16777216 Feb 17 23:01 00000002000000000000000E
-rw-------. 1 postgres postgres 16777216 Feb 17 22:56 00000002000000000000000F
-rw-------. 1 postgres postgres 16777216 Feb 17 22:51 000000020000000000000010
-rw-------. 1 postgres postgres 16777216 Feb 17 22:51 000000020000000000000011
-rw-------. 1 postgres postgres 16777216 Feb 17 22:51 000000020000000000000012
-rw-------. 1 postgres postgres 16777216 Feb 17 22:51 000000020000000000000013
-rw-------. 1 postgres postgres 16777216 Feb 17 22:51 000000020000000000000014
-rw-------. 1 postgres postgres 50 Feb 17 22:56 00000002.history
drwx------. 2 postgres postgres 88 Feb 17 22:56 archive_status
[postgres@lyp pg_wal]$
當我們基于時間點的還原后,時間線便會加1,并創建一個名為NewTimelineID.history的新文件。00000002.history即為時間線產生的“歷史文件”名字。
[postgres@lyp pgdata14]$ cat recovery.conf |grep recovery_target recovery_target_timeline='00000002.history' recovery_target_time='2022-02-17 22:50:00' [postgres@lyp pgdata14]$
開啟數據庫之后通過讀取歸檔日志就會將數據庫恢復到’2022-02-17 22:50:00’這個時間點。
官方文檔說明
將數據庫恢復到以前的時間點的能力會產生一些類似于關于時間旅行和平行宇宙的科幻故事的復雜性。例如,在數據庫的原始歷史記錄中,假設您在周二晚上 5:15 PM 刪除了一個關鍵表,但直到周三中午才意識到自己的錯誤。毫不擔心,您取出備份,恢復到周二晚上 5:14 PM 的時間點,然后開始運行。在這個數據庫宇宙的歷史,你從來沒有刪除過表。但是假設您后來意識到這不是一個好主意,并想回到原始歷史中的某個星期三早上。如果在您的數據庫啟動并運行時,它會覆蓋一些 WAL 段文件,這些文件會影響您現在希望可以返回的時間,那么您將無法做到這一點。因此,為避免這種情況,您需要將在執行時間點恢復后生成的一系列 WAL 記錄與在原始數據庫歷史記錄中生成的記錄區分開來。
為了解決這個問題,PostgreSQL有一個時間線的概念. 每當歸檔恢復完成時,都會創建一個新的時間線來識別在該恢復之后生成的一系列 WAL 記錄。時間線 ID 號是 WAL 段文件名的一部分,因此新時間線不會覆蓋先前時間線生成的 WAL 數據。事實上,可以歸檔許多不同的時間線。雖然這似乎是一個無用的功能,但它通常是救命稻草。考慮一下您不太確定要恢復到哪個時間點的情況,因此必須通過反復試驗進行多次時間點恢復,直到找到從舊歷史分支的最佳位置。如果沒有時間表,這個過程很快就會產生無法控制的混亂局面。使用時間線,您可以恢復到任何先前的狀態,包括您之前放棄的時間線分支中的狀態。
每次創建新的時間線時,PostgreSQL都會創建一個“時間線歷史”文件,顯示它從哪個時間線分支以及何時分支。當從包含多個時間線的存檔中恢復時,這些歷史文件是允許系統選擇正確的 WAL 段文件所必需的。因此,它們就像 WAL 段文件一樣被歸檔到 WAL 歸檔區。歷史文件只是小文本文件,因此將它們無限期地保存起來既便宜又合適(與大的段文件不同)。如果愿意,您可以在歷史文件中添加評論,以記錄您自己關于如何以及為何創建此特定時間線的注釋。當您通過實驗獲得大量不同的時間線時,此類評論將特別有價值。
恢復的默認行為是沿進行基本備份時的當前時間線進行恢復。如果您希望恢復到某個子時間線(即,您希望返回到恢復嘗試后自身生成的某個狀態),您需要在recovery.conf中指定目標時間線 ID 。您無法恢復到早于基本備份分支的時間線。
恢復失敗的timeline排查
1、確認基礎備份的時間屬于哪條時間線。
2、確認歸檔或未歸檔wal日志是否存在。
3、確認recovery_target_time 指定的時間是正確的。




