pg_dump — 將 PostgreSQL 資料庫匯出為 SQL 指令碼或其他格式
pg_dump
[連線選項
...] [選項
...] [資料庫名
]
pg_dump 是一個用於匯出 PostgreSQL 資料庫的實用程式。即使資料庫正在被併發使用,它也能進行一致性的匯出。pg_dump 不會阻止其他使用者訪問資料庫(讀或寫)。請注意,除了簡單情況外,pg_dump 通常不適合用於定期備份生產資料庫。有關更多討論,請參閱 第 25 章。
pg_dump 只能轉儲單個數據庫。要匯出整個叢集,或匯出叢集中所有資料庫的全域性物件(如角色和表空間),請使用 pg_dumpall。
轉儲可以以指令碼或歸檔檔案格式輸出。指令碼轉儲是純文字檔案,包含重新構建資料庫到轉儲時狀態所需的 SQL 命令。要從這樣的指令碼恢復,請將其提供給 psql。指令碼檔案可用於在其他機器和其他架構上重新構建資料庫;稍作修改,甚至可以在其他 SQL 資料庫產品上使用。
替代的歸檔檔案格式必須與 pg_restore 一起使用來重建資料庫。它們允許 pg_restore 選擇性地恢復,甚至可以在恢復前重新排序專案。歸檔檔案格式設計為跨架構可移植。
當與歸檔檔案格式之一結合使用並與 pg_restore 結合使用時,pg_dump 提供了一種靈活的歸檔和傳輸機制。pg_dump 可用於匯出整個資料庫,然後 pg_restore 可用於檢查歸檔或/和選擇要恢復的資料庫部分。最靈活的輸出檔案格式是“自定義”格式(-Fc
)和“目錄”格式(-Fd
)。它們允許選擇和重新排序所有歸檔項,支援並行恢復,並且預設情況下是壓縮的。“目錄”格式是唯一支援並行轉儲的格式。
在執行 pg_dump 時,應檢查輸出中的任何警告(列印在標準錯誤流上),尤其要考慮到下面列出的限制。
恢復轉儲會導致目標資料庫執行源超級使用者選擇的任意程式碼。部分轉儲和部分恢復不會限制這一點。如果源超級使用者不受信任,則在恢復之前必須檢查轉儲的 SQL 語句。可以使用 pg_restore 的 --file
選項檢查非純文字轉儲。請注意,執行轉儲和恢復的客戶端不需要信任源或目標超級使用者。
以下命令列選項控制輸出的內容和格式。
dbname
指定要轉儲的資料庫名稱。如果未指定,則使用環境變數 PGDATABASE
。如果該變數未設定,則使用連線指定的使用者名稱稱。
-a
--data-only
僅轉儲資料,而不轉儲模式(資料定義)或統計資訊。轉儲表資料、大物件和序列值。
此選項與指定 --section=data
類似,但由於歷史原因並不完全相同。
-b
--large-objects
--blobs
(已棄用)在轉儲中包含大物件。這是預設行為,除非指定了 --schema
、--table
、--schema-only
、--statistics-only
或 --no-data
。因此,-b
開關僅在請求了特定模式或表時用於將大物件新增到轉儲中。請注意,大物件被視為資料,因此在使用 --data-only
時會包含它們,但在使用 --schema-only
或 --statistics-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 模式
--extension=模式
僅轉儲與 模式
匹配的擴充套件。當未指定此選項時,將轉儲目標資料庫中的所有非系統擴充套件。可以透過編寫多個 -e
開關來選擇多個擴充套件。模式
引數被解釋為與 psql 的 \d
命令使用的規則相同的模式(請參閱 模式),因此透過在模式中寫入萬用字元也可以選擇多個擴充套件。使用萬用字元時,請務必引用模式(如果需要),以防止 shell 擴充套件萬用字元。
透過 pg_extension_config_dump
註冊的任何配置關係都將包含在轉儲中,如果其擴充套件由 --extension
指定。
當指定 -e
時,pg_dump 不會嘗試轉儲所選擴充套件可能依賴的任何其他資料庫物件。因此,無法保證僅將特定擴充套件轉儲的結果成功還原到乾淨的資料庫中。
-E 編碼
--encoding=編碼
以指定的字元集編碼建立轉儲。預設情況下,轉儲以資料庫編碼建立。(獲得相同結果的另一種方法是將 PGCLIENTENCODING
環境變數設定為所需的轉儲編碼。)支援的編碼在 第 23.3.1 節 中描述。
-f 檔案
--file=檔案
將輸出傳送到指定的檔案。對於基於檔案的輸出格式,可以省略此引數,在這種情況下將使用標準輸出。但是,對於目錄輸出格式,必須提供此引數,在這種情況下,它指定目標目錄而不是檔案。在這種情況下,目錄將由 pg_dump
建立,並且必須預先不存在。
-F format
--format=format
選擇輸出的格式。格式
可以是以下之一
p
plain
輸出純文字SQL指令碼檔案(預設)。
c
custom
輸出適合輸入到 pg_restore 的自定義格式歸檔。與目錄輸出格式一起,這是最靈活的輸出格式,因為它允許在恢復期間手動選擇和重新排序歸檔項。此格式預設也已壓縮。
d
directory
輸出適合輸入到 pg_restore 的目錄格式歸檔。這將建立一個目錄,其中每個表和大物件都有一個對應的檔案,還有一個所謂的目錄檔案(Table of Contents),以機器可讀的格式描述了轉儲的物件,pg_restore 可以讀取它。目錄格式歸檔可以使用標準的 Unix 工具進行操作;例如,未壓縮歸檔中的檔案可以使用 gzip、lz4 或 zstd 工具進行壓縮。此格式預設使用 gzip
壓縮,並且還支援並行轉儲。
t
tar
輸出適合輸入到 pg_restore 的 tar
格式歸檔。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 模式
--schema=模式
僅轉儲與 模式
匹配的模式;這將同時選擇模式本身及其包含的所有物件。當未指定此選項時,將轉儲目標資料庫中的所有非系統模式。可以透過編寫多個 -n
開關來選擇多個模式。模式
引數被解釋為與 psql 的 \d
命令使用的規則相同的模式(請參閱 模式),因此透過在模式中寫入萬用字元也可以選擇多個模式。使用萬用字元時,請務必引用模式(如果需要),以防止 shell 擴充套件萬用字元;請參閱下面的 示例。
當指定 -n
時,pg_dump 不會嘗試轉儲所選模式可能依賴的任何其他資料庫物件。因此,無法保證僅將特定模式轉儲的結果成功還原到乾淨的資料庫中。
當指定 -n
時,不會轉儲大物件等非模式物件。您可以使用 --large-objects
開關將大物件添加回轉儲中。
-N 模式
--exclude-schema=模式
不要轉儲與 模式
匹配的任何模式。模式的解釋方式與 -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
或 --statistics-only
一起使用。它與指定 --section=pre-data --section=post-data
類似,但由於歷史原因並不完全相同。
(不要將其與 --schema
選項混淆,後者在不同含義上使用了“schema”一詞。)
要僅排除資料庫中一部分表的表資料,請參閱 --exclude-table-data
。
-S username
--superuser=username
指定在使用停用觸發器時要使用的超級使用者使用者名稱。這僅在使用了 --disable-triggers
時才相關。(通常,最好省略此項,而是以超級使用者身份啟動生成的指令碼。)
-t 模式
--table=模式
僅轉儲名稱與 模式
匹配的表。可以透過編寫多個 -t
開關來選擇多個表。模式
引數被解釋為與 psql 的 \d
命令使用的規則相同的模式(請參閱 模式),因此透過在模式中寫入萬用字元也可以選擇多個表。使用萬用字元時,請務必引用模式(如果需要),以防止 shell 擴充套件萬用字元;請參閱下面的 示例。
除了表之外,此選項還可用於轉儲匹配的檢視、物化檢視、外部表和序列的定義。它不會轉儲檢視或物化檢視的內容,並且只有在使用 --include-foreign-data
指定了相應的外部伺服器時,才會轉儲外部表的內容。
當使用 -t
時,-n
和 -N
開關無效,因為無論這些開關如何,都會轉儲由 -t
選擇的表,而不會轉儲非表物件。
當指定 -t
時,pg_dump 不會嘗試轉儲所選表可能依賴的任何其他資料庫物件。因此,無法保證僅將特定錶轉儲的結果成功還原到乾淨的資料庫中。
-T 模式
--exclude-table=模式
不要轉儲與 模式
匹配的任何表。模式的解釋方式與 -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 級別
-Z 方法
[:細節
]--compress=級別
--compress=方法
[:細節
]指定要使用的壓縮方法和/或壓縮級別。壓縮方法可以設定為 gzip
、lz4
、zstd
或 none
(無壓縮)。可以選擇性地指定壓縮詳細資訊字串。如果詳細資訊字串是整數,則指定壓縮級別。否則,它應該是一個由逗號分隔的專案列表,每個專案形式為 關鍵字
或 關鍵字=值
。目前,支援的關鍵字是 level
和 long
。
如果未指定壓縮級別,則將使用預設壓縮級別。如果僅指定級別而未提及演算法,則當級別大於 0
時將使用 gzip
壓縮,當級別為 0
時則不進行壓縮。
對於自定義和目錄歸檔格式,此選項指定對各個表資料段進行壓縮,預設使用 gzip
以中等級別進行壓縮。對於純文字輸出,設定非零壓縮級別將導致整個輸出檔案被壓縮,如同透過 gzip、lz4 或 zstd 進行過管道傳輸一樣;但預設情況下不進行壓縮。使用 zstd 壓縮時,long
模式可能會提高壓縮率,但會增加記憶體使用。
tar 歸檔格式目前根本不支援壓縮。
--binary-upgrade
此選項供就地升級實用程式使用。不推薦或不支援將其用於其他目的。該選項的行為可能在未來的版本中更改,恕不另行通知。
--column-inserts
--attribute-inserts
以帶有顯式列名的 INSERT
命令(INSERT INTO
)的形式轉儲資料。這將使恢復速度非常慢;它主要用於製作可以載入到非 PostgreSQL 資料庫中的轉儲。恢復期間的任何錯誤只會導致有問題的 表
(列
, ...) VALUES ...INSERT
中的行丟失,而不是整個表內容丟失。
--disable-dollar-quoting
此選項停用函式體中使用美元引號,並強制使用 SQL 標準字串語法對其進行引用。
--disable-triggers
此選項僅在建立包含資料但不包含模式的轉儲時相關。它指示 pg_dump 在恢復資料期間包含臨時停用目標表上觸發器的命令。如果您在表上有參照完整性檢查或其他觸發器,但不想在資料恢復期間呼叫它們,請使用此選項。
目前,為 --disable-triggers
發出的命令必須以超級使用者身份執行。因此,您還應使用 -S
指定超級使用者名稱,或者最好注意以超級使用者身份啟動生成的指令碼。
當發出歸檔(非文字)輸出檔案時,此選項將被忽略。對於歸檔格式,可以在呼叫 pg_restore
時指定該選項。
--enable-row-security
此選項僅在轉儲具有行安全策略的表的內容時相關。預設情況下,pg_dump 將 row_security 設定為關閉,以確保從表中轉儲所有資料。如果使用者沒有足夠的許可權繞過行安全策略,則會引發錯誤。此引數指示 pg_dump 將 row_security 設定為開啟,從而允許使用者轉儲他們有權訪問的表內容的各個部分。
請注意,如果您使用此選項,您可能還希望轉儲為 INSERT
格式,因為 COPY FROM
在恢復期間不支援行安全策略。
--exclude-extension=模式
不要轉儲與 模式
匹配的任何擴充套件。模式的解釋方式與 -e
相同。--exclude-extension
可以多次給出,以排除與多個模式中的任何一個匹配的擴充套件。
當同時給出 -e
和 --exclude-extension
時,行為是僅轉儲至少匹配一個 -e
開關但不匹配任何 --exclude-extension
開關的擴充套件。如果 --exclude-extension
出現在沒有 -e
的情況下,那麼與 --exclude-extension
匹配的擴充套件將從正常的轉儲中排除。
--exclude-table-and-children=模式
這與 -T
/--exclude-table
選項相同,但它還排除了與 模式
匹配的表及其任何分割槽或繼承的子表。
--exclude-table-data=模式
不要轉儲與 模式
匹配的任何表的任何資料。模式的解釋方式與 -t
相同。--exclude-table-data
可以多次給出,以排除與多個模式中的任何一個匹配的表。此選項對於在需要某個特定表的定義但不需要其中資料時非常有用。
要排除資料庫中所有表的 D資料,請參閱 --schema-only
或 --statistics-only
。
--exclude-table-data-and-children=模式
這與 --exclude-table-data
選項相同,但它還排除了與 模式
匹配的表以及這些表的任何分割槽或繼承的子表的資料。
--extra-float-digits=數字
轉儲浮點資料時使用指定的 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
:匹配 模式
的任何表的表資料。此功能類似於 --exclude-table-data
選項。此關鍵字只能與 exclude
關鍵字一起使用。
table_data_and_children
:匹配 模式
的任何表的表資料,以及這些表的任何分割槽或繼承的子表的資料。此功能類似於 --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
在轉儲表分割槽的 D資料時,使 COPY
或 INSERT
語句指向包含它的分割槽層次結構的根,而不是分割槽本身。這會導致在載入資料時為每一行重新確定適當的分割槽。當在行不總是落入與原始伺服器相同的分割槽中的伺服器上恢復資料時,這可能很有用。例如,如果分割槽列是 text 型別,並且兩個系統對用於對分割槽列進行排序的排序規則有不同的定義,則可能會發生這種情況。
--lock-wait-timeout=超時
不要永遠等待在轉儲開始時獲取共享表鎖。相反,如果在指定的 超時
內無法鎖定表,則失敗。超時可以是 SET statement_timeout
接受的任何格式。(允許的格式因您從中轉儲的伺服器版本而異,但所有版本都接受以毫秒為單位的整數。)
--no-comments
不要轉儲 COMMENT
命令。
--no-data
不要轉儲 D資料。
--no-policies
不要轉儲行安全策略。
--no-publications
不要轉儲釋出。
--no-schema
不要轉儲模式(資料定義)。
--no-security-labels
不要轉儲安全標籤。
--no-statistics
不要轉儲統計資訊。這是預設行為。
--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
不要轉儲未記錄表和序列的內容。此選項對是否轉儲表和序列定義(模式)沒有影響;它僅抑制轉儲表和序列 D資料。從備用伺服器轉儲時,未記錄表和序列中的 D資料始終被排除。
--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
可以防止此類問題,但代價是轉儲指令碼更難閱讀。
--restrict-key=restrict_key
使用提供的字串作為轉儲輸出中的 psql \restrict
鍵。這隻能為純文字轉儲指定,即當 --format
設定為 plain
或省略 --format
選項時。如果未指定 restrict 鍵,pg_dump 將在需要時生成一個隨機鍵。鍵只能包含字母數字字元。
此選項主要用於測試目的和其他需要可重複輸出(例如,比較轉儲檔案)的場景。不建議常規使用,因為帶有金鑰預知能力的惡意伺服器可能能夠注入任意程式碼,這些程式碼將在執行 psql 並使用轉儲輸出的機器上執行。
--rows-per-insert=行數
以 INSERT
命令(而不是 COPY
)的形式轉儲資料。控制每個 INSERT
命令的最大行數。指定的值必須是大於零的數字。恢復期間的任何錯誤只會導致有問題的 INSERT
中的行丟失,而不是整個表內容丟失。
--section=節名
僅轉儲命名節。節名可以是 pre-data
、data
或 post-data
。可以多次指定此選項以選擇多個節。預設是轉儲所有節。
資料節包含實際表資料、大物件內容、序列值以及表、物化檢視和外部表的統計資訊。後資料項包括索引、觸發器、規則、索引統計資訊以及除已驗證的檢查和非空約束之外的約束的定義。預資料項包括所有其他資料定義項。
--sequence-data
在轉儲中包含序列資料。這是預設行為,除非指定了 --no-data
、--schema-only
或 --statistics-only
。
--serializable-deferrable
使用 serializable
事務進行轉儲,以確保使用的快照與後續資料庫狀態一致;但透過等待事務流中的一個點來做到這一點,這樣就不會有轉儲失敗或導致其他事務回滾的風險 serialization_failure
。有關事務隔離和併發控制的更多資訊,請參閱 第 13 章。
此選項對於僅用於災難恢復的轉儲沒有好處。它可能有助於用於載入資料庫副本以進行報告或其他只讀負載共享的轉儲,同時原始資料庫繼續被更新。沒有它,轉儲可能反映一個與任何事務的序列執行都不一致的狀態。例如,如果使用批處理處理技術,一個批次在轉儲中可能顯示為已關閉,但批次中的所有項都沒有出現。
如果沒有活動讀寫事務在 pg_dump 啟動時啟用,此選項將沒有區別。如果存在活動讀寫事務,轉儲的開始可能會延遲 indeterminate 時間。一旦執行,無論是否有開關,效能都是相同的。
--snapshot=快照名
在對資料庫進行轉儲時,使用指定的同步快照(請參閱 表 9.100 以獲取更多詳細資訊)。
此選項對於需要將轉儲與邏輯複製槽(請參閱 第 47 章)或與併發會話同步非常有用。
在並行轉儲的情況下,將使用此選項定義的快照名稱,而不是獲取新快照。
--statistics
轉儲統計資訊。
--statistics-only
僅轉儲統計資訊,而不轉儲模式(資料定義)或 D資料。轉儲表、物化檢視、外部表和索引的統計資訊。
--strict-names
要求每個擴充套件(-e
/--extension
)、模式(-n
/--schema
)和表(-t
/--table
)模式都能匹配資料庫中至少一個要轉儲的擴充套件/模式/表。這同樣適用於與 --filter
一起使用的過濾器。請注意,如果任何擴充套件/模式/表模式均未找到匹配項,pg_dump 將生成一個錯誤,即使沒有 --strict-names
。
此選項對 --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=模式
這與 -t
/--table
選項相同,但它還包括與 模式
匹配的表及其任何分割槽或繼承的子表。
--use-set-session-authorization
輸出 SQL 標準 SET SESSION AUTHORIZATION
命令,而不是 ALTER OWNER
命令來確定物件所有權。這使得轉儲更符合標準,但根據轉儲物件歷史,可能無法正確恢復。此外,使用 SET SESSION AUTHORIZATION
的轉儲肯定需要超級使用者許可權才能正確恢復,而 ALTER OWNER
需要較低的許可權。
-?
--help
顯示有關 pg_dump 命令列引數的幫助,然後退出。
以下命令列選項控制資料庫連線引數。
-d dbname
--dbname=dbname
指定要連線的資料庫名稱。這等同於在命令列上將 資料庫名
指定為第一個非選項引數。資料庫名
可以是 連線字串。如果是這樣,連線字串引數將覆蓋任何衝突的命令列選項。
-h 主機
--host=主機
指定伺服器執行所在計算機的主機名。如果值以斜槓開頭,則將其用作 Unix 域套接字的目錄。預設值取自 PGHOST
環境變數(如果已設定),否則嘗試 Unix 域套接字連線。
-p 埠
--port=埠
指定伺服器正在監聽連線的 TCP 埠或本地 Unix 域套接字副檔名。預設值為 PGPORT
環境變數(如果已設定),或者編譯時預設值。
-U 使用者名稱
--username=使用者名稱
要連線的使用者。:
-w
--no-password
絕不發出密碼提示。如果伺服器需要密碼身份驗證且密碼不可用(例如透過 .pgpass
檔案),則連線嘗試將失敗。此選項在沒有使用者在場輸入密碼的批處理作業和指令碼中很有用。
-W
--password
強制 pg_dump 在連線到資料庫之前提示輸入密碼。
此選項永遠不是必需的,因為如果伺服器要求密碼認證,pg_dump 會自動提示輸入密碼。但是,pg_dump 會浪費一次連線嘗試來確定伺服器需要密碼。在某些情況下,鍵入 -W
以避免額外的連線嘗試是值得的。
--role=rolename
指定一個角色名,用於建立轉儲。此選項會導致 pg_dump 在連線到資料庫後發出 SET ROLE
角色名
命令。當認證使用者(由 -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 會發出命令在插入 D資料之前停用使用者表上的觸發器,然後在 D資料插入之後發出命令重新啟用它們。如果在中間停止恢復,系統目錄可能會處於錯誤的狀態。
如果指定了 --statistics
,pg_dump
將在生成的轉儲檔案中包含大部分最佳化器統計資訊。但是,某些統計資訊可能不包含在內,例如使用 CREATE STATISTICS 顯式建立的統計資訊或擴充套件新增的自定義統計資訊。因此,在從轉儲檔案恢復後執行 ANALYZE
以確保最佳效能可能很有用;有關更多資訊,請參閱 第 24.1.3 節 和 第 24.1.6 節。
因為 pg_dump 用於將 D資料傳輸到較新版本的 PostgreSQL,所以 pg_dump 的輸出可以載入到比 pg_dump 版本更新的 PostgreSQL 伺服器版本中。pg_dump 也可以轉儲比其自身版本舊的 PostgreSQL 伺服器。(目前支援版本 9.2 及以上版本。)但是,pg_dump 不能轉儲比其自身主版本新的 PostgreSQL 伺服器;它會拒絕嘗試,以免造成無效轉儲。此外,不能保證 pg_dump 的輸出可以載入到舊主版本的伺服器中——即使轉儲是從該版本伺服器獲取的。將轉儲檔案載入到舊伺服器可能需要手動編輯轉儲檔案以刪除舊伺服器無法識別的語法。在跨版本情況下,建議使用 --quote-all-identifiers
選項,因為它可以防止不同 PostgreSQL 版本中保留字列表不同而引起的問題。
在轉儲邏輯複製訂閱時,pg_dump 將生成 CREATE SUBSCRIPTION
命令,這些命令使用 connect = false
選項,以便恢復訂閱不會建立遠端連線以建立複製槽或進行初始表複製。這樣,就可以在不需要網路訪問遠端伺服器的情況下恢復轉儲。然後由使用者以適當的方式重新啟用訂閱。如果涉及的主機已更改,則可能需要更改連線資訊。在開始新的完整表複製之前,截斷目標表也可能是合適的。如果使用者打算在重新整理期間複製初始 D資料,則必須使用 two_phase = false
建立槽。初始同步之後,如果訂閱最初是使用 two_phase = true
選項建立的,則訂閱方會自動啟用 two_phase
選項。
通常建議在從純文字 pg_dump 指令碼恢復資料庫時使用 -X
(--no-psqlrc
)選項,以確保乾淨的恢復過程並防止與非預設 psql 配置發生潛在衝突。
要轉儲名為 mydb
的資料庫到 SQL 指令碼檔案
$
pg_dump mydb > db.sql
要將這樣的指令碼重新載入到名為 newdb
的(剛建立的)資料庫中
$
psql -X -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
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。