PostgreSQL 系統(tǒng)目錄聲明和初始內(nèi)容

2021-09-15 14:10 更新

PostgreSQL使用很多不同的系統(tǒng)目錄來跟蹤數(shù)據(jù)庫對(duì)象(例如表和函數(shù))的存在以及屬性。系統(tǒng)目錄和普通用戶表之間在物理上沒有什么不同,但是后端的C代碼知道每一個(gè)目錄的結(jié)構(gòu)和屬性,并且能夠在較低的層次上直接操縱它們。因此,不建議嘗試在運(yùn)行中修改目錄的結(jié)構(gòu),那樣做會(huì)破壞內(nèi)建在C代碼中對(duì)目錄行如何放置的設(shè)想。但是目錄的結(jié)構(gòu)可能會(huì)在主版本之間發(fā)生變化。

目錄的結(jié)構(gòu)聲明在特殊格式的C頭文件中,它們位于源碼樹的src/include/catalog/目錄中。特別地,對(duì)每一個(gè)目錄都有一個(gè)以其名稱命名的頭文件(例如,pg_class的頭文件是pg_class.h),頭文件定義了目錄具有的列集合,以及一些其他的基本屬性(例如OID)。其他定義目錄結(jié)構(gòu)的重要文件包括 indexing.htoasting.h,前者定義所有系統(tǒng)目錄上的索引,而后者為需要TOAST表的目錄定義TOAST表。

很多目錄都有初始數(shù)據(jù),這些數(shù)據(jù)必須在initdbbootstrap階段裝載到對(duì)應(yīng)的目錄中,這樣才能讓系統(tǒng)達(dá)到能夠執(zhí)行SQL命令的狀態(tài)點(diǎn)(例如,pg_class.h必須包含表示其自身的一個(gè)項(xiàng),還要為每個(gè)系統(tǒng)目錄和索引都分別包含一項(xiàng))。這些初始數(shù)據(jù)以可編輯的形式保存在 src/include/catalog/目錄下的數(shù)據(jù)文件中。例如,pg_proc.dat描述了所有必須被插入到pg_proc目錄的初始行。

為了創(chuàng)建目錄文件并且將這些初始數(shù)據(jù)載入其中,一個(gè)以bootstrap模式運(yùn)行的后端會(huì)讀取包含著命令和初始數(shù)據(jù)的BKI(后端接口)文件。這種模式中用到的postgres.bki文件正是在編譯PostgreSQL時(shí)從前述的頭文件和數(shù)據(jù)文件準(zhǔn)備而來,這一過程由名為genbki.pl的Perl腳本負(fù)責(zé)。盡管 postgres.bki與特定PostgreSQL發(fā)行版相關(guān),但它是平臺(tái)無關(guān)的并且被安裝在安裝樹的share子目錄中。

genbki.pl還會(huì)為每個(gè)目錄產(chǎn)生一個(gè)頭文件,例如為pg_class生成的頭文件是pg_class_d.h。這個(gè)文件含有自動(dòng)生成的宏定義,并且可能包含其他的宏、枚舉聲明,因此對(duì)于讀取特定目錄的客戶端C代碼很有用。

大部分PostgreSQL的開發(fā)者不需要直接與BKI文件打交道,但是幾乎在后端中增加任何非平凡的特性都需要修改目錄頭文件或者初始數(shù)據(jù)文件。本章的剩余部分會(huì)給出一些相關(guān)的信息,并且將會(huì)完整地描述BKI文件格式。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)