W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
SQL 轉儲方法的思想是創(chuàng)建一個由SQL命令組成的文件,當把這個文件回饋給服務器時,服務器將利用其中的SQL命令重建與轉儲時狀態(tài)一樣的數(shù)據(jù)庫。 PostgreSQL為此提供了工具pg_dump。這個工具的基本用法是:
pg_dump dbname
> dumpfile
正如你所見,pg_dump把結果輸出到標準輸出。我們后面將看到這樣做有什么用處。 盡管上述命令會創(chuàng)建一個文本文件,pg_dump可以用其他格式創(chuàng)建文件以支持并行 和細粒度的對象恢復控制。
pg_dump是一個普通的PostgreSQL客戶端應用(盡管是個 相當聰明的東西)。這就意味著你可以在任何可以訪問該數(shù)據(jù)庫的遠端主機上進行備份工作。但是請記住 pg_dump不會以任何特殊權限運行。具體說來,就是它必須要有你想備份的表的讀 權限,因此為了備份整個數(shù)據(jù)庫你幾乎總是必須以一個數(shù)據(jù)庫超級用戶來運行它(如果你沒有足夠的特權
來備份整個數(shù)據(jù)庫,你仍然可以使用諸如-n
或schema
-t
選項來備份該數(shù)據(jù)庫中你能夠 訪問的部分)。table
要聲明pg_dump連接哪個數(shù)據(jù)庫服務器,使用命令行選項-h
和 host
-p
。 默認主機是本地主機或你的port
PGHOST
環(huán)境變量指定的主機。 類似地,默認端口是環(huán)境變量PGPORT
或(如果PGPORT
不存在)內(nèi)建的默認值。 (服務器通常有相同的默認值,所以還算方便。)
和任何其他PostgreSQL客戶端應用一樣, pg_dump默認使用與當前操作系統(tǒng)用戶名同名的數(shù)據(jù)庫用戶名進行連接。 要使用其他名字,要么聲明-U
選項,要么設置環(huán)境變量PGUSER
。請注意pg_dump的連接也要通過客戶認證機制(在
第 20 章里描述)。
pg_dump對于其他備份方法的一個重要優(yōu)勢是,pg_dump的輸出可以很容易地在新版本的PostgreSQL中載入,而文件級備份和連續(xù)歸檔都是極度的服務器版本限定的。pg_dump也是唯一可以將一個數(shù)據(jù)庫傳送到一個不同機器架構上的方法,例如從一個32位服務器到一個64位服務器。
由pg_dump創(chuàng)建的備份在內(nèi)部是一致的, 也就是說,轉儲表現(xiàn)了pg_dump開始運行時刻的數(shù)據(jù)庫快照,且在pg_dump運行過程中發(fā)生的更新將不會被轉儲。pg_dump工作的時候并不阻塞其他的對數(shù)據(jù)庫的操作。 (但是會阻塞那些需要排它鎖的操作,比如大部分形式的
ALTER TABLE
)
pg_dump生成的文本文件可以由psql程序讀取。 從轉儲中恢復的常用命令是:
psql dbname
< dumpfile
其中dumpfile
就是pg_dump命令的輸出文件。這條命令不會創(chuàng)建數(shù)據(jù)庫dbname
,你必須在執(zhí)行psql前自己從template0
創(chuàng)建(例如,用命令
createdb -T template0
)。psql支持類似pg_dump的選項用以指定要連接的數(shù)據(jù)庫服務器和要使用的用戶名。參閱psql的手冊獲取更多信息。 非文本文件轉儲可以使用
pg_restore
工具來恢復。dbname
在開始恢復之前,轉儲庫中對象的擁有者以及在其上被授予了權限的用戶必須已經(jīng)存在。如果它們不存在,那么恢復過程將無法將對象創(chuàng)建成具有原來的所屬關系以及權限(有時候這就是你所需要的,但通常不是)。
默認情況下,psql腳本在遇到一個SQL錯誤后會繼續(xù)執(zhí)行。你也許希望在遇到一個SQL錯誤后讓psql退出,那么可以設置ON_ERROR_STOP
變量來運行psql,這將使psql在遇到SQL錯誤后退出并返回狀態(tài)3:
psql --set ON_ERROR_STOP=on dbname < infile
不管怎樣,你將只能得到一個部分恢復的數(shù)據(jù)庫。作為另一種選擇,你可以指定讓整個恢復作為一個單獨的事務運行,這樣恢復要么完全完成要么完全回滾。這種模式可以通過向psql傳遞-1
或--single-transaction
命令行選項來指定。在使用這種模式時,注意即使是很小的一個錯誤也會導致運行了數(shù)小時的恢復被回滾。但是,這仍然比在一個部分恢復后手工清理復雜的數(shù)據(jù)庫要更好。
pg_dump和psql讀寫管道的能力使得直接從一個服務器轉儲一個數(shù)據(jù)庫到另一個服務器成為可能,例如:
pg_dump -h host1
dbname
| psql -h host2
dbname
pg_dump產(chǎn)生的轉儲是相對于template0
。這意味著在template1
中加入的任何語言、過程等都會被pg_dump轉儲。結果是,如果在恢復時使用的是一個自定義的template1
,你必須從
template0
創(chuàng)建一個空的數(shù)據(jù)庫,正如上面的例子所示。
一旦完成恢復,在每個數(shù)據(jù)庫上運行ANALYZE是明智的舉動,這樣優(yōu)化器就有有用的統(tǒng)計數(shù)據(jù)了,更多信息參見第 24.1.3 節(jié)和 第 24.1.6 節(jié)。更多關于如何有效地向PostgreSQL里裝載大量數(shù)據(jù)的建議, 請參考第 14.4 節(jié)。
pg_dump每次只轉儲一個數(shù)據(jù)庫,而且它不會轉儲關于角色或表空間(因為它們是集簇范圍的)的信息。為了支持方便地轉儲一個數(shù)據(jù)庫集簇的全部內(nèi)容,提供了pg_dumpall程序。 pg_dumpall備份一個給定集簇中的每一個數(shù)據(jù)庫,并且也保留了集簇范圍的數(shù)據(jù),如角色和表空間定義。該命令的基本用法是:
pg_dumpall > dumpfile
轉儲的結果可以使用psql恢復:
psql -f dumpfile
postgres
(實際上,你可以指定恢復到任何已有數(shù)據(jù)庫名,但是如果你正在將轉儲載入到一個空集簇中則通常要用(postgres
)。在恢復一個pg_dumpall轉儲時常常需要具有數(shù)據(jù)庫超級用戶訪問權限,因為它需要恢復角色和表空間信息。如果你在使用表空間,請確保轉儲中的表空間路徑適合于新的安裝。
pg_dumpall工作時會發(fā)出命令重新創(chuàng)建角色、表空間和空數(shù)據(jù)庫,接著為每一個數(shù)據(jù)庫pg_dump。這意味著每個數(shù)據(jù)庫自身是一致的,但是不同數(shù)據(jù)庫的快照并不同步。
集簇范圍的數(shù)據(jù)可以使用pg_dumpall的--globals-only
選項來單獨轉儲。如果在單個數(shù)據(jù)庫上運行pg_dump命令,上述做法對于完全備份整個集簇是必需的。
在一些具有最大文件尺寸限制的操作系統(tǒng)上創(chuàng)建大型的pg_dump輸出文件可能會出現(xiàn)問題。幸運地是,pg_dump可以寫出到標準輸出,因此你可以使用標準Unix工具來處理這種潛在的問題。有幾種可能的方法:
使用壓縮轉儲。. 你可以使用你喜歡的壓縮程序,例如gzip:
pg_dump dbname
| gzip > filename
.gz
恢復:
gunzip -c filename
.gz | psql dbname
或者:
cat filename
.gz | gunzip | psql dbname
使用split
。.
split
命令允許你將輸出分割成較小的文件以便能夠適應底層文件系統(tǒng)的尺寸要求。例如,讓每一塊的大小為1兆字節(jié):
pg_dump dbname
| split -b 1m - filename
恢復:
cat filename
* | psql dbname
使用pg_dump的自定義轉儲格式。.
如果PostgreSQL所在的系統(tǒng)上安裝了zlib壓縮庫,自定義轉儲格式將在寫出數(shù)據(jù)到輸出文件時對其壓縮。這將產(chǎn)生和使用gzip
時差不多大小的轉儲文件,但是這種方式的一個優(yōu)勢是其中的表可以被有選擇地恢復。下面的命令使用自定義轉儲格式來轉儲一個數(shù)據(jù)庫:
pg_dump -Fc dbname
> filename
自定義格式的轉儲不是psql的腳本,只能通過pg_restore恢復,例如:
pg_restore -d dbname
filename
詳情請參閱pg_dump和pg_restore。
對于非常大型的數(shù)據(jù)庫,你可能需要將split
配合其他兩種方法之一進行使用。
使用pg_dump的并行轉儲特性。.
為了加快轉儲一個大型數(shù)據(jù)庫的速度,你可以使用pg_dump的并行模式。它將同時轉儲多個表。你可以使用-j
參數(shù)控制并行度。并行轉儲只支持“目錄”歸檔格式。
pg_dump -j num
-F d -f out.dir
dbname
你可以使用pg_restore -j
來以并行方式恢復一個轉儲。它只能適合于“自定義”歸檔或者“目錄”歸檔,但不管歸檔是否由pg_dump -j
創(chuàng)建。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: