PostgreSQL xlog檔案名稱規範源碼解析
PostgreSQL的xlog,即WAL(Write Ahead Log),位於pg_xlog目錄下,是PostgreSQL 完全或者PITR(Point In-Time Recovery)恢複所依賴的日誌。
為什麼會有WAL日誌呢?這個跟目前主流的資料庫如Oracle,MySQL等一樣,保證事務的持久性。即任何已經commit的事務,必須是持久的。
如果我把redo日誌先於資料寫出到磁碟,那麼事務總是可以恢複的,雖然時間有時候可能會久點。為什麼日誌先寫,主要是因為寫日誌到磁碟比寫資料到磁碟要快。
日誌是連續IO刷出,而資料檔案則一般都是隨機IO。
另外,細心的同學可能會發現PostgreSQL的記錄檔名很長,而且大小是16M。目前PG預設xlog segment size是16M,這個只能在源碼編譯時間設定,假設我設定成64M,
那麼編譯時間configure帶參數“--with-wal-segsize=64”即可。
另外xlog檔案名稱可以分為二部分,以”000000010000000000000002”為例,分解為以下兩個部分:
00000001,0000000000000002
其中第一個部分“00000001”,為TimeLineId,即通常所說的TLI,它用來標識資料庫狀態的,每做一次恢複後,都會增加,主要為了將恢複後的資料庫跟之前的資料庫區別開來,
如Point In-Time Recovery。通常的關閉和起動資料庫,並不會改變此值。PG用一個32位來標示TimeLineId,源碼定義如下:
這個有點類似於Oracle中Incarnation的概念。
第二部分為“0000000000000002”,為xlogsegno,用64位來表示。源碼定義為:
這其實已經是64位系統所能表示的最大值了。這是理論上的xlogsgno最大值,即”FFFFFFFFFFFFFFFF”。事實上檔案號到達不了這個值。下面我詳細來說明。
首先讓我們來理解日誌流的記憶體定址表示方法。在PostgreSQL中,日誌其實是用記憶體位移地址來表示的。源碼定義為:
PG用了一個64位的地址表示日誌的位置。很多同學認為,這很容易用完64位,那事實上是這樣子嗎?我們可以算一下:
假設我們一天的日誌量產生為10T,即2^40次方;那麼可以使用的年數為:2^64/2^24/365=4596.49。這顯然是足夠了。
講到這裡,很多同學已經急了,這跟日誌的檔案名稱有什麼關係呢?
答案是肯定的。上面所講的,記錄檔第二部分xlogsegno還可以再拆分兩個32位。高32位表示xlog的序號,低32位來表示此xlog包含的segment號。
Xlog segment號源碼定義如下:
檔案名稱定義源碼:
假設xlog的segment大小為16M。那麼一個xlog所對應的segment個數為:2^32/2^24=2^8=256。所以最大的xlog檔案名稱應該為“00000001FFFFFFFF000000FF”,而不是上面所提到的理論最大值“00000001FFFFFFFFFFFFFFFF”。
另外,PG資料庫初始化時,xlog的第一個位置會在XLOG_SEG_SIZE邏輯位移量處開始,所以在16M大小的情況下,最小檔案號為” 00000001FFFFFFFF00000001”,而不是“00000001FFFFFFFF00000000”。從”0“處開始是非法的,以下為源碼中定義非法 xlog record pointor。
下面我們可以一個實驗,來驗證上面的過程:
1. 首先將當前xlog位置重設到離最大值還差一個xlog
2.做checkpoint和switch logfile
首先報錯,後面執行個體被終止,最後xlog被迴圈,從最小值開始。經曆了FFFFFFFF000000FF-->0000000000000001
後台日誌過程:
------------------------------------華麗麗的分割線------------------------------------
CentOS 6.3環境下yum安裝PostgreSQL 9.3
PostgreSQL緩衝詳述
Windows平台編譯 PostgreSQL
Ubuntu下LAPP(Linux+Apache+PostgreSQL+PHP)環境的配置與安裝
Ubuntu上的phppgAdmin安裝及配置
CentOS平台下安裝PostgreSQL9.3
PostgreSQL配置Streaming Replication叢集
如何在CentOS 7/6.5/6.4 下安裝PostgreSQL 9.3 與 phpPgAdmin
------------------------------------華麗麗的分割線------------------------------------
PostgreSQL 的詳細介紹:請點這裡
PostgreSQL 的:請點這裡
本文永久更新連結地址: