PostgreSQL 裡面,每個表格都是以獨立的檔案,並且放置到 $PGDATA/base/ 底下的目錄,並以資料庫物件的 OID 命名。所以資料庫的大小,預設配置下,便取決於 $PGDATA 所在的硬碟分割區大小。
為了擴張資料庫的資料到別處(例如,新增的硬碟),在 PostgreSQL 使用 Tablespace 指令達成。
以下是一個使用範例
postgres=# CREATE TABLESPACE another_tblspc LOCATION '/another/directory/location';
這會在 $PGDATA/pg_tblspc/ 裡面用 Tablespace 的 OID 建立一個 Soft Link 的目錄連結,指向設定的目錄位置。
因此要擴充資料存放空間,步驟如下:
1. 準備新增分割區(例如:新加分割好的硬碟)
2. 把新分割區在作業系統掛載起來(例如,用 /etc/fstab 達成開機自動掛載,或是用 LVM 處理)。如上例的話,便是掛載到 /another/directory/location 目錄。
3. 設置好該目錄的存取權限
4. 然後在 PostgreSQL 裡面執行上面的 CREATE TABLESPACE 指令
5. 最後,把要建立在該硬碟上的資料庫物件移動過去(ALTER TABLE . . . SET TABLESPACE)/建立上去(CREATE DATABASE . . . TABLESPACE)
2. 把新分割區在作業系統掛載起來(例如,用 /etc/fstab 達成開機自動掛載,或是用 LVM 處理)。如上例的話,便是掛載到 /another/directory/location 目錄。
3. 設置好該目錄的存取權限
4. 然後在 PostgreSQL 裡面執行上面的 CREATE TABLESPACE 指令
5. 最後,把要建立在該硬碟上的資料庫物件移動過去(ALTER TABLE . . . SET TABLESPACE)/建立上去(CREATE DATABASE . . . TABLESPACE)
由於 PostgreSQL 資料目錄 $PGDATA 是整體的資料,單獨取出個別檔案無法使用。要進行備份,便需要「整個」一起備份才行。
當設置自訂的 Tablespace 時,實際裝有資料的 Tablespace 目錄裡面的東西,當然也是 $PGDATA 的一部分。所以這裡的東西也不能擅自亂動。亂動的後果就會造成整個資料庫壞掉。
因此進行資料庫的全備份(Base Backup)時,需要同時對 $PGDATA 以及外部 Tablespace 目錄進行備份;從備份檔進行還原時,這些都要全部解壓縮完畢,並且設置 $PGDATA/pg_tblspc/ 裡面的 Soft Link,指向 Tablespace 目錄(參考先前筆記)。才能進行 Point-in-Time-Recovery 還原。
所以建立 Tablespace 時,不要把自建 Tablespace 指定目錄指到 $PGDATA 底下
CREATE TABLESPACE fastspace LOCATION '$PGDATA/my_tablespace_dir';
這樣設置,在使用 pg_basebackup 指令進行資料庫備份時,會因為指令跟著目錄連結,把 $PGDATA 「重複備份」一次。造成困擾。
參考:
沒有留言:
張貼留言