跳轉到內容

PostgreSQL/叢集架構

來自華夏公益教科書,開放的書籍,開放的世界


一個伺服器,它可以是硬體、容器或虛擬機器,包含一個或多個數據庫叢集(簡稱叢集)。每個叢集由一個例項控制。如果同一伺服器上有多個叢集和例項,則例項的埠必須彼此不同,叢集的根目錄也必須不同。

每個新建立的叢集都包含三個資料庫,分別是template0template1postgres,這三個資料庫都包含public模式以及系統模式pg_cataloginformation_schemapg_temp 以及其他一些模式。表、檢視以及大多數其他 SQL 物件都位於這些模式中。DBA 可以建立更多叢集、資料庫、模式或 SQL 物件。



初始化階段

[編輯 | 編輯原始碼]

使用initdb命令建立叢集。template0 是任何叢集建立階段的第一個資料庫。在第二步中,資料庫template1 將作為template0 的副本生成,最後資料庫postgres 將作為template1 的副本生成。之後,DBA 可以使用createdb命令在該叢集中建立更多資料庫,例如:my_db。與一開始一樣,新資料庫將是template1 的副本。由於template0 作為所有其他資料庫的原始模板的獨特作用,不允許任何客戶端連線到它並修改它。但是 DBA 可以更改template1

客戶端連線在資料庫級別上執行,可以訪問連線資料庫中任何模式中的資料和 SQL 物件,只要它們被允許這樣做。如果它們需要訪問同一叢集或其他叢集中不同資料庫的任何物件,則需要使用特殊技術,例如外部索引鍵資料包裝器 (FDW) 或dblink(或者它們使用多個連線並在客戶端側同步這些連線)。

SQL 物件

[編輯 | 編輯原始碼]

我們使用術語SQL 物件 來指代所有可以使用 SQL 命令CREATE ... 建立的物件,例如:資料庫、模式、表、檢視、物化檢視、索引、約束、序列、函式、過程、觸發器、角色、資料型別、域、運算子、表空間、擴充套件、外部索引鍵資料包裝器等等。這些 SQL 物件以層次結構的方式排列

  • 資料庫名稱、表空間和角色(使用者)在叢集級別上是已知的。例如:如上所述,連線在資料庫級別上執行。但是,當您使用這種連線建立新角色時,該角色也為同一叢集的所有其他資料庫所知。
  • 擴充套件,例如:PostGIS,駐留在資料庫級別。安裝擴充套件後,該資料庫的所有模式都可以使用它。但在同一叢集中的其他資料庫中,該擴充套件是未知的。
  • 模式是資料庫的一部分。其中一些是預定義的。
  • pg_catalog 是一個包含描述該資料庫中大多數 SQL 物件的表的模式,尤其是所有表和檢視。它們甚至描述自己。information_schema 是一個類似的模式。它包含 pg_catalog 中的幾個表和檢視,以符合 SQL 標準的方式。
  • public 充當預設模式。它不應該包含使用者定義的 SQL 物件。相反,建議建立一個或多個其他模式來管理特定於應用程式的物件,如表或觸發器。要訪問這些其他模式中的物件,可以完全限定它們,例如 my_schema.my_table,或者透過更改search_path
  • 模式中存在不同型別的 SQL 物件:'關係' 類物件(表、檢視、物化檢視、索引、序列、外部索引鍵表)、函式、過程、觸發器、約束、資料型別、域、運算子等等。
  • 一個模式中的 SQL 物件與不同模式中的 SQL 物件不同,即使它們使用相同的名稱,例如:my_schema1 中的表t1my_schema2 中的t1 不同。
  • '關係' 類物件、資料型別和域的名稱在其模式內是唯一的:例如:您不能在同一個模式中擁有一個名為emplyee 的表和一個名為employee 的檢視。



華夏公益教科書