PostgreSQL SQL轉儲

2021-09-01 15:07 更新
25.1.1. 從轉儲中恢復
25.1.2. 使用pg_dumpall
25.1.3. 處理大型數(shù)據(jù)庫

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 table 選項來備份該數(shù)據(jù)庫中你能夠 訪問的部分)。

要聲明pg_dump連接哪個數(shù)據(jù)庫服務器,使用命令行選項-hhost -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

25.1.1. 從轉儲中恢復

pg_dump生成的文本文件可以由psql程序讀取。 從轉儲中恢復的常用命令是:

psql dbname < dumpfile

其中dumpfile就是pg_dump命令的輸出文件。這條命令不會創(chuàng)建數(shù)據(jù)庫dbname,你必須在執(zhí)行psql前自己從template0創(chuàng)建(例如,用命令 createdb -T template0 dbname )。psql支持類似pg_dump的選項用以指定要連接的數(shù)據(jù)庫服務器和要使用的用戶名。參閱psql的手冊獲取更多信息。 非文本文件轉儲可以使用 pg_restore 工具來恢復。

在開始恢復之前,轉儲庫中對象的擁有者以及在其上被授予了權限的用戶必須已經(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_dumppsql讀寫管道的能力使得直接從一個服務器轉儲一個數(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é)。

25.1.2. 使用pg_dumpall

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命令,上述做法對于完全備份整個集簇是必需的。

25.1.3. 處理大型數(shù)據(jù)庫

在一些具有最大文件尺寸限制的操作系統(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_dumppg_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)建。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號