資料庫PostrageSQL 表空間

2021-10-11 22:11:38 字數 2575 閱讀 7648

postgresql中的表空間允許資料庫管理員在檔案系統中定義用來存放表示資料庫物件的檔案的位置。一旦被建立,表空間就可以在建立資料庫物件時通過名稱引用。

通過使用表空間,管理員可以控制乙個postgresql安裝的磁碟布局。 這麼做至少有兩個用處。首先,如果初始化集簇所在的分割槽或者卷用光了空間,而又不能在邏輯上擴充套件或者做別的什麼操作,那麼表空間可以被建立在乙個不同的分割槽上,直到系統可以被重新配置。

其次,表空間允許管理員根據資料庫物件的使用模式來優化效能。例如,乙個很頻繁使用的索引可以被放在非常快並且非常可靠的磁碟上,如一種非常貴的固態裝置。同時,乙個很少使用的或者對效能要求不高的儲存歸檔資料的表可以儲存在乙個便宜但比較慢的磁碟系統

即便是位於主要的 postgresql 資料目錄之外,表空間也是資料庫集簇的一部

分 並且不能被視作資料檔案的乙個自治集合。 它們依賴於包含在主資料目錄

中的元資料,並且因此不能被附加到乙個 不同的資料庫集簇或者單獨備份。

類似地,如果丟失乙個表空間(檔案刪除、磁碟失效等), 資料庫集簇可能

會變成不可讀或者無法啟動。把乙個表空間放在乙個臨時檔案系統 (如乙個

記憶體虛擬盤)上會帶來整個集簇的可靠性風險。

要定義乙個表空間,使用create tablespace命令,例如:

create tablespace fastspace location '/ssd1/postgresql/data';
這個位置必須是乙個已有的空目錄,並且屬於postgresql作業系統使用者。 所有後續在該錶空間中建立的物件都將被存放在這個目錄下的檔案中。該位置不能放在可移動 或者瞬時儲存上,因為如果表空間丟失會導致集簇無法工作。

通常在每個邏輯檔案系統上建立多於乙個表空間沒有什麼意義,因為你無法控制在乙個邏輯檔案系統中特定檔案的位置。不過,postgresql不強制任何這樣的限制,並且事實上它不會注意你的系統上的檔案系統邊界。它只是在你告訴它要使用的目錄中儲存檔案。

表空間的建立本身必須作為乙個資料庫超級使用者完成,但在建立完之後之後你可以允許普通資料庫使用者來使用它。要這樣做,給資料庫普通使用者授予表空間上的create許可權。

表、索引和整個資料庫都可以被分配到特定的表空間。想這麼做,在給定表空間上有 create許可權的使用者必須把錶空間的名字以乙個引數的形式傳遞給相關的命令。例如,下面的命令在表空間space1中建立乙個表:

create table foo(i int) tablespace space1;
另外,還可以使用default_tablespace引數:

set default_tablespace = space1;

create table foo(i int);

default_tablespace被設定為非空字串,那麼它就為沒有顯式tablespace子句的create table和create index命令提供乙個隱式tablespace子句。

還有乙個temp_tablespaces引數,它決定臨時表和索引的位置,以及用於大資料集排序等目的的臨時檔案的位置。 這可以是乙個表空間名的列表,而不是只有乙個。因此,與臨時物件有關的負載可以散布在多個表空間上。每次要建立乙個臨時物件時,將從列表中隨機取乙個成員來存放它。

與乙個資料庫相關聯的表空間用來儲存該資料庫的系統目錄。此外,如果沒有給出tablespace子句並且沒有在default_tablespacetemp_tablespaces(如適用)中指定其他選擇,它還是在該資料庫中建立的表、索引和臨時檔案的預設表空間。如果乙個資料庫被建立時沒有指定表空間,它會使用其模板資料庫相同的表空間。

當初始化資料庫集簇時,會自動建立兩個表空間。pg_global表空間被用於共享系統目錄。pg_default表空間是template1和template0資料庫的預設表空間(並且,因此也將是所有其他資料庫的預設表空間,除非被乙個create database中的tablespace子句覆蓋)。

表空間一旦被建立,就可以被任何資料庫使用,前提是請求的使用者具有足夠的許可權。這也意味著,乙個表空間只有在所有使用它的資料庫中所有物件都被刪除掉之後才可以被刪掉。

要刪除乙個空的表空間,使用drop tablespace命令。要確定現有表空間的集合,可檢查pg_tablespace 系統目錄,例如

select spcname from pg_tablespace;
psql程式的\db元命令也可以用來列出現有的表空間。postgresql使用符號連線來簡化表空間的實現。這就意味著表空間只能在支援符號連線的系統上使用。

$pgdata/pg_tblspc目錄包含指向集簇中定義的每個非內建表空間的符號連線。 儘管我們不推薦,但還是可以通過手工重定義這些連線來調整表空間布局。在伺服器執行時,絕不要這樣做。注意在 postgresql 9.1 及更早的版本中,你將還需要用新位置更新pg_tablespace目錄(如果你不更新,pg_dump將繼續輸出舊的表空間位置)。

資料庫PostrageSQL 架構

邏輯複製從拷貝發布者資料庫上的資料庫快照開始。拷貝一旦完成,發布者上的更改會在它們發生時實時傳送給訂閱者。訂閱者按照資料在發布者上被提交的順序應用資料,這樣任意單一訂閱中的publication的事務一致性才能得到保證。訂閱者資料庫上的應用程序總是將session replication role設...

資料庫PostrageSQL 啟動資料庫伺服器

在任何人可以訪問資料庫前,你必須啟動資料庫伺服器。資料庫伺服器程式是postgres,它必須知道在 能找到它要用的資料。這是用 d選項實現的。因此,啟動伺服器最簡單的方法是 postgres d usr local pgsql data這將把伺服器放在前台執行。這個步驟同樣必須以postgresql...

資料庫PostrageSQL 鎖管理

deadlock timeout integer 這是進行死鎖檢測之前在乙個鎖上等待的總時間 以毫秒計 死鎖檢測相對昂貴,因此伺服器不會在每次等待鎖時都執行這個它。我們樂觀地假設在生產應用中死鎖是不常出現的,並且只在開始檢測死鎖之前等待一會兒。增加這個值就減少了浪費在無用的死鎖檢測上的時間,但是減慢...