PostgreSQL checkpoint原理

來源:互聯網
上載者:User

PostgreSQL checkpoint原理

今天來談一下PostgreSQL 的checkpoint原理。檢查點功能在現有流行的資料庫中都具備。如Oracle,MySQL等,尤其是Oracle 對檢查點功能的實現,非常完善。Oracle不僅有全域檢查點,還有增量檢查點,即非常著名的 “Incremental checkpoint”。雖然各大資料庫實現的方式不同,但是主要目的都是一樣的,都是為了縮短資料庫恢複的時間。那麼其實PG也有自己的檢查點實現。

1.PG檢查點的類型

Shutdown檢查點:在PG執行個體shutdown時做的檢查點

Recovery End檢查點:在recovery 結束階段做的檢查點,類似於shutdown檢查點,只不過在WAL恢複結束時發起。

Immediate檢查點:不僅僅建立檢查點,而且會馬上做。這類請求一般在比較緊急的情況下,需要馬上擷取資料庫一致狀態的情況下。

Force檢查點:即使沒有xlog變更,也會做。請求這類檢查點,往往只是想得到最近的checkpoint location而已。

上面幾個檢查點,會直接影響檢查點的建立以及檢查點的完成時機。

Wait檢查點:檢查點不會馬上做,但會一直等待,直到檢查點完成。

往往比較重要的一些操作,但不是非常緊急的,可以請求該類檢查點。尤其是一些DDL操作,對資料一致性要求高於回應時間。

另外,還有一類檢查點,這類檢查只是作為logging的標識:

xlog檢查點:由xlog的消耗引起,產生新xlog檔案。

time檢查點:由時間elapse引起。

flush檢查點:當發起flush 所有pages時發起,包括那些不logging的表。

PG會根據目的以及不同時機,請求相應的檢查點。

2.PG檢查點的機理

checkpoint進程由postmaster負責建立。作為postmaster的子進程而存在,為幾大重要的後台進程之一。

 從中,可知postmaster進程號為2694。checkpoint的進程號為2696,其父進程號為2694,即為postmaster。

checkpoint進程掛掉後,postmaster會殺掉所有backend進程,然後逐一恢複後台進程,有點類似於系統被初始化後。可見此進程對資料一致保護的重要性。

因為資料庫系統要達到一個目的:即任何已經做過checkpoint的更改,不需要從WAL日誌中恢複。這大大加快了資料庫系統crash後的恢複速度。

在源碼中,checkpoint相關的資訊由一個結構體記錄,放在共用記憶體段中:

它儲存了當前checkpoint 的pid,檢查點起始位置,檢查點完成位置以及檢查點類型等資訊。另外也維護了一個檢查點隊列。一般的檢查點請求只是建立一個檢查點位置,並放到隊列中,並不會馬上做,檢查點調度由另外邏輯來控制。

checkpoint的位點是跟xlog的位置強相關的,其實就是WAL日誌的位點。

每當檢查完成之時,就必須要求此檢查點前的資料更改或者髒頁被寫入物理磁碟,並持久化。

做檢查點時大致可以分為兩個過程:

1).遍曆所有BUFFER,將當前時刻的所有DIRTY的塊狀態改為CHECKPOINT_NEEDED,來表示需要將這些髒塊寫出到磁碟。

注意這一步,還是在記憶體中完成的,並不涉及到磁碟操作。

2).刷物理檔案,從緩衝中將髒塊fsync到磁碟。

這一步涉及到磁碟操作。將標記為CHECKPOINT_NEEDED的block寫出到磁碟。

3).Checkpoint 本身也會被記錄到XLOG中

上面講到的檢查點結構體內容以及長度等資訊,會被刷出到xlog中。

4).更新控制檔案

更新控制檔案中的檢查點資訊到當前位置. 下面粗體部分就是檢查點相關內容:

[postgres@db1 ~]$ pg_controldata  /opt/pgdata
 pg_control version number:            937   
 Catalog version number:              201306121
 Database system identifier:          6123041408807693241
 Database cluster state:              shut down         
 pg_control last modified:            Sun 17 May 2015 06:36:25 PM CST
Latest checkpoint location:          1F/9B9B2E20                   
 Prior checkpoint location:            1F/9B9B2DB8                   
 Latest checkpoint's REDO location:    1F/9B9B2E20                   
 Latest checkpoint's REDO WAL file:    000000010000001F0000009B     
 Latest checkpoint's TimeLineID:      1                             
 Latest checkpoint's PrevTimeLineID:  1                             
 Latest checkpoint's full_page_writes: on
 Latest checkpoint's NextXID:          0/15331854
 Latest checkpoint's NextOID:          91378
 Latest checkpoint's NextMultiXactId:  1
 Latest checkpoint's NextMultiOffset:  0
 Latest checkpoint's oldestXID:        1799
 Latest checkpoint's oldestXID's DB:  1
 Latest checkpoint's oldestActiveXID:  0
 Latest checkpoint's oldestMultiXid:  1
 Latest checkpoint's oldestMulti's DB: 1
 Time of latest checkpoint:            Sun 17 May 2015 06:36:25 PM CST
Fake LSN counter for unlogged rels:  0/1
 Minimum recovery ending location:    0/0
 Min recovery ending loc's timeline:  0
 Backup start location:                0/0
 Backup end location:                  0/0
 End-of-backup record required:        no
 Current wal_level setting:            minimal
 Current max_connections setting:      100
 Current max_prepared_xacts setting:  0
 Current max_locks_per_xact setting:  64
 Maximum data alignment:              8
 Database block size:                  8192
 Blocks per segment of large relation: 131072
 WAL block size:                      8192
 Bytes per WAL segment:                16777216
 Maximum length of identifiers:        64
 Maximum columns in an index:          32
 Maximum size of a TOAST chunk:        1996
 Date/time type storage:              64-bit integers
 Float4 argument passing:              by value
 Float8 argument passing:              by value
 Data page checksum version:          0

------------------------------------華麗麗的分割線------------------------------------

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.