pg_dump — 將 PostgreSQL 資料庫提取到腳本檔案或其他封存檔案中
pg_dump
[連線選項
...] [選項
...] [資料庫名稱
]
pg_dump 是一個用於備份 PostgreSQL 資料庫的工具程式。即使資料庫正在同時使用,它也能進行一致的備份。pg_dump 不會封鎖其他使用者存取資料庫(讀取者或寫入者)。
pg_dump 僅傾印單一資料庫。若要備份整個叢集,或備份叢集中所有資料庫共用的全域物件(例如角色和表格空間),請使用 pg_dumpall。
傾印可以腳本或封存檔案格式輸出。腳本傾印是純文字檔案,其中包含重建資料庫到儲存時狀態所需的 SQL 命令。若要從此類腳本還原,請將其饋送到 psql。腳本檔案可用於在其他機器和其他架構上重建資料庫;經過一些修改後,甚至可以在其他 SQL 資料庫產品上重建。
替代的封存檔案格式必須與 pg_restore 一起使用才能重建資料庫。它們允許 pg_restore 選擇性地還原內容,甚至在還原之前重新排序項目。封存檔案格式設計為可在不同架構之間移植。
當與其中一種封存檔案格式一起使用並與 pg_restore 結合使用時,pg_dump 提供了一種靈活的封存和傳輸機制。pg_dump 可用於備份整個資料庫,然後 pg_restore 可用於檢查封存檔案和/或選擇要還原的資料庫部分。最靈活的輸出檔案格式是 「自訂」 格式 (-Fc
) 和 「目錄」 格式 (-Fd
)。它們允許選擇和重新排序所有封存的項目,支援平行還原,並且預設情況下會壓縮。「目錄」格式是唯一支援平行傾印的格式。
在執行 pg_dump 時,應檢查輸出是否有任何警告(印在標準錯誤輸出上),尤其是在考慮到下面列出的限制的情況下。
以下命令列選項控制輸出的內容和格式。
資料庫名稱
指定要傾印的資料庫名稱。如果未指定,則使用環境變數 PGDATABASE
。如果未設定,則使用為連線指定的用戶名。
-a
--data-only
僅傾印資料,而不傾印結構描述(資料定義)。會傾印表格資料、大型物件和序列值。
此選項類似於指定 --section=data
,但由於歷史原因並不完全相同。
-b
--large-objects
--blobs
(已棄用)在傾印中包含大型物件。這是預設行為,除非指定了 --schema
、--table
或 --schema-only
。因此,-b
參數僅在已請求特定結構描述或表格的傾印中新增大型物件時才有用。請注意,大型物件被視為資料,因此在使用 --data-only
時會包含在內,但在使用 --schema-only
時則不會。
-B
--no-large-objects
--no-blobs
(已棄用)在傾印中排除大型物件。
如果同時給定 -b
和 -B
,則行為是輸出大型物件,當傾印資料時,請參閱 -b
文件。
-c
--clean
輸出命令以在輸出建立它們的命令之前,DROP
所有已傾印的資料庫物件。當還原是要覆寫現有資料庫時,此選項很有用。如果任何物件在目標資料庫中不存在,則在還原期間將報告可忽略的錯誤訊息,除非也指定了 --if-exists
。
發出封存 (非文字) 輸出檔案時,此選項會被忽略。對於封存格式,您可以在呼叫 pg_restore
時指定該選項。
-C
--create
以建立資料庫本身的命令開始輸出,然後重新連線到建立的資料庫。(使用這種形式的腳本,無論在執行腳本之前連線到目標安裝中的哪個資料庫都沒關係。)如果也指定了 --clean
,則腳本會先卸載並重新建立目標資料庫,然後再重新連線到它。
使用 --create
,輸出還包括資料庫的註解(如果有的話),以及特定於此資料庫的任何組態變數設定,也就是任何 ALTER DATABASE ... SET ...
和 ALTER ROLE ... IN DATABASE ... SET ...
命令,這些命令提及此資料庫。除非指定了 --no-acl
,否則也會傾印資料庫本身的存取權限。
發出封存 (非文字) 輸出檔案時,此選項會被忽略。對於封存格式,您可以在呼叫 pg_restore
時指定該選項。
-e pattern
--extension=pattern
只匯出符合 pattern
的擴充套件。如果沒有指定這個選項,目標資料庫中所有非系統擴充套件都會被匯出。您可以寫入多個 -e
參數來選擇多個擴充套件。pattern
參數會根據 psql 的 \d
指令使用的相同規則來解讀(請參閱模式),因此您也可以在模式中寫入萬用字元來選擇多個擴充套件。使用萬用字元時,請小心引用模式(如果需要),以防止 shell 擴充萬用字元。
如果 pg_extension_config_dump
註冊的任何組態關聯是由 --extension
指定的擴充套件所擁有,則會包含在匯出中。
當指定 -e
時,pg_dump 不會嘗試匯出所選擴充套件可能依賴的任何其他資料庫物件。因此,不能保證特定擴充套件匯出的結果可以成功地單獨還原到一個乾淨的資料庫中。
-E encoding
--encoding=encoding
以指定的字元集編碼建立匯出。預設情況下,匯出是以資料庫編碼建立。(另一種獲得相同結果的方法是將 PGCLIENTENCODING
環境變數設定為所需的匯出編碼。)支援的編碼在第 23.3.1 節中說明。
-f file
--file=file
將輸出傳送到指定檔案。對於基於檔案的輸出格式,可以省略此參數,在這種情況下,將使用標準輸出。但是,對於目錄輸出格式,必須指定此參數,在這種情況下,它指定目標目錄而不是檔案。在這種情況下,該目錄由 pg_dump
建立,並且必須事先不存在。
-F format
--format=format
選擇輸出的格式。format
可以是以下之一:
p
plain
輸出純文字SQL指令碼檔案(預設值)。
c
custom
輸出自訂格式的封存檔,適用於輸入到 pg_restore。與目錄輸出格式一起,這是最靈活的輸出格式,因為它允許在還原期間手動選擇和重新排序封存的項目。預設情況下,此格式也被壓縮。
d
directory
輸出目錄格式的封存檔,適用於輸入到 pg_restore。這將建立一個目錄,每個資料表和大型物件都有一個檔案,以及一個所謂的內容表檔案,該檔案以機器可讀取的格式描述了匯出的物件,pg_restore 可以讀取該格式。可以使用標準 Unix 工具來操作目錄格式的封存檔;例如,可以使用 gzip、lz4 或 zstd 工具壓縮未壓縮封存檔中的檔案。預設情況下,此格式使用 gzip
壓縮,並且也支援平行匯出。
t
tar
輸出 tar
格式的封存檔,適用於輸入到 pg_restore。tar 格式與目錄格式相容:解壓縮 tar 格式的封存檔會產生有效的目錄格式封存檔。但是,tar 格式不支援壓縮。此外,當使用 tar 格式時,無法在還原期間更改資料表資料項目的相對順序。
-j njobs
--jobs=njobs
透過同時匯出 njobs
個資料表來平行執行匯出。這個選項可能會減少執行匯出所需的時間,但也會增加資料庫伺服器的負載。您只能將此選項與目錄輸出格式一起使用,因為這是唯一允許多個程序同時寫入其資料的輸出格式。
pg_dump 將開啟 njobs
+ 1 個到資料庫的連線,因此請確保您的 max_connections 設定足夠高,以容納所有連線。
在執行平行匯出時,請求資料庫物件的獨佔鎖定可能會導致匯出失敗。原因是 pg_dump 領導程序請求在工作程序稍後將要匯出的物件上請求共用鎖定(ACCESS SHARE),以確保沒有人在匯出正在執行時刪除它們並使它們消失。如果另一個用戶端然後請求資料表的獨佔鎖定,則不會授予該鎖定,而是會排隊等待領導程序的共用鎖定釋放。因此,對該資料表的任何其他存取也不會被授予,並且會在獨佔鎖定請求之後排隊。這包括嘗試匯出資料表的工作程序。如果沒有任何預防措施,這將是經典的死鎖情況。為了檢測此衝突,pg_dump 工作程序使用 NOWAIT
選項請求另一個共用鎖定。如果未授予工作程序此共用鎖定,則必須有人同時請求獨佔鎖定,並且沒有辦法繼續匯出,因此 pg_dump 別無選擇,只能中止匯出。
要執行平行匯出,資料庫伺服器需要支援同步快照,這是 PostgreSQL 9.2 中針對主要伺服器和 10 中針對備用伺服器引入的功能。有了這個功能,資料庫用戶端可以確保他們看到相同的資料集,即使他們使用不同的連線。pg_dump -j
使用多個資料庫連線;它使用領導程序連線到資料庫一次,並為每個工作程序再次連線。如果沒有同步快照功能,則無法保證不同的工作程序在每個連線中看到相同的資料,這可能導致不一致的備份。
-n pattern
--schema=pattern
只傾印符合pattern
的結構描述;這會選取結構描述本身,以及其中包含的所有物件。如果未指定此選項,則會傾印目標資料庫中的所有非系統結構描述。可以透過撰寫多個 -n
參數來選取多個結構描述。pattern
參數會根據 psql 的 \d
指令所使用的相同規則進行解譯(請參閱模式),因此也可以透過在模式中撰寫萬用字元來選取多個結構描述。使用萬用字元時,請務必在必要時引用模式,以防止 Shell 擴充萬用字元;請參閱下方的範例。
指定 -n
時,pg_dump 不會嘗試傾印所選結構描述可能依賴的任何其他資料庫物件。因此,無法保證特定結構描述傾印的結果可以成功地自行還原到乾淨的資料庫中。
指定 -n
時,不會傾印大型物件等非結構描述物件。您可以使用 --large-objects
參數將大型物件新增回傾印中。
-N pattern
--exclude-schema=pattern
不要傾印任何符合 pattern
的結構描述。模式的解譯規則與 -n
相同。 可以多次給定 -N
以排除符合多個模式的結構描述。
同時給定 -n
和 -N
時,其行為是僅傾印至少符合一個 -n
參數但不符合任何 -N
參數的結構描述。如果 -N
出現時沒有 -n
,則符合 -N
的結構描述會從原本正常的傾印中排除。
-O
--no-owner
不要輸出指令來設定物件的所有權以符合原始資料庫。預設情況下,pg_dump 會發出 ALTER OWNER
或 SET SESSION AUTHORIZATION
陳述式,以設定已建立資料庫物件的所有權。除非腳本是由超級使用者啟動(或與擁有腳本中所有物件的使用者相同),否則執行腳本時這些陳述式將會失敗。若要建立可以由任何使用者還原,但會將所有物件的所有權授予該使用者的腳本,請指定 -O
。
發出封存 (非文字) 輸出檔案時,此選項會被忽略。對於封存格式,您可以在呼叫 pg_restore
時指定該選項。
-R
--no-reconnect
此選項已過時,但為了向後相容性仍然接受。
-s
--schema-only
僅傾印物件定義(結構描述),不傾印資料。
此選項與 --data-only
相反。它類似於,但由於歷史原因,與指定 --section=pre-data --section=post-data
不同。
(不要將其與 --schema
選項混淆,該選項以不同的含義使用單字「“schema”」。)
若要僅排除資料庫中一部分表格的表格資料,請參閱 --exclude-table-data
。
-S username
--superuser=username
指定停用觸發器時要使用的超級使用者名稱。只有在使用 --disable-triggers
時,此選項才相關。(通常,最好省略此選項,而是以超級使用者身分啟動結果腳本。)
-t pattern
--table=pattern
僅傾印名稱符合 pattern
的表格。可以透過撰寫多個 -t
參數來選取多個表格。pattern
參數會根據 psql 的 \d
指令所使用的相同規則進行解譯(請參閱模式),因此也可以透過在模式中撰寫萬用字元來選取多個表格。使用萬用字元時,請務必在必要時引用模式,以防止 Shell 擴充萬用字元;請參閱下方的範例。
除了表格之外,此選項還可以用於傾印符合條件的檢視表、具體化檢視表、外部表格和序列的定義。它不會傾印檢視表或具體化檢視表的內容,並且只有在使用 --include-foreign-data
指定了相應的外部伺服器時,才會傾印外部表格的內容。
當使用 -t
時,-n
和 -N
參數無效,因為無論這些參數如何,都會傾印由 -t
選取的表格,並且不會傾印非表格物件。
指定 -t
時,pg_dump 不會嘗試傾印所選表格可能依賴的任何其他資料庫物件。因此,無法保證特定表格傾印的結果可以成功地自行還原到乾淨的資料庫中。
-T pattern
--exclude-table=pattern
不要傾印任何符合 pattern
的表格。模式的解譯規則與 -t
相同。 可以多次給定 -T
以排除符合多個模式的表格。
同時給定 -t
和 -T
時,其行為是僅傾印至少符合一個 -t
參數但不符合任何 -T
參數的表格。如果 -T
出現時沒有 -t
,則符合 -T
的表格會從原本正常的傾印中排除。
-v
--verbose
指定詳細模式。這會使 pg_dump 將詳細的物件註解和開始/停止時間輸出到傾印檔案,並將進度訊息輸出到標準錯誤。重複此選項會使其他除錯層級的訊息出現在標準錯誤上。
-V
--version
列印 pg_dump 版本並結束。
-x
--no-privileges
--no-acl
防止傾印存取權限(grant/revoke 指令)。
-Z level
-Z method
[:detail
]--compress=level
--compress=method
[:detail
]指定要使用的壓縮方法和/或壓縮層級。壓縮方法可以設定為 gzip
、lz4
、zstd
或 none
,表示不壓縮。可以選擇性地指定壓縮詳細資訊字串。如果詳細資訊字串是一個整數,則指定壓縮層級。否則,它應該是一個以逗號分隔的項目列表,每個項目的形式為 keyword
或 keyword=value
。目前,支援的關鍵字是 level
和 long
。
如果未指定壓縮層級,則將使用預設壓縮層級。如果僅指定層級而未提及演算法,如果層級大於 0
,將使用 gzip
壓縮;如果層級為 0
,則不使用壓縮。
對於自訂和目錄歸檔格式,這指定了單個表格資料段的壓縮,預設是使用適中層級的 gzip
進行壓縮。對於純文字輸出,設定非零壓縮層級會導致整個輸出檔案被壓縮,就像它被饋送到 gzip、lz4 或 zstd 中一樣;但預設是不壓縮。使用 zstd 壓縮時,long
模式可能會提高壓縮率,但會增加記憶體使用量。
目前,tar 歸檔格式完全不支援壓縮。
--binary-upgrade
此選項供就地升級工具使用。不建議或支援將其用於其他目的。此選項的行為可能會在未來的版本中更改,恕不另行通知。
--column-inserts
--attribute-inserts
將資料轉儲為具有明確欄位名稱的 INSERT
指令 (INSERT INTO
)。這會使還原速度非常慢;它主要用於製作可以載入到非 PostgreSQL 資料庫中的轉儲。還原期間的任何錯誤只會導致屬於有問題的 table
(column
, ...) VALUES ...INSERT
的資料列遺失,而不是整個表格內容。
--disable-dollar-quoting
此選項停用對函數主體的貨幣符號引號的使用,並強制使用 SQL 標準字串語法對其進行引號。
--disable-triggers
此選項僅在建立僅限資料的轉儲時才相關。它指示 pg_dump 在還原資料時包含用於暫時停用目標表格上觸發器的指令。如果表格上有參考完整性檢查或其他觸發器,且您不希望在資料還原期間調用它們,請使用此選項。
目前,為 --disable-triggers
發出的指令必須以超級使用者身分執行。因此,您也應該使用 -S
指定超級使用者名稱,或者最好小心地以超級使用者身分啟動產生的腳本。
發出封存 (非文字) 輸出檔案時,此選項會被忽略。對於封存格式,您可以在呼叫 pg_restore
時指定該選項。
--enable-row-security
僅當轉儲具有資料列安全性的表格內容時,此選項才相關。預設情況下,pg_dump 會將 row_security 設定為 off,以確保從表格中轉儲所有資料。如果使用者沒有足夠的權限來繞過資料列安全性,則會擲回錯誤。此參數指示 pg_dump 改為將 row_security 設定為 on,允許使用者轉儲他們有權存取的表格內容部分。
請注意,如果您目前使用此選項,您可能也希望轉儲採用 INSERT
格式,因為還原期間的 COPY FROM
不支援資料列安全性。
--exclude-extension=pattern
不要轉儲任何符合 pattern
的擴充功能。模式的解釋方式與 -e
的規則相同。可以多次指定 --exclude-extension
,以排除符合任何多個模式的擴充功能。
如果同時指定 -e
和 --exclude-extension
,則行為是僅轉儲至少符合一個 -e
開關但不符合任何 --exclude-extension
開關的擴充功能。如果 --exclude-extension
出現而沒有 -e
,則符合 --exclude-extension
的擴充功能將從其他正常的轉儲中排除。
--exclude-table-and-children=pattern
這與 -T
/--exclude-table
選項相同,不同之處在於它也會排除符合 pattern
的表格的任何分割區或繼承子表格。
--exclude-table-data=pattern
不要轉儲任何符合 pattern
的表格的資料。模式的解釋方式與 -t
的規則相同。可以多次指定 --exclude-table-data
,以排除符合任何多個模式的表格。當您需要特定表格的定義,即使您不需要其中的資料時,此選項非常有用。
若要排除資料庫中所有表格的資料,請參閱 --schema-only
。
--exclude-table-data-and-children=pattern
這與 --exclude-table-data
選項相同,不同之處在於它也會排除符合 pattern
的表格的任何分割區或繼承子表格的資料。
--extra-float-digits=ndigits
轉儲浮點資料時,使用指定的 extra_float_digits
值,而不是使用可用的最大精度。為備份目的所做的常規轉儲不應使用此選項。
--filter=filename
指定一個檔案名稱,從中讀取要包含或排除在轉儲中的物件的模式。這些模式的解釋方式與對應選項的規則相同:-t
/--table
、--table-and-children
、-T
/--exclude-table
和 --exclude-table-and-children
用於表格,-n
/--schema
和 -N
/--exclude-schema
用於結構描述,--include-foreign-data
用於外部伺服器上的資料,--exclude-table-data
和 --exclude-table-data-and-children
用於表格資料,以及 -e
/--extension
和 --exclude-extension
用於擴充功能。若要從 STDIN
讀取,請使用 -
作為檔案名稱。--filter
選項可以與上面列出的用於包含或排除物件的選項結合使用,也可以多次指定以用於多個篩選器檔案。
該檔案每行列出一個物件模式,格式如下
{ include | exclude } { extension | foreign_data | table | table_and_children | table_data | table_data_and_children | schema } PATTERN
第一個關鍵字指定是否包含或排除符合模式的物件。第二個關鍵字指定要使用模式篩選的物件類型
extension
:擴充套件。此選項的作用如同 -e
/--extension
或 --exclude-extension
選項。
foreign_data
:關於外部伺服器的資料。此選項的作用如同 --include-foreign-data
選項。此關鍵字只能與 include
關鍵字一起使用。
table
:表格。此選項的作用如同 -t
/--table
或 -T
/--exclude-table
選項。
table_and_children
:表格,包括任何分割區或繼承的子表格。此選項的作用如同 --table-and-children
或 --exclude-table-and-children
選項。
table_data
:符合 pattern
的任何表格的表格資料。此選項的作用如同 --exclude-table-data
選項。此關鍵字只能與 exclude
關鍵字一起使用。
table_data_and_children
:符合 pattern
的任何表格的表格資料,以及該表格的任何分割區或繼承的子表格。此選項的作用如同 --exclude-table-data-and-children
選項。此關鍵字只能與 exclude
關鍵字一起使用。
schema
:結構描述。此選項的作用如同 -n
/--schema
或 -N
/--exclude-schema
選項。
以 #
開頭的行被視為註解並忽略。註解也可以放在物件模式列之後。空白行也會被忽略。有關如何在模式中執行引用的資訊,請參閱 模式。
範例檔案列在下面的 範例 章節中。
--if-exists
使用 DROP ... IF EXISTS
命令以在 --clean
模式下刪除物件。這會抑制可能回報的 “不存在” 錯誤。除非也指定了 --clean
,否則此選項無效。
--include-foreign-data=foreignserver
轉儲具有符合 foreignserver
模式的外部伺服器的任何外部表格的資料。可以透過寫入多個 --include-foreign-data
開關來選擇多個外部伺服器。此外,foreignserver
參數被解釋為根據 psql 的 \d
命令使用的相同規則的模式(請參閱 模式),因此也可以透過在模式中寫入萬用字元來選擇多個外部伺服器。使用萬用字元時,請小心引用模式,以防止 Shell 展開萬用字元;請參閱下面的 範例。唯一的例外是不允許空模式。
在 --include-foreign-data
中使用萬用字元可能會導致存取意料之外的外部伺服器。此外,為了安全地使用此選項,請確保命名的伺服器必須具有受信任的擁有者。
當指定 --include-foreign-data
時,pg_dump 不會檢查外部表格是否可寫入。因此,無法保證可以成功還原外部表格轉儲的結果。
--inserts
將資料轉儲為 INSERT
命令(而不是 COPY
)。這會使還原非常慢;它主要用於建立可以載入到非 PostgreSQL 資料庫中的轉儲。還原期間的任何錯誤只會導致屬於有問題的 INSERT
的列遺失,而不是整個表格內容。請注意,如果您重新排列了欄位順序,則還原可能會完全失敗。--column-inserts
選項對於欄位順序變更來說是安全的,但速度更慢。
--load-via-partition-root
在轉儲表格分割區的資料時,使 COPY
或 INSERT
陳述式以包含它的分割階層的根目錄為目標,而不是分割區本身。這會導致在載入資料時為每一列重新確定適當的分割區。當在伺服器上還原資料時,如果列不總是落入與原始伺服器上相同的分割區中,這可能會很有用。例如,如果分割欄位的類型是 text,並且兩個系統具有用於對分割欄位進行排序的不同定序定義,則可能會發生這種情況。
--lock-wait-timeout=timeout
不要永遠等待以在轉儲開始時取得共用表格鎖定。相反,如果在指定的 timeout
內無法鎖定表格,則失敗。超時時間可以用 SET statement_timeout
接受的任何格式指定。(允許的格式因您要從中轉儲的伺服器版本而異,但所有版本都接受整數毫秒數。)
--no-comments
不要轉儲註解。
--no-publications
不要轉儲發布。
--no-security-labels
不要轉儲安全標籤。
--no-subscriptions
不要轉儲訂閱。
--no-sync
預設情況下,pg_dump
將等待所有檔案安全地寫入磁碟。此選項會導致 pg_dump
在不等待的情況下返回,這更快,但意味著後續的作業系統崩潰可能會使轉儲損壞。通常,此選項對於測試很有用,但不應在從生產安裝轉儲資料時使用。
--no-table-access-method
不要輸出用於選擇表格存取方法的命令。使用此選項,所有物件都將使用還原期間的預設表格存取方法建立。
發出封存 (非文字) 輸出檔案時,此選項會被忽略。對於封存格式,您可以在呼叫 pg_restore
時指定該選項。
--no-tablespaces
不要輸出用於選擇表格空間的命令。使用此選項,所有物件都將在還原期間的預設表格空間中建立。
發出封存 (非文字) 輸出檔案時,此選項會被忽略。對於封存格式,您可以在呼叫 pg_restore
時指定該選項。
--no-toast-compression
不要輸出用於設定TOAST壓縮方法的命令。使用此選項,所有欄位都將使用預設壓縮設定還原。
--no-unlogged-table-data
不要轉儲未登錄的表格和序列的內容。此選項對表格和序列定義(結構描述)是否轉儲沒有影響;它只會抑制轉儲表格和序列資料。從備用伺服器轉儲時,始終會排除未登錄的表格和序列中的資料。
--on-conflict-do-nothing
將 ON CONFLICT DO NOTHING
新增到 INSERT
命令。除非也指定了 --inserts
、--column-inserts
或 --rows-per-insert
,否則此選項無效。
--quote-all-identifiers
強制引用所有識別碼。當從其 PostgreSQL 主要版本與 pg_dump 的主要版本不同的伺服器轉儲資料庫時,或者當輸出旨在載入到不同主要版本的伺服器中時,建議使用此選項。預設情況下,pg_dump 只會引用其自身主要版本中的保留字識別碼。在處理可能具有稍微不同的保留字集的其他版本的伺服器時,這有時會導致相容性問題。使用 --quote-all-identifiers
可以防止此類問題,但代價是轉儲腳本更難以閱讀。
--rows-per-insert=nrows
將資料轉儲為 INSERT
命令(而不是 COPY
)。控制每個 INSERT
命令的最大列數。指定的值必須是大于零的数字。還原期間的任何錯誤只會導致屬於有問題的 INSERT
的列遺失,而不是整個表格內容。
--section=sectionname
只傾印指定的區段。區段名稱可以是 pre-data
、data
或 post-data
。這個選項可以指定多次來選擇多個區段。預設是傾印所有區段。
data 區段包含實際的表格資料、大型物件內容和序列值。Post-data 項目包含索引、觸發器、規則和約束的定義,經驗證的檢查約束除外。Pre-data 項目包含所有其他資料定義項目。
--serializable-deferrable
使用 serializable
交易來傾印,以確保使用的快照與後續的資料庫狀態一致;但藉由等待交易串流中不存在任何異常的點來完成此操作,因此不會有傾印失敗或導致其他交易因 serialization_failure
而回滾的風險。有關交易隔離和並行控制的更多資訊,請參閱第 13 章。
此選項對於僅用於災難復原的傾印沒有幫助。對於用於載入資料庫副本以進行報表或其他唯讀負載共享,同時原始資料庫繼續更新的傾印,此選項可能很有用。如果沒有它,傾印可能反映與最終提交的交易的任何連續執行不一致的狀態。例如,如果使用批次處理技術,則批次可能在傾印中顯示為已關閉,但並非批次中的所有項目都出現。
如果在啟動 pg_dump 時沒有作用中的讀寫交易,則此選項不會產生任何影響。如果讀寫交易處於活動狀態,則傾印的開始可能會延遲不確定的時間長度。一旦運行,無論有無此選項,效能都是相同的。
--snapshot=snapshotname
在建立資料庫傾印時,使用指定的同步快照(有關更多詳細資訊,請參閱表 9.98)。
當需要將傾印與邏輯複製槽(請參閱第 47 章)或並行會話同步時,此選項非常有用。
在並行傾印的情況下,會使用此選項定義的快照名稱,而不是採用新的快照。
--strict-names
要求每個擴充功能 (-e
/--extension
)、綱要 (-n
/--schema
) 和表格 (-t
/--table
) 模式,至少與要傾印的資料庫中的一個擴充功能/綱要/表格相符。這也適用於與 --filter
一起使用的篩選器。請注意,如果沒有任何擴充功能/綱要/表格模式找到匹配項,即使沒有 --strict-names
,pg_dump 也會產生錯誤。
此選項對 --exclude-extension
、-N
/--exclude-schema
、-T
/--exclude-table
或 --exclude-table-data
沒有影響。未能匹配任何物件的排除模式不被視為錯誤。
--sync-method=method
當設定為 fsync
(預設值)時,pg_dump --format=directory
將遞迴地開啟和同步封存目錄中的所有檔案。
在 Linux 上,可以使用 syncfs
來要求作業系統同步包含封存目錄的整個檔案系統。有關使用 syncfs
時需要注意的注意事項,請參閱recovery_init_sync_method。
當使用 --no-sync
或未將 --format
設定為 directory
時,此選項無效。
--table-and-children=pattern
這與 -t
/--table
選項相同,但它也包含與 pattern
相符的表格的任何分割區或繼承子表格。
--use-set-session-authorization
輸出 SQL 標準 SET SESSION AUTHORIZATION
命令,而不是 ALTER OWNER
命令來確定物件所有權。這使傾印更符合標準,但根據傾印中物件的歷史記錄,可能無法正確還原。此外,使用 SET SESSION AUTHORIZATION
的傾印肯定需要超級使用者權限才能正確還原,而 ALTER OWNER
需要較少的權限。
-?
--help
顯示有關 pg_dump 命令列引數的說明,然後結束。
以下命令列選項控制資料庫連線參數。
-d dbname
--dbname=dbname
指定要連線的資料庫名稱。這相當於在命令列上將 dbname
指定為第一個非選項引數。dbname
可以是連線字串。如果是這樣,連線字串參數將覆寫任何衝突的命令列選項。
-h host
--host=host
指定伺服器運行的機器的主機名稱。如果值以斜線開頭,則將其用作 Unix 網域套接字的目錄。預設值取自 PGHOST
環境變數(如果已設定),否則會嘗試 Unix 網域套接字連線。
-p port
--port=port
指定伺服器監聽連線的 TCP 埠或本機 Unix 網域套接字檔案擴充名。預設為 PGPORT
環境變數(如果已設定)或編譯的預設值。
-U username
--username=username
要連線的使用者名稱。
-w
--no-password
永遠不要發出密碼提示。如果伺服器需要密碼驗證,並且無法通過其他方式(例如 .pgpass
檔案)獲得密碼,則連線嘗試將失敗。此選項在批次作業和腳本中很有用,因為沒有使用者可以輸入密碼。
-W
--password
強制 pg_dump 在連線到資料庫之前提示輸入密碼。
此選項永遠不是必需的,因為如果伺服器需要密碼驗證,pg_dump 會自動提示輸入密碼。但是,pg_dump 將浪費一次連線嘗試來確定伺服器是否需要密碼。在某些情況下,值得輸入 -W
以避免額外的連線嘗試。
--role=rolename
指定用來建立傾印的角色名稱。這個選項會讓 pg_dump 在連線到資料庫後,發出一個 SET ROLE
rolename
指令。當經過驗證的使用者(由 -U
指定)缺少 pg_dump 所需的權限,但可以切換到具有所需權限的角色時,這非常有用。有些安裝不允許直接以超級使用者身分登入,使用此選項可以在不違反政策的情況下進行傾印。
PGDATABASE
PGHOST
PGOPTIONS
PGPORT
PGUSER
預設連線參數。
PG_COLOR
指定是否在診斷訊息中使用顏色。可能的值為 always
、auto
和 never
。
這個工具,就像大多數其他的 PostgreSQL 工具一樣,也使用 libpq 支援的環境變數 (請參閱 第 32.15 節)。
pg_dump 在內部執行 SELECT
陳述式。如果您在執行 pg_dump 時遇到問題,請確保您可以使用 psql 等工具從資料庫中選取資訊。此外,libpq 前端函式庫使用的任何預設連線設定和環境變數都會套用。
pg_dump 的資料庫活動通常由累積統計系統收集。如果這不理想,您可以透過 PGOPTIONS
或 ALTER USER
指令將參數 track_counts
設定為 false。
如果您的資料庫叢集在 template1
資料庫中有任何本機新增項目,請小心將 pg_dump 的輸出還原到一個真正空的資料庫中;否則,您可能會由於重複定義新增物件而發生錯誤。若要建立一個沒有任何本機新增項目的空資料庫,請從 template0
而非 template1
複製,例如
CREATE DATABASE foo WITH TEMPLATE template0;
當選擇僅限資料的傾印,並使用 --disable-triggers
選項時,pg_dump 會發出指令在插入資料之前停用使用者資料表上的觸發程序,然後在插入資料後重新啟用它們。如果還原在中途停止,系統目錄可能會處於錯誤的狀態。
pg_dump 產生的傾印檔案不包含最佳化工具用來做出查詢規劃決策的統計資訊。因此,在從傾印檔案還原後執行 ANALYZE
以確保最佳效能是明智的;請參閱 第 24.1.3 節 和 第 24.1.6 節 以取得更多資訊。
由於 pg_dump 用於將資料傳輸到較新版本的 PostgreSQL,因此可以預期 pg_dump 的輸出可以載入到比 pg_dump 版本更新的 PostgreSQL 伺服器版本中。pg_dump 也可以從比其自身版本舊的 PostgreSQL 伺服器傾印。(目前,支援追溯到 9.2 版的伺服器。)但是,pg_dump 無法從比其自身主要版本新的 PostgreSQL 伺服器傾印;它寧願冒險製作無效的傾印,也不願嘗試。此外,不保證 pg_dump 的輸出可以載入到較舊主要版本的伺服器中 — 即使傾印是從該版本的伺服器取得的。將傾印檔案載入到較舊的伺服器可能需要手動編輯傾印檔案,以刪除較舊伺服器不理解的語法。建議在跨版本的情況下使用 --quote-all-identifiers
選項,因為它可以防止不同 PostgreSQL 版本中不同保留字清單引起的問題。
在傾印邏輯複製訂閱時,pg_dump 將產生使用 connect = false
選項的 CREATE SUBSCRIPTION
指令,以便還原訂閱時不會建立遠端連線來建立複製槽或進行初始資料表複製。這樣,就可以在不需要網路存取遠端伺服器的情況下還原傾印。然後,由使用者以適當的方式重新啟動訂閱。如果相關主機已更改,則可能必須更改連線資訊。在啟動新的完整資料表複製之前,也可能適合截斷目標資料表。如果使用者打算在重新整理期間複製初始資料,則他們必須使用 two_phase = false
建立槽。在初始同步之後,如果訂閱最初是使用 two_phase
選項建立的,則訂閱者將自動啟用 two_phase = true
選項。
將名為 mydb
的資料庫傾印到 SQL 腳本檔案中
$
pg_dump mydb > db.sql
將這樣的腳本重新載入到名為 newdb
的(新建立的)資料庫中
$
psql -d newdb -f db.sql
將資料庫傾印到自訂格式封存檔案中
$
pg_dump -Fc mydb > db.dump
將資料庫傾印到目錄格式封存中
$
pg_dump -Fd mydb -f dumpdir
使用 5 個工作執行緒平行傾印到目錄格式封存資料庫
$
pg_dump -Fd mydb -j 5 -f dumpdir
將封存檔案重新載入到名為 newdb
的(新建立的)資料庫中
$
pg_restore -d newdb db.dump
將封存檔案重新載入到與傾印來源相同的資料庫中,並捨棄該資料庫的當前內容
$
pg_restore -d postgres --clean --create db.dump
傾印名為 mytab
的單個資料表
$
pg_dump -t mytab mydb > db.sql
傾印 detroit
綱要中所有名稱以 emp
開頭的資料表,但名為 employee_log
的資料表除外
$
pg_dump -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql
傾印所有名稱以 east
或 west
開頭,並以 gsm
結尾的綱要,但不包括任何名稱包含單字 test
的綱要
$
pg_dump -n 'east*gsm' -n 'west*gsm' -N '*test*' mydb > db.sql
相同操作,使用正規表示式標記法來合併切換
$
pg_dump -n '(east|west)*gsm' -N '*test*' mydb > db.sql
傾印所有資料庫物件,但名稱以 ts_
開頭的資料表除外
$
pg_dump -T 'ts_*' mydb > db.sql
要在 -t
和相關切換中指定大寫或混合大小寫的名稱,您需要用雙引號引起來;否則它將被折疊為小寫(請參閱模式)。但是雙引號對於 shell 而言是特殊的,因此反過來也必須將它們引起來。因此,要傾印具有混合大小寫名稱的單個資料表,您需要類似這樣的東西
$
pg_dump -t "\"MixedCaseName\"" mydb > mytab.sql
若要傾印所有名稱以 mytable
開頭的資料表,但不包括資料表 mytable2
,請指定一個像這樣的篩選檔案 filter.txt
include table mytable* exclude table mytable2
$
pg_dump --filter=filter.txt mydb > db.sql
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符,或需要進一步澄清之處,請使用此表單回報文件問題。