PostgreSQL 時間線解析

2021-09-23 23:25:30 字數 2884 閱讀 2536

「時間線」(timeline)是pg乙個很有特色的概念,在備份恢復方面的文件裡面時有出現。但針對這個概念的詳細解釋卻很少,也讓人不太好理解。我們在此仔細解析一下。

為了理解引入時間線的背景,我們來分析一下,如果沒有時間線,會有什麼問題?先舉個將資料庫恢復到以前時間點的例子。假設在乙個資料庫的執行過程中,dba在週三12:00am刪掉了乙個關鍵的表,但是直到周五中午才發現這個問題。這個時候dba拿出最初的資料庫備份,加上存在歸檔目錄的日誌檔案,將資料庫恢復到週三11:00am的時間點,這樣就能正常啟動和執行。但是,dba後來意識到這樣恢復是不對的,想恢復到周四8:00am的資料。這時會發現無法做到:因為在資料庫不斷執行中,會產生與舊的wal檔案重名的檔案,這些檔案進入歸檔目錄時,會覆蓋原來的舊日誌,導致恢復資料庫需要的wal檔案丟失。為了避免這種情況,需要區分原始資料庫歷史生成的wal檔案和完成恢復之後繼續執行產生的(重名的)新wal檔案。整個過程如圖1所示:

為了解決這個問題,postgresql引入了時間線的概念。每當歸檔檔案恢復完成後,建立乙個新的時間線用來區別新生成的wal記錄。wal檔名由時間線和日誌序號組成,原始碼實現如下:

#define xlogfilename(fname, tli, log, seg)    \

snprintf(fname, xlog_data_fname_len + 1, "%08x%08x%08x", tli, log, seg)

例如:

$ ls -1

00000002.history

00000003.history

00000003000000000000001a

00000003000000000000001b

時間線id號是wal檔名組成之一,因此乙個新的時間線不會覆蓋由以前的時間線生成的wal。 如圖2所示,每個時間線類似乙個分支,在當前時間線的操作不會對其他時間線wal造成影響。有了時間線,我們就可以恢復到之前的任何時間點。

新的時間線會在什麼情況下出現呢?

1. 即時恢復(pitr)

配置recovery.conf檔案:

restore_command = 'cp /mnt/server/archivedir/%f %p' //從歸檔目錄恢復日誌 

recovery_target_time = '2015-7-16 12:00:00 ' //指定歸檔時間點,如沒指定恢復到故障前的最後一完成的事務

recovery_target_timeline = 'latest' //指定歸檔時間線,』latest』代表最新的時間線分支,如沒指定恢復到故障前的pg_control裡面的時間線

standby_mode = 『off』 //開啟後將會以備庫身份啟動,而不是即時恢復

設定好recovery.conf檔案後,啟動資料庫,將會產生新的timeline,而且會生成乙個新的history檔案。恢復的預設行為是沿著與當前基本備份相同的時間線恢復。如果你想恢復到某些時間線,你需要指定的recovery.conf目標時間線recovery_target_timeline,不能恢復到早於基本備份分支的時間點。

2. standby promote

搭建乙個pg主備,然後停止主庫,在備庫機器執行:

$ pg_ctl promote –d $pgdata
這時候備庫將會公升為主備,同時產生乙個新的timeline,同樣生成乙個新的history檔案。

每次建立乙個新的時間線,postgresql都會建立乙個「時間線歷史」檔案,檔名類似.history,它裡面的內容是由原時間線history檔案的內容再追加一條當前時間線切換記錄。假設資料庫恢復啟動後,切換到新的時間線id=5,那麼檔名就是00000005.history ,該檔案記錄了自己從什麼時間哪個時間線什麼原因分出來的,該檔案可能含有多行記錄,每個記錄的內容格式如下:

* *

* parenttli id of the parent timeline

* reason human-readable explanation of why the timeline was changed

例如:

$ cat 00000004.history

1 0/140000c8 no recovery target specified

2 0/19000060 no recovery target specified

3 0/1f000090 no recovery target specified

當資料庫在從包含多個時間線的歸檔中恢復時,這些history檔案允許系統選取正確的wal檔案。當然,它也能像wal檔案一樣被歸檔到wal歸檔目錄裡。歷史檔案只是很小的文字檔案,所以儲存它們的代價很小。

當我們在recovery.conf指定目標時間線tli進行恢復時,程式首先尋找.history檔案,根據.history檔案裡面記錄的時間線分支關係,找到從pg_control裡面的starttli到tli之間的所有時間線對應的日誌檔案,再進行恢復。

pg中通過timeline機制能夠方便地實現資料庫恢復到任意時間點,這對我們資料庫備份有重要的作用。我們可以在資料庫的使用中合理地備份和歸檔我們的資料,一旦資料出現丟失或損壞,我們都能有條不紊的使用timeline機制恢復出來我們需要的資料。

js載入時間線

建立document物件,開始解析web頁面。解析html元素和他們的文字內容後新增element物件和text節點到文件中。這個階段 document.readystate loading 遇到link外部css,建立執行緒載入,並繼續解析文件。遇到script外部js,並且沒有設定async d...

JS載入時間線

js載入時間線,依據js出生的那一刻起,記錄了一系列瀏覽器按照順序做的事 就是乙個執行順序 js時間線步驟 建立document物件 文件解析完 文件解析完載入完執行完 1 建立document物件,開始解析web頁面,解析html元素和他們的文字內容後新增element物件和text節點到文件中,...

Python的時間線

自從20世紀90年代初python語言誕生至今,它已被逐漸廣泛應用於系統管理任務的處理和web程式設計。python的創始人為荷蘭人吉多 範羅蘇姆 guido van rossum 1989年聖誕節期間,在阿姆斯特丹,guido為了打發聖誕節的無趣,決心開發乙個新的指令碼解釋程式,作為abc 語言的...