W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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 OWNER
或SET 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
)。這將使得恢復過程非常慢,這主要用于使轉儲能夠被載入到非PostgreSQL數(shù)據(jù)庫中。table
(column
, ...) VALUES ...
--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 NOTHING
到INSERT
命令。 除非--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所需的特權但是能夠切換到一個具有所需權利的角色時,這個選項很有用。一些安裝有針對直接作為超級用戶登錄的策略,使用這個選項可以讓轉儲在不違反該策略的前提下完成。
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
的使用讓該腳本刪除并且重建內建的postgres
和template1
數(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。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: