支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

25.1. SQL傾印 #

此傾印方法背後的想法是產生一個包含 SQL 指令的檔案,當回饋給伺服器時,將以與傾印時相同的狀態重建資料庫。PostgreSQL 提供實用程式 pg_dump 用於此目的。此指令的基本用法為

pg_dump dbname > dumpfile

如您所見,pg_dump 將其結果寫入標準輸出。 我們將在下面看到這有什麼用。 雖然上面的命令建立一個文字檔案,但 pg_dump 可以建立其他格式的檔案,從而允許並行性和更精細的物件還原控制。

pg_dump 是一個常規的 PostgreSQL 客戶端應用程式(儘管是一個特別聰明的應用程式)。 這意味著您可以從任何有權存取資料庫的遠端主機執行此備份程序。 但請記住,pg_dump 不使用特殊權限運行。 特別是,它必須具有對您要備份的所有資料表的讀取權限,因此為了備份整個資料庫,您幾乎總是必須以資料庫超級使用者的身分運行它。(如果您沒有足夠的權限來備份整個資料庫,您仍然可以使用諸如 -n schema-t table 之類的選項來備份您有權存取的資料庫部分。)

若要指定 pg_dump 應連線的資料庫伺服器,請使用命令列選項 -h host-p port。 預設主機是本機主機或您的 PGHOST 環境變數指定的任何主機。 同樣地,預設連接埠由 PGPORT 環境變數指示,如果沒有,則由編譯內建的預設值指示。(方便的是,伺服器通常具有相同的編譯內建預設值。)

與任何其他 PostgreSQL 客戶端應用程式一樣,pg_dump 預設會使用與目前作業系統使用者名稱相同的資料庫使用者名稱進行連線。 若要覆寫此設定,請指定 -U 選項或設定環境變數 PGUSER。 請記住,pg_dump 連線受制於常規的客戶端身份驗證機制(在 第 20 章 中描述)。

pg_dump 相較於稍後描述的其他備份方法的一個重要優勢是,pg_dump 的輸出通常可以重新載入到更新版本的 PostgreSQL 中,而檔案層級備份和連續封存都是極其特定於伺服器版本的。pg_dump 也是將資料庫傳輸到不同的機器架構(例如,從 32 位元伺服器轉到 64 位元伺服器)時唯一有效的方法。

pg_dump 建立的傾印在內部是一致的,這意味著傾印表示 pg_dump 開始運行時資料庫的快照。pg_dump 在工作時不會阻止資料庫上的其他操作。(例外情況是那些需要以獨佔鎖定運行的操作,例如大多數形式的 ALTER TABLE。)

25.1.1. 還原傾印 #

pg_dump 建立的文字檔案旨在由 psql 程式讀取。還原傾印的一般命令形式是

psql dbname < dumpfile

其中 dumpfilepg_dump 命令輸出的檔案。 資料庫 dbname 不會由此命令建立,因此您必須在執行 psql 之前從 template0 建立它(例如,使用 createdb -T template0 dbname)。 psql 支援與 pg_dump 類似的選項,用於指定要連線的資料庫伺服器和要使用的使用者名稱。 有關更多資訊,請參閱 psql 參考頁面。 非文字檔案傾印使用 pg_restore 實用程式還原。

在還原 SQL 傾印檔之前,所有擁有物件的使用者,或是在傾印資料庫中的物件上被授予權限的使用者,必須已經存在。如果他們不存在,還原將無法以原始的所有權和/或權限重新建立這些物件。(有時候這正是你想要的,但通常不是。)

預設情況下,psql 腳本會在遇到 SQL 錯誤後繼續執行。 你可能希望使用設定為 ON_ERROR_STOP 變數來執行 psql,以改變該行為,並在發生 SQL 錯誤時,使 psql 以退出狀態 3 退出。

psql --set ON_ERROR_STOP=on dbname < dumpfile

無論如何,你都只會有部分還原的資料庫。或者,你可以指定整個傾印檔應作為單一交易還原,因此還原要么完全完成,要么完全回滾。 可以透過將 -1--single-transaction 命令列選項傳遞給 psql 來指定此模式。使用此模式時,請注意,即使是很小的錯誤也可能回滾已運行多個小時的還原。但是,這可能仍然比在部分還原的傾印檔之後手動清理複雜的資料庫更好。

pg_dumppsql 寫入或讀取管道的能力,使得可以直接將資料庫從一台伺服器傾印到另一台伺服器,例如

pg_dump -h host1 dbname | psql -h host2 dbname

重要事項

pg_dump 產生的傾印檔是相對於 template0 的。 這表示透過 template1 新增的任何語言、程序等也會被 pg_dump 傾印。 因此,還原時,如果你使用的是自訂的 template1,則必須像上面的範例一樣,從 template0 建立空的資料庫。

還原備份後,明智的做法是在每個資料庫上執行 ANALYZE,以便查詢最佳化器擁有有用的統計資訊;有關更多資訊,請參閱 第 24.1.3 節第 24.1.6 節。 有關如何有效地將大量資料載入 PostgreSQL 的更多建議,請參閱 第 14.4 節

25.1.2. 使用 pg_dumpall #

pg_dump 一次只傾印一個資料庫,並且不會傾印有關角色或表格空間的資訊(因為它們是叢集範圍而不是每個資料庫)。 為了支援方便地傾印資料庫叢集的全部內容,提供了 pg_dumpall 程式。pg_dumpall 備份給定叢集中的每個資料庫,並保留叢集範圍的資料,例如角色和表格空間定義。 此命令的基本用法是

pg_dumpall > dumpfile

產生的傾印可以使用 psql 還原

psql -f dumpfile postgres

(實際上,你可以指定任何現有的資料庫名稱來開始,但如果你要載入到空的叢集中,則通常應使用 postgres。) 還原 pg_dumpall 傾印檔時,始終需要具有資料庫超級使用者存取權,因為還原角色和表格空間資訊需要該權限。 如果你使用表格空間,請確保傾印檔中的表格空間路徑適合新的安裝。

pg_dumpall 的工作原理是發出命令以重新建立角色、表格空間和空資料庫,然後為每個資料庫呼叫 pg_dump。 這表示雖然每個資料庫在內部都是一致的,但不同資料庫的快照並未同步。

可以使用 pg_dumpall --globals-only 選項單獨傾印叢集範圍的資料。 如果在個別資料庫上執行 pg_dump 命令,則必須這樣做才能完全備份叢集。

25.1.3. 處理大型資料庫 #

某些作業系統具有最大檔案大小限制,這會在建立大型 pg_dump 輸出檔案時造成問題。 幸運的是,pg_dump 可以寫入標準輸出,因此你可以使用標準 Unix 工具來解決此潛在問題。 有幾種可能的方法

使用壓縮傾印檔。 你可以使用你喜歡的壓縮程式,例如 gzip

pg_dump dbname | gzip > filename.gz

使用以下命令重新載入

gunzip -c filename.gz | psql dbname

cat filename.gz | gunzip | psql dbname

使用 split split 命令允許你將輸出分割成較小的檔案,這些檔案大小對於基礎檔案系統來說是可以接受的。 例如,要建立 2 GB 的區塊

pg_dump dbname | split -b 2G - filename

使用以下命令重新載入

cat filename* | psql dbname

如果使用 GNU split,則可以將其與 gzip 一起使用

pg_dump dbname | split -b 2G --filter='gzip > $FILE.gz'

可以使用 zcat 還原它。

使用 pg_dump 的自訂傾印格式。 如果 PostgreSQL 建置在安裝了 zlib 壓縮程式庫的系統上,則自訂傾印格式會將資料壓縮,然後將其寫入輸出檔案。 這將產生類似於使用 gzip 的傾印檔案大小,但它的附加優點是可以選擇性地還原表格。 以下命令使用自訂傾印格式傾印資料庫

pg_dump -Fc dbname > filename

自訂格式的傾印不是 psql 的腳本,而是必須使用 pg_restore 還原,例如

pg_restore -d dbname filename

有關詳細資訊,請參閱 pg_dumppg_restore 參考頁面。

對於非常大的資料庫,你可能需要將 split 與其他兩種方法之一結合使用。

使用 pg_dump 的平行傾印功能。 為了加快大型資料庫的傾印速度,你可以使用 pg_dump 的平行模式。 這將同時傾印多個表格。 你可以使用 -j 參數控制平行處理的程度。 僅對「目錄」歸檔格式支援平行傾印。

pg_dump -j num -F d -f out.dir dbname

你可以使用 pg_restore -j 平行還原傾印檔。 這適用於任何「自訂」或「目錄」歸檔模式的歸檔,無論它是使用 pg_dump -j 建立的還是沒有。

提交更正

如果你在文件中發現任何不正確、與你使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表單來回報文件問題。