前端
參考:http://book.51cto.com/art/201201/313175.htmsql
PostgreSQL數據庫由鏈接管理系統(系統控制器)、編譯執行系統、存儲管理系統、事務系統、系統表五大部分組成,其組成結構和關係如圖2-1所示。shell
鏈接管理系統接受外部操做對系統的請求,對操做請求進行預處理和分發,起系統邏輯控制做用;數據庫
編譯執行系統由查詢編譯器、查詢執行器組成,完成操做請求在數據庫中的分析處理和轉化工做,最終實現物理存儲介質中數據的操做;bootstrap
存儲管理系統由索引管理器、內存管理器、外存管理器組成,負責存儲和管理物理數據,提供對編譯查詢系統的支持;服務器
事務系統由事務管理器、日誌管理器、併發控制、鎖管理器組成,日誌管理器和事務管理器完成對操做請求處理的事務一致性支持,鎖管理器和併發控制提供對併發訪問數據的一致性支持;網絡
系統表是PostgreSQL數據庫的元信息管理中心,包括數據庫對象信息和數據庫管理控制信息。系統表管理元數據信息,將PostgreSQL數據庫的各個模塊有機地鏈接在一塊兒,造成一個高效的數據管理系統。架構
執行initdb程序時,將從initdb.c文件中的main函數開始執行,main函數的執行流程如圖2-3所示。initdb執行時將按照順序執行下列工做:併發
1)根據用戶輸入的命令行參數獲取輸入的命令名。ide
2)設置系統編碼爲LC_ALL,查找執行命令的絕對路徑並設置該路徑。
3)設置環境變量(pg_data等),獲取系統配置文件的源文件路徑(postgres.bki、postgresql.conf.sample等文件),並檢查該路徑下各文件的可用性。
4)設置中斷信號處理函數,對終端命令行SIGHUP、程序中斷SIGINT、程序退出SIGQUIT、軟件中斷SIGTERM和管道中斷SIGPIPE等信號進行屏蔽,保證初始化工做順利進行。
5)建立數據目錄,以及該目錄下一些必要的子目錄,如base、global、base/1等。
6)測試當前服務器系統性能,由測試結果建立配置文件postgresql.conf、pg_hba.conf、pg_ident.conf,並對其中定義的參數作一些設置。
7)在bootstrap模式下建立數據庫template1,存儲在數據目錄的子目錄base/1/中。
8)建立系統視圖、系統表TOAST表等,複製template1來建立template0和postgres,這些操做都用普通的SQL命令來完成。
9)打印操做成功等相關信息,退出。
initdb是PostgreSQL中一個獨立的程序,它的主要工做就是對數據集簇進行初始化,建立模板數據庫和系統表,並向系統表中插入初始元組。在這之後,用戶建立各類數據庫、表、視圖、索引等數據庫對象和進行其餘操做時,都是在模板數據庫和系統表的基礎上進行的。
PostgreSQL安裝完成後,在作任何其餘事情以前,必須先使用initdb程序初始化磁盤上的數據存儲區,即數據集簇,由PostgreSQL管理的用戶數據庫以及系統數據庫總稱爲數據集簇。在PostgreSQL的實現中,數據庫就是磁盤上一些文件的集合,只不過這些文件有特定的文件名、存儲位置等,而且有些文件之間會相互關聯。默認狀況下,PostgreSQL的全部數據都存儲在其數據目錄裏,這個數據目錄一般會用環境變量PGDATA來引用,後文中將會用PGDATA來指代數據目錄。
在PostgreSQL中,對象標識符(OID)用來在整個數據集簇中惟一地標識一個數據庫對象,這個對象能夠是數據庫、表、索引、視圖、元組、類型等。PostgreSQL提供了Oid數據類型來表示OID,它其實是一個無符號整數。
OID——對象標識符
OID一般是從1開始分配,但在初始化數據集簇時,會先將一部分OID分配給系統表、系統表元組、系統表上的索引等數據庫對象,這一部分OID能夠在系統表所對應的頭文件中找到。同時,爲了給後續版本留下擴展的餘地,初始化數據集簇時還會預留一部分OID資源。這樣,在系統運行時可分配的OID資源實際是從16384開始的。在PostgreSQL源代碼src/include/catalog子目錄下有一個shell腳本unused_oids用來輸出當前版本中預分配和預留的OID的使用狀況。
在建立數據集簇以後,該集簇中默認包含三個系統數據庫template一、template0和postgres。其中template0和postgres都是在初始化過程當中從template1拷貝而來的。
template1和template0數據庫用於建立數據庫。PostgreSQL中採用從模板數據庫複製的方式來建立新的數據庫,在建立數據庫的命令中能夠用「-T」選項來指定以哪一個數據庫爲模板來建立新數據庫。
template1數據庫是建立數據庫命令默認的模板,也就是說經過不帶「-T」選項的命令建立的用戶數據庫是和template1如出一轍的。template1是能夠修改的,若是對template1進行了修改,那麼在修改以後建立的用戶數據庫中也能體現出這些修改的結果。template1的存在容許用戶能夠製做一個自定義的模板數據庫,在其中用戶能夠建立一些應用須要的表、數據、索引等,在往後須要屢次建立相同內容的數據庫時,均可以用template1做爲模板生成。
因爲template1的內容有可能被用戶修改,所以爲了知足用戶建立一個「乾淨」數據庫的需求,PostgreSQL提供了template0數據庫做爲最初始的備份數據,當須要時能夠用template0做爲模板生成「乾淨」的數據庫。
而第三個初始數據庫postgres用於給初始用戶提供一個可鏈接的數據庫,就像Linux系統中一個用戶的主目錄同樣。
上述系統數據庫都是能夠刪除的,可是兩個模板數據庫在刪除以前必須將其在pg_database中元組的datistemplate屬性改成FALSE,不然刪除時會提示「不能刪除一個模板數據庫」。
在關係數據庫中,爲了實現數據庫系統的控制,必須提供數據字典的功能。數據字典不只存儲各類對象的描述信息,並且存儲系統管理所需的各類對象的細節信息。從內容來看,數據字典包含數據庫系統中全部對象及其屬性的描述信息、對象之間關係的描述信息、對象屬性的天然語言含義以及數據字典變化的歷史(即數據庫的狀態信息)。數據字典是關係數據庫系統管理控制信息的核心,在PostgreSQL數據庫系統中,系統表扮演着數據字典的角色。
系統表是PostgreSQL數據庫存放結構元數據的地方,它在PostgreSQL中表現爲存放有系統信息的普通表或者視圖。用戶能夠刪除而後重建這些表、增長列、插入和更新數值,然而由用戶去修改系統會致使系統信息的不一致性,進而致使系統控制紊亂。正常狀況下不該該由用戶手工修改系統表,而是由SQL命令關聯的系統表操做自動維護系統表信息。好比,建立數據庫語句(CREATE DATABASE)會向pg_database系統表插入一行,而且在磁盤上建立該數據庫。
PostgreSQL的每個數據庫中都有本身的一套系統表,其中大多數系統表都是在數據庫建立時從模板數據庫中拷貝過來的,所以這些系統表裏的數據都是與所屬數據庫相關的。只有少數系統表是全部數據庫共享的(好比pg_database),這些系統表裏的數據是關於全部數據庫的。
因爲系統表保存了數據庫的全部元數據,因此係統運行時對系統表的訪問是很是頻繁的。爲了提升系統性能,在內存中創建了共享的系統表CACHE,使用Hash函數和Hash表提升查詢效率,這些內容將在第3章詳細介紹。
PostgreSQL系統的主要功能都集中於Postgres程序,其中的各個進程都是經過載入Postgres程序而造成的進程,只是在運行時所處的分支不一樣而已。PostgreSQL使用一種專用服務器進程體系結構,主要進程有:
Postgres程序的入口就是main模塊的main函數。
守護進程postmaster(單用戶模式下的Postgres進程):
完成數據集簇初始化後,用戶能夠啓動一個數據庫實例來運行數據庫管理系統,多用戶模式下一個數據庫實例由數據庫服務器守護進程Postmaster來管理。主要功能:
1.它是一個運行在服務器上的總控進程,負責整個系統的啓動和關閉,而且在服務進程出現錯誤時完成系統的恢復。
2.它管理數據庫文件、監聽並接受來自客戶端(psql,jdbc等)的鏈接請求,而且爲客戶端鏈接請求fork一個Postgres服務進程,來表明客戶端在數據庫上執行各類命令。
3.同時Postmaster還管理與數據庫運行相關的輔助進程。用戶可使用postmaster、postgres或者pg_ctl命令啓動Postmaster。
PostgreSQL採用C/S模式,系統爲每一個客戶端分配一個服務進程。Postmaster就像一個處理客戶端請求的調度中心。前端應用欲訪問某一數據庫時,就調用接口庫(好比ODBC、libpq)把用戶的請求經過網絡發給守護進程Postmaster。Postmaster將啓動一個新的服務進程Postgres爲用戶服務,此後前端進程和服務進程再也不經過Postmaster而是直接進行通訊。
服務進程Postgres:
服務進程Postgres接受並執行客戶端(好比psql,或用戶應用程序經過JDBC等接口)發送的命令(交互式SQL查詢)。它在底層模塊(如存儲、事務管理、索引等)之上調用各個主要的功能模塊(如編譯器、優化器、執行器等),完成客戶端的各類數據庫操做,並返回執行結果。
客戶端每建立一個數據庫鏈接,postmaster生成一個postgres服務器進程,直接接受用戶的命令進行編譯執行,並將結果返回給用戶。如此循環,直到用戶斷開鏈接。 服務器進程經過信號量和共享內存來相互通訊。
輔助進程(分別爲實現不一樣功能):
系統日誌進程SysLogger :
後臺寫進程bgWriter:
預寫式日誌寫進程WalWriter:
預寫式日誌歸檔進程pg_archive:
系統自動清理進程AutoVacuum:將自動定時整理(清理)外存中的數據空間。
統計數據收集進程pg_state:將自動統計系統運行中的一些動態信息。