PostgreSQL 物理檔案對應解析

來源:互聯網
上載者:User

PostgreSQL 物理檔案對應解析

我們知道,在PG中,每個relation,也就是表,都有好幾個fork對應。存放主表資料的為“MAIN” fork;管理空餘空間的為“FSM” fork;存放可視化視圖的為“visibility” fork。

那麼PG又是如何將每個表的fork管理起來,並跟pg_class中的relfileno對應起來的呢?這可以分為兩類:一類是常規表;一類是系統資料表。

1.常規表

假設我有一張表叫”tab_mvcc_test”,它在postgres資料庫中。因此我們得先找到資料庫目錄。查pg_database,得到oid為“12896”。

接著去base目錄下,找到相應的資料庫目錄。“12896”目錄就是我們想要的。

然後從pg_class中,我們查到”tab_mvcc_test”的relfilenode為“16483”。

接著我們進入資料庫目錄“12896”,然後list一把,提到以下相關的三個檔案。以“_fsm”尾碼的就是Free Space Mapping檔案。以”vm”尾碼的就是visibility map。

而沒有尾碼的那個就是我們的主表資料檔案,裡面還存放了索引資料。

2.系統資料表

另外像系統的catalog表,如pg_class,它的refileno是”0“,又是什麼原因呢?PG對於系統資料表處理,不能像常規表一樣。這就有點類似於”雞生蛋,還是蛋生雞“。因為系統資料表是來管理常規表的。

PG對於這些catalog表,放到一個檔案中去管理,將oid與relfileno做映射。這個檔案就是著名的”pg_filenode.map“。這個檔案的大小為512,剛好是一個OS disk sector的大小。

PG做了對齊處理,在源碼上用RelMapFile結構體與之對應。結構體大小為:62*8+4*4=496+16=512。也就是說這個檔案最多存放62條系統catalog表的記錄。

由於這個檔案的重要性,剛好與disk sector大小對齊,減少檔案crash的機率。

我們接下來把pg_filenode.map DUMP出來看一下,裡面是什麼資料:

第一個圈中的資料為PG檔案頭的魔法資料字,那麼第二個圈中的,到底對應的是哪個catalog表呢?我們可以計算下:“4eb”對應十進位資料就是”1259“,剛好是pg_class的oid。

而後面的”3172”對應的就是12658。剛好是relfilenode。完美的對應了起來。

再得到檔案如下:

記錄數剛好14,跟上面圖中兩個紅色圈之間的數字”000e“對起來。這個檔案還存放了這些系統資料表對應的索引檔案filenode。

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

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.