PostgreSQL xlog檔案名稱規範源碼解析

來源:互聯網
上載者:User

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 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.