pg_dumpall — 將 PostgreSQL 資料庫叢集匯出到一個指令檔
pg_dumpall
[connection-option
...] [option
...]
pg_dumpall 是一個工具程式,用於將叢集中所有 PostgreSQL 資料庫寫出(“傾印”)到一個指令檔中。該指令檔包含SQL指令,可以作為 psql 的輸入來還原資料庫。它透過對叢集中的每個資料庫呼叫 pg_dump 來實現此目的。pg_dumpall 還會匯出所有資料庫共有的全域物件,即資料庫角色、表格空間和組態參數的權限授予。(pg_dump 不會儲存這些物件。)
由於 pg_dumpall 從所有資料庫讀取表格,因此您很可能需要以資料庫超級使用者身分連線,才能產生完整的匯出。此外,您還需要超級使用者權限才能執行儲存的指令檔,才能被允許新增角色和建立資料庫。
SQL 指令檔將寫入標準輸出。使用 -f
/--file
選項或 shell 運算子將其重新導向到檔案中。
pg_dumpall 需要多次連線到 PostgreSQL 伺服器(每個資料庫一次)。如果您使用密碼驗證,它每次都會要求輸入密碼。在這種情況下,擁有 ~/.pgpass
檔案會很方便。請參閱 第 32.16 節 以取得更多資訊。
以下命令列選項控制輸出的內容和格式。
-a
--data-only
僅匯出資料,不匯出結構描述(資料定義)。
-c
--clean
發出 SQL 指令以在重新建立之前 DROP
所有已匯出的資料庫、角色和表格空間。當還原是要覆寫現有叢集時,此選項很有用。如果任何物件不存在於目標叢集中,則在還原期間將報告可忽略的錯誤訊息,除非也指定了 --if-exists
。
-E encoding
--encoding=encoding
以指定的字元集編碼建立匯出。預設情況下,匯出以資料庫編碼建立。(獲得相同結果的另一種方法是將 PGCLIENTENCODING
環境變數設定為所需的匯出編碼。)
-f filename
--file=filename
將輸出傳送到指定的檔案。如果省略此選項,則使用標準輸出。
--filter=filename
指定一個檔案名稱,從中讀取要從匯出中排除的資料庫的模式。這些模式的解譯方式與 --exclude-database
相同。若要從 STDIN
讀取,請使用 -
作為檔案名稱。可以結合 --exclude-database
來指定 --filter
選項以排除資料庫,並且可以多次指定以用於多個篩選檔案。
該檔案列出每列一個資料庫模式,格式如下
exclude database PATTERN
以 #
開頭的行被視為註解並被忽略。註解也可以放在物件模式列之後。空白行也會被忽略。請參閱 模式 以了解如何在模式中執行引號。
-g
--globals-only
僅匯出全域物件(角色和表格空間),不匯出資料庫。
-O
--no-owner
不要輸出將物件的所有權設定為與原始資料庫相符的指令。預設情況下,pg_dumpall 發出 ALTER OWNER
或 SET SESSION AUTHORIZATION
陳述式,以設定建立的結構描述元素的所有權。除非指令檔由超級使用者(或與擁有指令檔中所有物件的使用者相同的使用者)啟動,否則這些陳述式將在執行指令檔時失敗。若要建立可以由任何使用者還原,但會讓該使用者擁有所有物件的指令檔,請指定 -O
。
-r
--roles-only
僅匯出角色,不匯出資料庫或表格空間。
-s
--schema-only
只傾印物件定義(綱要),不傾印資料。
-S username
--superuser=username
指定停用觸發程序時要使用的超級使用者名稱。 只有在使用 --disable-triggers
時才相關。(通常,最好省略此選項,而是以超級使用者身分啟動產生的腳本。)
-t
--tablespaces-only
僅傾印表空間,不傾印資料庫或角色。
-v
--verbose
指定詳細模式。 這會使 pg_dumpall 將開始/停止時間輸出到傾印檔案,並將進度訊息輸出到標準錯誤。 重複此選項會使額外的除錯層級訊息出現在標準錯誤上。 此選項也會傳遞到 pg_dump。
-V
--version
列印 pg_dumpall 版本並結束。
-x
--no-privileges
--no-acl
防止傾印存取權限(grant/revoke 指令)。
--binary-upgrade
此選項供就地升級工具使用。 不建議或支援將其用於其他目的。 此選項的行為可能會在未來的版本中更改,恕不另行通知。
--column-inserts
--attribute-inserts
將資料傾印為具有明確欄位名稱的 INSERT
指令 (INSERT INTO
)。 這會使還原速度非常慢; 它主要用於製作可以載入到非 PostgreSQL 資料庫中的傾印。table
(column
, ...) VALUES ...
--disable-dollar-quoting
此選項會停用對函數主體使用美元符號引號,並強制使用 SQL 標準字串語法來引號它們。
--disable-triggers
此選項僅在建立僅資料傾印時相關。 它指示 pg_dumpall 包含在還原資料時暫時停用目標資料表上的觸發程序的指令。 如果您的資料表上有參考完整性檢查或其他觸發程序,而您不希望在資料還原期間調用它們,請使用此選項。
目前,為 --disable-triggers
發出的指令必須以超級使用者身分執行。 因此,您也應該使用 -S
指定超級使用者名稱,或最好小心以超級使用者身分啟動產生的腳本。
--exclude-database=pattern
不要傾印名稱與 pattern
匹配的資料庫。 可以透過編寫多個 --exclude-database
交換器來排除多個模式。 pattern
參數被解釋為一個模式,其規則與 psql 的 \d
指令使用的規則相同(請參閱 模式),因此也可以透過在模式中編寫萬用字元來排除多個資料庫。 使用萬用字元時,請小心引用模式,以防止 shell 萬用字元擴充。
--extra-float-digits=ndigits
傾印浮點資料時,請使用指定的 extra_float_digits 值,而不是最大可用精度。 為備份目的而進行的常規傾印不應使用此選項。
--if-exists
使用 DROP ... IF EXISTS
指令來刪除 --clean
模式中的物件。 這會抑制可能報告的 “不存在” 錯誤。 除非也指定了 --clean
,否則此選項無效。
--inserts
將資料傾印為 INSERT
指令(而不是 COPY
)。 這會使還原速度非常慢; 它主要用於製作可以載入到非 PostgreSQL 資料庫中的傾印。 請注意,如果您重新排列了欄位順序,則還原可能會完全失敗。 --column-inserts
選項更安全,但速度甚至更慢。
--load-via-partition-root
傾印資料表分割區的資料時,使 COPY
或 INSERT
陳述式以包含該分割區的分割層次結構的根為目標,而不是分割區本身。 這會導致在載入資料時為每一列重新確定適當的分割區。 當在伺服器上還原資料時,如果列不一定落入與原始伺服器上相同的分割區中,則此方法可能很有用。 例如,如果分割欄的類型為 text,並且兩個系統對用於對分割欄進行排序的定序具有不同的定義,則可能會發生這種情況。
--lock-wait-timeout=timeout
不要永遠等待以在傾印開始時取得共用資料表鎖定。 相反,如果無法在指定的 timeout
內鎖定資料表,則會失敗。 超時時間可以用 SET statement_timeout
接受的任何格式指定。
--no-comments
不要傾印註解。
--no-publications
不要傾印出版品。
--no-role-passwords
不要傾印角色的密碼。 還原後,角色將具有空密碼,並且密碼驗證將始終失敗,直到設定密碼。 由於指定此選項時不需要密碼值,因此角色資訊是從目錄視圖 pg_roles
而不是 pg_authid
讀取的。 因此,如果某些安全性原則限制了對 pg_authid
的存取,此選項也會有所幫助。
--no-security-labels
不要傾印安全性標籤。
--no-subscriptions
不要傾印訂閱。
--no-sync
預設情況下,pg_dumpall
將等待所有檔案安全地寫入磁碟。 此選項使 pg_dumpall
在不等待的情況下返回,這更快,但意味著隨後的作業系統崩潰可能會使傾印損壞。 通常,此選項對於測試很有用,但不應在從生產安裝中傾印資料時使用。
--no-table-access-method
不要輸出指令來選擇資料表存取方法。 使用此選項,所有物件都將使用還原期間預設的任何資料表存取方法來建立。
--no-tablespaces
不要輸出指令來建立表空間,也不要為物件選擇表空間。 使用此選項,所有物件都將在還原期間預設的任何表空間中建立。
--no-toast-compression
不要輸出指令來設定TOAST壓縮方法。使用此選項,所有欄位都會以預設的壓縮設定還原。
--no-unlogged-table-data
不要傾印未記錄表格的內容。此選項不會影響表格定義(綱要)是否傾印;它只會抑制傾印表格資料。
--on-conflict-do-nothing
新增 ON CONFLICT DO NOTHING
到 INSERT
指令。除非同時指定 --inserts
或 --column-inserts
選項,否則此選項無效。
--quote-all-identifiers
強制引用所有識別符。當從 PostgreSQL 主要版本與 pg_dumpall 不同的伺服器傾印資料庫,或當輸出旨在載入到不同主要版本的伺服器時,建議使用此選項。預設情況下,pg_dumpall 僅引用其自身主要版本中的保留字識別符。當處理可能具有稍微不同保留字集的其他版本的伺服器時,這有時會導致相容性問題。使用 --quote-all-identifiers
可以防止此類問題,但代價是傾印腳本的可讀性較差。
--rows-per-insert=nrows
將資料傾印為 INSERT
指令(而不是 COPY
)。控制每個 INSERT
指令的最大列數。指定的值必須是大於零的數字。還原期間的任何錯誤只會導致問題 INSERT
的一部分列遺失,而不是整個表格內容。
--use-set-session-authorization
輸出 SQL 標準 SET SESSION AUTHORIZATION
指令,而不是 ALTER OWNER
指令來確定物件所有權。這使得傾印更符合標準,但根據傾印中物件的歷史記錄,可能無法正確還原。
-?
--help
顯示關於 pg_dumpall 指令列引數的說明,然後結束。
以下指令列選項控制資料庫連線參數。
-d connstr
--dbname=connstr
指定用於連線到伺服器的參數,作為 連線字串;這些將覆蓋任何衝突的指令列選項。
為了與其他用戶端應用程式保持一致,該選項稱為 --dbname
,但由於 pg_dumpall 需要連線到多個資料庫,因此連線字串中的資料庫名稱將被忽略。使用 -l
選項來指定用於初始連線的資料庫名稱,這將傾印全域物件並探索應該傾印的其他資料庫。
-h host
--host=host
指定資料庫伺服器執行的機器的主機名稱。如果該值以斜線開頭,則將其用作 Unix 網域套接字的目錄。預設值取自 PGHOST
環境變數(如果已設定),否則會嘗試 Unix 網域套接字連線。
-l dbname
--database=dbname
指定要連線的資料庫名稱,用於傾印全域物件並探索應該傾印的其他資料庫。如果未指定,將使用 postgres
資料庫,如果該資料庫不存在,則將使用 template1
。
-p port
--port=port
指定伺服器監聽連線的 TCP 連接埠或本機 Unix 網域套接字檔案擴充名。預設為 PGPORT
環境變數(如果已設定),或編譯時預設值。
-U username
--username=username
要以哪個使用者名稱連線。
-w
--no-password
永遠不要發出密碼提示。如果伺服器需要密碼驗證,並且無法透過其他方式(例如 .pgpass
檔案)取得密碼,則連線嘗試將會失敗。此選項在批次作業和沒有使用者輸入密碼的腳本中很有用。
-W
--password
強制 pg_dumpall 在連線到資料庫之前提示輸入密碼。
此選項並非絕對必要,因為如果伺服器要求密碼驗證,pg_dumpall 會自動提示輸入密碼。但是,pg_dumpall 會浪費一次連線嘗試來確定伺服器是否需要密碼。在某些情況下,值得輸入 -W
以避免額外的連線嘗試。
請注意,每次要傾印的資料庫都會再次出現密碼提示。通常,設定 ~/.pgpass
檔案比依賴手動輸入密碼更好。
--role=rolename
指定用於建立傾印的角色名稱。此選項會導致 pg_dumpall 在連線到資料庫後發出 SET ROLE
rolename
指令。當經過驗證的使用者(由 -U
指定)缺乏 pg_dumpall 所需的權限,但可以切換到具有所需權限的角色時,此選項很有用。某些安裝具有禁止直接以超級使用者身份登入的策略,使用此選項可以進行傾印而不違反該策略。
PGHOST
PGOPTIONS
PGPORT
PGUSER
預設連線參數
PG_COLOR
指定是否在診斷訊息中使用顏色。可能的值為 always
、auto
和 never
。
此公用程式與大多數其他 PostgreSQL 公用程式一樣,也使用 libpq 支援的環境變數(請參閱 第 32.15 節)。
由於 pg_dumpall 在內部呼叫 pg_dump,因此某些診斷訊息將參考 pg_dump。
即使您的意圖是將傾印腳本還原到新的叢集中,--clean
選項也可能很有用。使用 --clean
授權腳本刪除並重新建立內建的 postgres
和 template1
資料庫,確保這些資料庫將保留與來源叢集中相同的屬性(例如,地區設定和編碼)。如果沒有該選項,這些資料庫將保留其現有的資料庫層級屬性,以及任何先前存在的內容。
還原後,明智的做法是在每個資料庫上執行 ANALYZE
,以便最佳化器擁有有用的統計資訊。您也可以執行 vacuumdb -a -z
來分析所有資料庫。
不應期望傾印腳本在完全沒有錯誤的情況下執行。特別是,由於腳本將為來源叢集中存在的每個角色發出 CREATE ROLE
,因此對於引導超級使用者,肯定會收到 「角色已存在」 錯誤,除非目標叢集是使用不同的引導超級使用者名稱初始化的。此錯誤是無害的,應忽略。使用 --clean
選項可能會產生關於不存在物件的額外無害錯誤訊息,儘管您可以透過新增 --if-exists
來最大限度地減少這些錯誤。
pg_dumpall 需要在還原之前存在所有需要的表空間目錄;否則,位於非預設位置的資料庫建立將會失敗。
傾印所有資料庫
$
pg_dumpall > db.out
若要從此檔案還原資料庫,您可以使用
$
psql -f db.out postgres
連接到哪個資料庫並不重要,因為 pg_dumpall 建立的腳本檔案將包含建立和連接到已儲存資料庫的適當指令。例外情況是,如果您指定了 --clean
,您必須最初連接到 postgres
資料庫;該腳本將嘗試立即刪除其他資料庫,而這對於您連接的資料庫將會失敗。
請查看 pg_dump 以取得有關可能錯誤情況的詳細資訊。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表單來回報文件問題。