pg_dump
pg_dump是PolarDB PostgreSQL版(兼容Oracle)提供的一種邏輯備份工具,用于將集群中的單個(gè)數(shù)據(jù)庫備份為腳本文件或其他存檔文件。
簡介
pg_dump用于備份單個(gè)數(shù)據(jù)庫。即使當(dāng)前數(shù)據(jù)庫正在被訪問,也會(huì)對正在訪問的數(shù)據(jù)進(jìn)行一致的備份,并且在執(zhí)行備份時(shí)不會(huì)阻止其他用戶訪問數(shù)據(jù)庫(讀取或?qū)懭耄8嘣斍檎垍⒁?a class="xref" target="_blank" >pg_dump官網(wǎng)。
PolarTools中的pg_dump與社區(qū)版本的pg_dump存在差異,PolarTools中的pg_dump針對PolarDB PostgreSQL版(兼容Oracle)進(jìn)行了適配。使用社區(qū)版本的pg_dump可能會(huì)出現(xiàn)未知異常或備份的對象數(shù)據(jù)不完整等情況。
備份文件格式
腳本文件:腳本文件為純文本文件,其中包含將數(shù)據(jù)庫重建到備份時(shí)狀態(tài)的SQL命令。
存檔文件:存檔文件必須和pg_restore配合使用來重建數(shù)據(jù)庫。
輸出文件格式主要包括自定義格式-Fc、目錄格式-Fd和tar格式的存檔文件-Ft。其中-Fc和-Fd允許對所有存檔項(xiàng)目進(jìn)行選擇和重新排序,且默認(rèn)為壓縮格式的文件。-Ft不是壓縮文件,并且我們在恢復(fù)數(shù)據(jù)時(shí)不支持重新排序。
說明目錄格式是唯一支持并行備份的格式。
當(dāng)與其中一種存檔文件結(jié)合使用時(shí),pg_dump可用于備份整個(gè)數(shù)據(jù)庫。pg_restore可用于檢查存檔或選擇哪些部分需要被恢復(fù)。
語法
pg_dump [connection-option...] [option...] [dbname]
表 1. 參數(shù)說明
參數(shù) | 描述 |
connection-option | 控制數(shù)據(jù)庫連接參數(shù)的命令行選項(xiàng)。詳情請參見connection-option(控制數(shù)據(jù)庫連接參數(shù)命令行選項(xiàng))。 |
option | 控制輸出內(nèi)容和格式的命令行選項(xiàng)。詳情請參見option(控制輸出內(nèi)容和格式的命令行選項(xiàng))。 |
dbname | 需要備份的數(shù)據(jù)庫名稱。 |
表 2. connection-option(控制數(shù)據(jù)庫連接參數(shù)命令行選項(xiàng))
命令行選項(xiàng) | 描述 |
-d dbname即--dbname=dbname | 指定要連接的數(shù)據(jù)庫的名稱。 |
-h host即--host=host | 指定運(yùn)行服務(wù)器的計(jì)算機(jī)的主機(jī)名。如果該值以斜杠開頭,則將其用作Unix域套接字的目錄,默認(rèn)值為PGHOST環(huán)境變量。 |
-p port即--port=port | 指定服務(wù)器正在偵聽連接的TCP端口或本地Unix域套接字文件擴(kuò)展名。默認(rèn)放在PGPORT環(huán)境變量中,否則使用程序中的默認(rèn)值。 |
-U username即--username=username | 需要連接的用戶名。 |
-w即--no-password | 表示pg_dump在連接數(shù)據(jù)庫時(shí)不提示輸入密碼。 |
-W即--password | 表示pg_dump在連接數(shù)據(jù)庫時(shí)提示輸入密碼。 說明 此選項(xiàng)為非必選項(xiàng)。 |
--role=rolename | 指定用于創(chuàng)建備份的角色名。 |
表 3. option(控制輸出內(nèi)容和格式的命令行選項(xiàng))
命令行選項(xiàng) | 描述 |
dbname | 需要備份的數(shù)據(jù)庫的名稱。如果未指定,則使用環(huán)境變量PGDATABASE。 |
-a即--data-only | 只備份數(shù)據(jù),不備份結(jié)構(gòu)。 說明 此選項(xiàng)備份表數(shù)據(jù)、大型對象和序列值。 |
-b即--blobs | 備份時(shí)默認(rèn)包含大對象。當(dāng)指定了--schema、-table或--schema only時(shí),備份將不包含大對象。 重要 blob被視為數(shù)據(jù),因此在備份時(shí)使用--data only將包含數(shù)據(jù),使用--schema only則不包含數(shù)據(jù)。 |
-B即--no-blobs | 排除備份中的大對象。 說明 當(dāng)同時(shí)出現(xiàn)-b和-B時(shí),備份將包含大對象。 |
-c即--clean | 在執(zhí)行創(chuàng)建數(shù)據(jù)庫對象命令之前刪除數(shù)據(jù)庫對象。為避免在恢復(fù)數(shù)據(jù)庫時(shí)產(chǎn)生錯(cuò)誤信息,建議在恢復(fù)數(shù)據(jù)庫時(shí)指定--if exists。 說明 此選項(xiàng)僅適用于腳本文件。對于存檔文件,可以在調(diào)用pg_restore時(shí)指定該選項(xiàng)。 |
-C即--create | 創(chuàng)建數(shù)據(jù)庫并重新連接到新創(chuàng)建的數(shù)據(jù)庫。如果指定了--clean,則腳本將刪除并重新創(chuàng)建目標(biāo)數(shù)據(jù)庫,然后再重新連接到該數(shù)據(jù)庫。 如果指定了--create命令行,且未指定--no-acl。備份數(shù)據(jù)時(shí)將包含數(shù)據(jù)庫的注釋、數(shù)據(jù)庫的配置信息以及數(shù)據(jù)庫本身的訪問權(quán)限信息。 說明 此選項(xiàng)僅適用于腳本文件。對于存檔文件,可以在調(diào)用pg_restore時(shí)指定該選項(xiàng)。 |
-E encoding即--encoding=encoding | 以指定的字符集編碼創(chuàng)建備份。默認(rèn)情況下,以當(dāng)前需要備份的數(shù)據(jù)庫編碼創(chuàng)建備份,您也可以將環(huán)境變量PGCLIENTENCODING的值設(shè)置為想要的備份編碼。 |
-F format即--format=format | 備份格式。可選以下任一格式:
|
-f file即--file=file | 將備份數(shù)據(jù)發(fā)送到指定的文件。
|
-j njobs即--jobs=njobs | 通過同時(shí)備份njobs個(gè)表來并行運(yùn)行備份。需要將此選項(xiàng)與目錄格式結(jié)合使用。 說明 并行備份之前,需要停止修改數(shù)據(jù)庫的進(jìn)程(DDL和DML)。 |
-n pattern即--schema=pattern | 僅備份與pattern匹配的模式。如果未指定此選項(xiàng),將備份目標(biāo)數(shù)據(jù)庫中的所有非系統(tǒng)模式。 說明
|
-N pattern即--exclude-schema=pattern | 備份除pattern之外的其他模式。 說明
|
-o即--oids | 備份對象標(biāo)識(shí)符(OID)作為每個(gè)表數(shù)據(jù)的一部分。如果您的應(yīng)用程序以某種方式引用OID列(例如在一個(gè)外鍵約束中引用OID列),請使用此選項(xiàng)。否則,不使用此選項(xiàng)。 |
-O即--no-owner | 匹配原始數(shù)據(jù)庫時(shí),不需要設(shè)置對象的所有權(quán)。 說明 此選項(xiàng)僅適用于腳本文件。對于存檔文件,可以在調(diào)用pg_restore時(shí)指定該選項(xiàng)。 |
-s即--schema-only | 只備份對象模式,不備份數(shù)據(jù)。 |
-S username即--superuser=username | 禁用觸發(fā)器時(shí)使用的超級(jí)用戶名。僅在使用--disable-triggers時(shí)才使用該選項(xiàng)。 |
-t pattern即--table=pattern | 只備份與pattern匹配的表。可以通過編寫多個(gè)-t來選擇多張表,也可以通過在模式中寫入通配符來選擇多張表。 說明 指定-t時(shí),pg_dump不會(huì)嘗試備份所選表可能依賴的任何其他數(shù)據(jù)庫對象。因此,不能保證備份特定表后能夠成功地將數(shù)據(jù)恢復(fù)到空數(shù)據(jù)庫中。 |
-T pattern即--exclude-table=pattern | 不備份匹配pattern的表。可以多次指定-T來排除與多個(gè)模式匹配的表。 說明
|
-v即--verbose | 指定詳細(xì)模式。 |
-V即--version | 打印pg_dump版本并退出。 |
-x即--no-privileges或--no-acl | 取消備份訪問權(quán)限(grant或revoke命令)。 |
-Z 0..9即--compress=0..9 | 指定需要使用的壓縮級(jí)別。0表示未壓縮。 說明
|
--column-inserts和--attribute-inserts | 將數(shù)據(jù)備份為具有顯式列名的
|
--disable-dollar-quoting | 禁止對函數(shù)體使用美元引號(hào)。 |
--disable-triggers | 臨時(shí)禁用目標(biāo)表上的觸發(fā)器。此選項(xiàng)僅在創(chuàng)建數(shù)據(jù)備份時(shí)有效。使用此選項(xiàng)時(shí),需要通過-S指定一個(gè)超級(jí)用戶。 說明 此選項(xiàng)僅適用于腳本文件。對于存檔文件,可以在調(diào)用pg_restore時(shí)指定該選項(xiàng)。 |
--enable-row-security | 允許備份您有權(quán)限訪問的表的部分內(nèi)容。此選項(xiàng)僅在備份具有行安全性的表的內(nèi)容時(shí)才有效。 重要 如果使用此選項(xiàng),則可能還需要使用INSERT 進(jìn)行備份,因?yàn)榛謴?fù)數(shù)據(jù)期間的COPY FROM不支持行安全性。 |
--exclude-table-data=pattern | 不備份與pattern匹配的表數(shù)據(jù)。 可以多次指定--exclude-table-data來排除與多個(gè)模式匹配的表。 說明 如果需要排除數(shù)據(jù)庫中所有表的數(shù)據(jù),請參見--schema only。 |
--if-exists | 使用條件命令(例如,添加IF EXISTS子句)清理數(shù)據(jù)庫對象。使用時(shí)需要同時(shí)指定--clean,否則此選項(xiàng)無效。 |
--inserts | 將數(shù)據(jù)備份為INSERT命令。 重要 使用此選項(xiàng)后,如果在恢復(fù)數(shù)據(jù)時(shí)對數(shù)據(jù)進(jìn)行重新排序可能會(huì)執(zhí)行失敗。建議使用--column-inserts 。 |
--load-via-partition-root | 備份表分區(qū)的數(shù)據(jù)時(shí),使用COPY或INSERT命令。 說明 當(dāng)恢復(fù)使用此選項(xiàng)創(chuàng)建的存檔文件時(shí),建議謹(jǐn)慎使用并行恢復(fù)。 |
--lock-wait-timeout=timeout | 指定獲取共享鎖的等待時(shí)間。 |
--no-comments | 表示不備份注釋。 |
--no-publications | 表示不備份出版物。 |
--no-security-labels | 表示不備份安全標(biāo)簽。 |
--no-subscriptions | 表示不備份訂閱。 |
--no-sync | 表示不需要等待所有文件均安全寫入磁盤即返回?cái)?shù)據(jù)。 |
--no-synchronized-snapshots | 表示在服務(wù)器上可以運(yùn)行pg_dump -j。 |
--no-tablespaces | 表示在默認(rèn)的表空間中創(chuàng)建所有對象。 說明 此選項(xiàng)僅適用于腳本文件。對于存檔文件,可以在調(diào)用pg_restore時(shí)指定該選項(xiàng)。 |
--no-unlogged-table-data | 表示不備份未標(biāo)記表的內(nèi)容。 |
--quote-all-identifiers | 表示強(qiáng)制引用所有標(biāo)識(shí)符。 |
--rows-per-insert=nrows | 控制數(shù)據(jù)庫備份為INSERT命令時(shí)的最大行數(shù)。 |
--section=sectionname | 表示只備份指定的section。section的名稱可以是pre-data、data或post-data,可以多次指定此選項(xiàng)以選擇多個(gè)section,默認(rèn)備份所有section。 說明
|
--serializable-deferrable | 表示對備份使用一個(gè)可序列化事務(wù)。 說明
|
--snapshot=snapshotname | 表示在備份數(shù)據(jù)庫時(shí)使用指定的同步快照。 |
--strict-names | 表示每個(gè)模式(-n/ --schema)和表(-t/ --table)限定符至少要匹配備份的數(shù)據(jù)庫中的一個(gè)模式和表。 說明
|
--use-set-session-authorization | 表示輸出SQL標(biāo)準(zhǔn)的SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令。 |
-?即--help | 顯示關(guān)于pg_dump命令行的幫助信息。 |
注意事項(xiàng)
當(dāng)選擇了僅用作數(shù)據(jù)備份且使用了--disable triggers選項(xiàng)的表時(shí),pg_dump會(huì)在插入數(shù)據(jù)之前發(fā)出禁用用戶表觸發(fā)器的命令,插入數(shù)據(jù)后發(fā)出重新啟用觸發(fā)器的命令。如果恢復(fù)中途被停止,系統(tǒng)目錄可能會(huì)停留在一種錯(cuò)誤狀態(tài)。
備份文件恢復(fù)后,可運(yùn)行ANALYZE確保最佳性能。
當(dāng)備份邏輯復(fù)制訂閱時(shí),pg_dump將生成使用connect=false選項(xiàng)的CREATE SUBSCRIPTION命令。如果涉及的主機(jī)已更改,則可能需要更改連接信息,在啟動(dòng)新的完整表拷貝之前需截?cái)嗄繕?biāo)表。
pg_dump在內(nèi)部執(zhí)行SELECT語句時(shí),如果運(yùn)行pg_dump遇到問題,需確保能夠使用psql等工具從數(shù)據(jù)庫中查詢信息。此外,確保libpq前端庫使用的任何默認(rèn)連接設(shè)置和環(huán)境變量都能正常使用。
pg_dump的數(shù)據(jù)庫活動(dòng)通常由統(tǒng)計(jì)收集器收集,如果不需要收集,可以通過PGOPTIONS或ALTER USER命令將參數(shù)track_counts設(shè)置為false。
示例
執(zhí)行以下命令,將名稱為
mydb
的數(shù)據(jù)庫備份到SQL腳本文件中:pg_dump mydb > db.sql
執(zhí)行以下命令,將SQL腳本重新加載到名稱為
newdb
的(新創(chuàng)建的)數(shù)據(jù)庫中:psql -d newdb -f db.sql
執(zhí)行以下命令,將數(shù)據(jù)庫備份到自定義格式的存檔文件中:
pg_dump -Fc mydb > db.dump
執(zhí)行以下命令,將數(shù)據(jù)庫備份到目錄格式的存檔文件中:
pg_dump -Fd mydb -f dumpdir
執(zhí)行以下命令,將數(shù)據(jù)庫與5個(gè)輔助作業(yè)并行備份到目錄格式的存檔文件中:
pg_dump -Fd mydb -j 5 -f dumpdir
執(zhí)行以下命令,將存檔文件重新加載到名稱為
newdb
的(新創(chuàng)建的)數(shù)據(jù)庫中:pg_restore -d newdb db.dump
執(zhí)行以下命令,將存檔文件重新加載到備份文件的同一數(shù)據(jù)庫中,并清除該數(shù)據(jù)庫的當(dāng)前內(nèi)容:
pg_restore -d postgres --clean --create db.dump
執(zhí)行以下命令,備份名稱為
mytab
的單個(gè)表:pg_dump -t mytab mydb > db.sql
執(zhí)行以下命令,備份
detroit
模式中名稱以emp開頭的所有表(名稱為employee_log
的表除外):pg_dump -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql
執(zhí)行以下命令,備份名稱以east或west開頭并以gsm結(jié)尾的所有模式(不包括名稱中含test的任何模式):
pg_dump -n 'east*gsm' -n 'west*gsm' -N '*test*' mydb > db.sql
執(zhí)行以下命令,使用正則表達(dá)式表示法來合并開關(guān):
pg_dump -n '(east|west)*gsm' -N '*test*' mydb > db.sql
執(zhí)行以下命令,備份除名稱以ts_開頭的表以外的所有數(shù)據(jù)庫對象:
pg_dump -T 'ts_*' mydb > db.sql
如果需要在-t和相關(guān)開關(guān)中指定大寫或混合大小寫的名稱,您需要通過雙引號(hào)引用該名稱,否則它將被折疊為小寫。但是雙引號(hào)對于Shell命令來說是特殊的,因此必須反過來引用它們。因此,如果要轉(zhuǎn)儲(chǔ)大小寫混合名稱的單個(gè)表,請執(zhí)行以下命令:
pg_dump -t "\"MixedCaseName\"" mydb > mytab.sql