PostgreSQL pg_dumpall

2021-09-13 16:15 更新

pg_dumpall — 將一個PostgreSQL數(shù)據(jù)庫集簇抽取到一個腳本文件中

大綱

pg_dumpall [connection-option...] [option...]

描述

pg_dumpall工具可以一個集簇中所有的PostgreSQL數(shù)據(jù)庫寫出到(轉儲)一個腳本文件。該腳本文件包含可以用作psql的輸入 SQL命令來恢復數(shù)據(jù)庫。它會對集簇中的每個數(shù)據(jù)庫調用pg_dump來完成該工作。pg_dumpall還轉儲對所有數(shù)據(jù)庫公用的全局對象( pg_dump 不保存這些對象),也就是說數(shù)據(jù)庫角色和表空間都會被轉儲。 目前這包括適數(shù)據(jù)庫用戶和組、表空間以及適合所有數(shù)據(jù)庫的訪問權限等屬性。

因為pg_dumpall從所有數(shù)據(jù)庫中讀取表,所以你很可能需要以一個數(shù)據(jù)庫超級用戶的身份連接以便生成完整的轉儲。同樣,你也需要超級用戶特權執(zhí)行保存下來的腳本,這樣才能增加角色和組以及創(chuàng)建數(shù)據(jù)庫。

SQL 腳本將被寫出到標準輸出。使用 -f/--file 選項或者 shell 操作符可以把它重定向到一個文件。

pg_dumpall需要多次連接到PostgreSQL服務器(每個數(shù)據(jù)庫一次)。如果你使用口令認證,可能每次都會要求口令。這種情況下使用一個~/.pgpass會比較方便。詳見第 33.15 節(jié)。

選項

下列命令行選項用于控制輸出的內容和格式。

-a
--data-only

只轉儲數(shù)據(jù),不轉儲模式(數(shù)據(jù)定義)。

-c
--clean

包括在重建數(shù)據(jù)庫之前清除(移除)它們的 SQL 命令。角色和表空間的DROP命令也會被加入進來。

-E encoding
--encoding=encoding

用指定的字符集編碼創(chuàng)建轉儲。默認情況下,轉儲使用數(shù)據(jù)庫的編碼創(chuàng)建(另一種得到相同結果的方法是設置PGCLIENTENCODING環(huán)境變量為想要的轉儲編碼)。

-f filename
--file=filename

將輸出發(fā)送到指定的文件中。如果省略,將使用標準輸出。

-g
--globals-only

只轉儲全局對象(角色和表空間),而不轉儲數(shù)據(jù)庫。

-O
--no-owner

不輸出用于設置對象所有權以符合原始數(shù)據(jù)庫的命令。默認情況下,pg_dumpall發(fā)出ALTER OWNERSET SESSION AUTHORIZATION語句來設置被創(chuàng)建的模式元素的所有權。除非腳本是由一個超級用戶(或者是擁有腳本中所有對象的同一個用戶)所運行,這些語句在腳本運行時會失敗。要使得一個腳本能被任意用戶恢復,但又不想給予該用戶所有對象的所有權,可以指定 -O。

-r
--roles-only

只轉儲角色,不轉儲數(shù)據(jù)庫和表空間。

-s
--schema-only

只轉儲對象定義(模式),不轉儲數(shù)據(jù)。

-S username
--superuser=username

指定要在禁用觸發(fā)器時使用的超級用戶的用戶名。只有使用--disable-triggers時,這個選項才相關(通常,最好省去這個選項,而作為超級用戶來啟動結果腳本來取而代之)。

-t
--tablespaces-only

只轉儲表空間,不轉儲數(shù)據(jù)庫和角色。

-v
--verbose

指定細節(jié)模式。這將導致pg_dumpall向標準錯誤輸出詳細的對象注釋以及轉儲文件的開始/停止時間,還有進度消息。它也會啟用pg_dump中的細節(jié)輸出。

-V
--version

打印pg_dumpall版本并退出。

-x
--no-privileges
--no-acl

防止轉儲訪問特權(授予/收回命令)。

--binary-upgrade

這個選項用于就地升級功能。我們不推薦也不支持把它用于其他目的。這個選項在未來的發(fā)行中可能被改變而不做通知。

--column-inserts
--attribute-inserts

將數(shù)據(jù)轉儲為帶有顯式列名的INSERT命令(INSERT INTO table (column, ...) VALUES ...)。這將使得恢復過程非常慢,這主要用于使轉儲能夠被載入到非PostgreSQL數(shù)據(jù)庫中。

--disable-dollar-quoting

這個選項禁止在函數(shù)體中使用美元符號引用,并且強制它們使用 SQL 標準字符串語法被引用。

--disable-triggers

只有在創(chuàng)建一個只轉儲數(shù)據(jù)的轉儲時,這個選項才相關。它指示pg_dumpall包括在數(shù)據(jù)被重新載入時能夠臨時禁用目標表上的觸發(fā)器的命令。如果你在表上有引用完整性檢查或其他觸發(fā)器,并且你在數(shù)據(jù)重新載入期間不想調用它們,請使用這個選項。

當前,為--disable-triggers發(fā)出的命令必須作為超級用戶來執(zhí)行。因此,你還應當使用-S指定一個超級用戶名,或者寧可作為一個超級用戶啟動結果腳本。

--exclude-database=pattern

不要轉儲名字與 pattern 匹配的數(shù)據(jù)庫??梢酝ㄟ^編寫多個--exclude-database開關來排除多個模式。 pattern參數(shù)被解釋為模式,根據(jù)psql\d命令使用的相同規(guī)則 (請參見下面的 Patterns),因此,通過在模式中編寫通配符也可以排除多個數(shù)據(jù)庫。 使用通配符時,請謹慎的引用模式,如果需要防止shell通配符擴展。

--extra-float-digits=ndigits

在轉儲浮點數(shù)據(jù)時使用extra_float_digits規(guī)定的值,而不是最大可用精度。備份目的進行的常規(guī)轉儲不使用此選項。

--if-exists

時間條件性命令(即增加一個IF EXISTS子句)來清除數(shù)據(jù)庫和其他對象。 只有同時指定了--clean時,這個選項才可用。

--inserts

將數(shù)據(jù)轉儲為INSERT命令(而不是COPY)。這將使得恢復非常慢,這主要用于使轉儲能夠被載入到非PostgreSQL數(shù)據(jù)庫中。注意如果你已經(jīng)重新安排了列序,該恢復可能會一起失敗。--column-inserts選項對于列序改變是安全的,但是會更慢。

--load-via-partition-root

在為一個分區(qū)表轉儲數(shù)據(jù)時,讓COPY語句或者INSERT語句把包含它的分區(qū)層次的根而不是分區(qū)自身作為目標。這導致在數(shù)據(jù)被裝載時,會為每一個行重新確定合適的分區(qū)。如果在一臺服務器上重新裝載數(shù)據(jù)時會出現(xiàn)行并不是總是落入到和原始服務器上相同的分區(qū)中的情況,這個選項就很有用。例如,如果分區(qū)列是文本類型并且兩個系統(tǒng)中用于排序分區(qū)列的排序規(guī)則有著不同的定義,就會發(fā)生這種情況。

--lock-wait-timeout=timeout

在轉儲的開始從不等待共享表鎖的獲得。而是在指定的timeout內不能鎖定一個表時失敗。超時時長可以用SET statement_timeout接受的任何格式指定(允許的值根據(jù)你從其轉出的服務器版本變化,但是從 7.3 以來的所有版本都接受一個整數(shù)表示的毫秒數(shù)。如果從 7.3 以前的服務器轉出,這個選項會被忽略。)。

--no-comments

不轉儲注釋。

--no-publications

不轉儲publication。

--no-role-passwords

不為角色轉儲口令。在恢復完后,角色的口令將是空口令,并且在設置口令之前口令認證都不會成功。由于指定這個選項時并不需要口令值,角色信息將從目錄視圖pg_roles而不是pg_authid中讀出。因此,如果對pg_authid的訪問被某條安全性策略所限制,那么這個選項也會有所幫助。

--no-security-labels

不轉儲安全標簽。

--no-subscriptions

不轉儲subscription。

--no-sync

默認情況下,pg_dumpall將等待所有文件被安全地寫入到磁盤。這個選項會讓pg_dumpall不做這種等待而返回,這樣會更快,但是意味著后續(xù)的操作系統(tǒng)崩潰可能留下被損壞的轉儲。通常來說,這個選項對測試有用,但不應該在從生產(chǎn)安裝中轉儲數(shù)據(jù)時使用。

--no-tablespaces

不要輸出選擇表空間的命令。通過這個選項,在恢復期間所有的對象都會被創(chuàng)建在任何作為默認的表空間中。

--no-unlogged-table-data

不轉儲非日志記錄表的內容。這個選項對于表定義(模式)是否被轉儲沒有影響,它只會限制轉儲表數(shù)據(jù)。

--on-conflict-do-nothing

添加ON CONFLICT DO NOTHINGINSERT命令。 除非--inserts--column-inserts也被規(guī)定,否則此選項不生效。

--quote-all-identifiers

強制引用所有標識符。在從一個與pg_dumpall主版本不同的PostgreSQL服務器轉儲數(shù)據(jù)庫時或者要將輸出載入到一個不同主版本的服務器時,推薦使用這個選項。默認情況下,pg_dumpall只會對為其主版本中保留詞的標識符加上引號。在與其他版本的具有不同保留詞集合的服務器交互時,這有時會導致兼容性問題。使用 --quote-all-identifiers可以阻止這類問題,但是代價是轉儲腳本會更加難讀。

--rows-per-insert=nrows

將數(shù)據(jù)轉儲為INSERT命令(而不是COPY)??刂泼總€INSERT命令的最大行數(shù)。 指定的值必須是大于零的數(shù)。重新加載期間的任何錯誤都將導致僅丟失有問題的INSERT的行,而不是整個表內容。

--use-set-session-authorization

輸出 SQL-標準的SET SESSION AUTHORIZATION命令取代ALTER OWNER命令來確定對象的所有關系。這讓該轉儲更加兼容標準,但是取決于該轉儲中對象的歷史,該轉儲可能無法正常恢復。

-?
--help

顯示有關pg_dumpall命令行參數(shù)的幫助并退出。

下列命令行選項控制數(shù)據(jù)庫連接參數(shù)。

-d connstr
--dbname=connstr

指定用于連接到服務器的參數(shù),比如連接字符串;這些將覆蓋所有沖突的命令行選項。

這個選項被稱為--dbname是為了和其他客戶端應用一致,但是因為pg_dumpall需要連接多個數(shù)據(jù)庫,連接字符串中的數(shù)據(jù)庫名將被忽略。使用-l選項指定一個數(shù)據(jù)庫,該數(shù)據(jù)庫被用于初始連接,這將轉儲全局對象并且發(fā)現(xiàn)需要轉儲哪些其他數(shù)據(jù)庫。

-h host
--host=host

指定服務器正在運行的機器的主機名。如果該值開始于一個斜線,它被用作一個 Unix 域套接字的目錄。默認是從PGHOST環(huán)境變量中取得(如果被設置),否則將嘗試一次 Unix 域套接字連接。

-l dbname
--database=dbname

指定要連接到哪個數(shù)據(jù)庫轉儲全局對象以及發(fā)現(xiàn)要轉儲哪些其他數(shù)據(jù)庫。如果沒有指定,將會使用postgres數(shù)據(jù)庫,如果postgres不存在,就使用 template1。

-p port
--port=port

指定服務器正在監(jiān)聽連接的 TCP 端口或本地 Unix 域套接字文件擴展名。默認是放在PGPORT環(huán)境變量中(如果被設置),否則使用編譯在程序中的默認值。

-U username
--username=username

要作為哪個用戶連接。

-w
--no-password

從不發(fā)出一個口令提示。如果服務器要求口令認證并且沒有其他方式提供口令(例如一個.pgpass文件),那兒連接嘗試將失敗。這個選項對于批處理任務和腳本有用,因為在其中沒有一個用戶來輸入口令。

-W
--password

強制pg_dumpall在連接到一個數(shù)據(jù)庫之前提示要求一個口令。

這個選項從來不是必須的,因為如果服務器要求口令認證,pg_dumpall將自動提示要求一個口令。但是,pg_dumpall將浪費一次連接嘗試來發(fā)現(xiàn)服務器想要一個口令。在某些情況下,值得鍵入-W來避免額外的連接嘗試。

注意對每個要被轉儲的數(shù)據(jù)庫,口令提示都會再次出現(xiàn)。通常,最好設置一個~/.pgpass文件來減少手工口令輸入。

--role=rolename

指定一個用來創(chuàng)建該轉儲的角色名。這個選項導致pg_dump在連接到數(shù)據(jù)庫后發(fā)出一個SET ROLE rolename命令。當已認證用戶(由-U指定)缺少pg_dump所需的特權但是能夠切換到一個具有所需權利的角色時,這個選項很有用。一些安裝有針對直接作為超級用戶登錄的策略,使用這個選項可以讓轉儲在不違反該策略的前提下完成。

環(huán)境

PGHOST
PGOPTIONS
PGPORT
PGUSER

默認連接參數(shù)

PG_COLOR

規(guī)定在診斷消息中是否使用顏色。可能的值為always、 auto、never。

和大部分其他PostgreSQL工具相似,這個工具也使用libpq(見第 33.14 節(jié))支持的環(huán)境變量。

注解

因為pg_dumpall在內部調用pg_dump,所以, 一些診斷消息可以參考pg_dump

即使當用戶的目的是把轉儲腳本恢復到一個空的集簇中,--clean選項也有用武之地。--clean的使用讓該腳本刪除并且重建內建的postgrestemplate1數(shù)據(jù)庫,確保這兩個數(shù)據(jù)庫保持與源集簇中相同的屬性(例如locale和編碼)。如果不用這個選項,這兩個數(shù)據(jù)庫將保持它們現(xiàn)有的數(shù)據(jù)庫級屬性以及任何已有的內容。

一旦恢復,建議在每個數(shù)據(jù)庫上運行ANALYZE,這樣優(yōu)化器就可以得到有用的統(tǒng)計信息。你也可以運行vacuumdb -a -z來分析所有數(shù)據(jù)庫。

不應該預期轉儲腳本運行到結束都不出錯。特別是由于腳本將為源集簇中已有的每一個角色發(fā)出CREATE ROLE語句,對于bootstrap超級用戶當然會得到一個role already exists錯誤,除非目標集簇用一個不同的bootstrap超級用戶名完成的初始化。這種錯誤是無害的并且應該被忽略。--clean選項的使用很可能會產(chǎn)生額外的有關于不存在對象的無害錯誤消息,不過可以通過加上 --if-exists減少這類錯誤消息。

pg_dumpall要求所有需要的表空間目錄在進行恢復之前就必須存在;否則,數(shù)據(jù)庫創(chuàng)建就會由于在非默認位置創(chuàng)建數(shù)據(jù)庫而失敗。

例子

要轉儲所有數(shù)據(jù)庫:

$ pg_dumpall > db.out

要從這個文件重新載入數(shù)據(jù)庫,你可以使用:

$ psql -f db.out postgres

這里你連接哪一個數(shù)據(jù)庫并不重要,因為由pg_dumpall創(chuàng)建的腳本將包含合適的命令來創(chuàng)建和連接到被保存的數(shù)據(jù)庫。一個例外是,如果指定了--clean,則開始時必須連接到postgres數(shù)據(jù)庫,該腳本將立即嘗試刪除其他數(shù)據(jù)庫,并且這種動作對于已連接上的這個數(shù)據(jù)庫將會失敗。

參見

可能的錯誤情況請查看pg_dump。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號