?
本文檔使用
php中文網手冊 發(fā)布
這種轉儲方法是創(chuàng)建一個文本文件, 里面都是SQL命令,當把這個文件回饋給服務器時, 將重建與轉儲時狀態(tài)一樣的數據庫。PostgreSQL為這個用途提供了pg_dump工具。 這條命令的基本用法是:
pg_dump dbname > outfile
正如你所見,pg_dump把結果輸出到標準輸出。 我們下面就可以看到這樣做有什么好處。
pg_dump是一個普通的PostgreSQL客戶端應用(盡管是個相當聰明的東西)。 這就意味著你可以從任何可以訪問該數據庫的遠端主機上面進行備份工作。 但是請記住pg_dump不會以任何特殊權限運行。 具體說來,就是它必須要有你想備份的表的讀權限, 因此,實際上你幾乎總是要成為數據庫超級用戶。
要聲明pg_dump應該以哪個用戶身份進行連接, 使用命令行選項 -h host和-p port 。缺省主機是本地主機或環(huán)境變量PGHOST聲明的值。類似的,缺省端口是環(huán)境變量PGPORT或(如果它不存在的話)編譯好了的缺省值。服務器通常都有相同的缺省,所以還算方便。
和任何其它PostgreSQL客戶端應用一樣, pg_dump缺省時用與當前操作系統(tǒng)用戶名同名的數據庫用戶名進行連接。 要覆蓋這個名字,要么聲明-U選項,要么設置環(huán)境變量PGUSER。請注意pg_dump的連接也和普通客戶應用一樣要通過客戶認證機制(在章Chapter 19里描述)。
pg_dump跟別的備份方法相比較最重要的一個優(yōu)點會在后面介紹, pg_dump的輸出一般可以被重新加載到PostgreSQL的新版本, 而文件級備份和連續(xù)歸檔都是特定于服務器版本的。pg_dump是把數據庫移到另一個機器架構上的唯一方法,就像從32位到64位的服務器。
由pg_dump創(chuàng)建的備份在內部是一致的,也就是說, 在pg_dump運行的時候對數據庫進行一次快照。 pg_dump工作的時候并不阻塞其它對數據庫的操作 (但是會阻塞那些需要排它鎖的操作,比如ALTER TABLE)。
Important: 如果你的數據庫結構依賴于OID(比如說用做外鍵), 那么你必須告訴pg_dump把OID也導出來。要導出OID, 可以使用-o命令行選項。
pg_dump生成的文本文件可以由psql程序讀取。從轉儲中恢復的常用命令是:
psql dbname < infile
這里的infile是pg_dump命令的輸出文件。 這條命令不會創(chuàng)建dbname數據庫, 你必須在執(zhí)行psql前自己從template0創(chuàng)建(也就是用createdb -T template0dbname命令)。 psql支持類似pg_dump的選項用以控制數據庫服務器位置和用戶名。 參閱psql的手冊獲取更多信息。
在開始運行恢復之前,目標庫和所有在轉儲出來的庫中擁有對象的用戶, 以及曾經在某些對象上被賦予權限的用戶都必須已經存在。 如果這些不存在,那么恢復將失敗,因為恢復過程無法把這些對象恢復成原有的所有權和/或權限。 (有時候你希望恢復權限,不過通常你不需要這么做。)
缺省時,psql腳本將在遇到錯誤的時候仍然繼續(xù)執(zhí)行。 你可能希望運行psql和變量集ON_ERROR_STOP來保證在遇見錯誤的時候退出psql并返回狀態(tài)碼3:
\set ON_ERROR_STOP
不管上述哪種方法都只能得到部分恢復了的數據庫。 另外,你可以將整個恢復過程當成一個單獨的事務, 這樣就能夠保證要么全部恢復成功,要么全部回滾。 可以通過向psql傳遞-1或--single-transaction命令行參數達到此目的。 使用這個模式的時候即使一個很微小的錯誤也將導致已經運行了好幾個小時的恢復過程回滾。 盡管如此,這種模式也比手動清除哪些不完整的恢復數據強。
pg_dump和 psql可以通過管道讀寫, 這樣我們就可能從一臺主機上將數據庫目錄轉儲到另一臺主機上, 比如:
pg_dump -h host1 dbname | psql -h host2 dbname
Important: pg_dump生成的轉儲輸出是相對于template0的。 這就意味著任何加入到template1的語言、過程等都會經由pg_dump轉儲。 這樣在恢復的時候,如果你使用的是自定義的template1, 那么你必須從template0中創(chuàng)建空的數據庫,就像我們上面的例子那樣。
一旦完成恢復,在每個數據庫上運行ANALYZE是明智的舉動, 這樣優(yōu)化器就有可用的統(tǒng)計數據了。更多信息請參考Section 23.1.3 和Section 23.1.5 。 關于如何有效對PostgreSQL加載海量數據的信息,參考Section 14.4.
pg_dump上面的方法在備份整個數據庫集群的時候比較麻煩而且不方便。 因此我們提供了pg_dumpall程序。 pg_dumpall備份一個給出的集群中的每個數據庫, 同時還確保保留像角色和表空間這樣的全局數據狀態(tài)。 這個命令的基本用法是:
pg_dumpall > outfile
生成的轉儲可以用psql恢復:
psql -f infile postgres
實際上,你可以聲明任意現有的數據庫進行連接, 但是如果你是向一個空的數據庫集群裝載,那么postgres應該是比較好的選擇。 恢復pg_dumpall的轉儲的時候通常需要數據庫超級用戶權限, 因為我們需要它來恢復角色和表空間信息。 如果使用了表空間,需要注意轉儲中的表空間路徑必須適合新的安裝。
pg_dumpall作品由發(fā)出的命令來重建角色,表空間,空數據庫,然后調用pg_dump為每個數據庫備份。這意味著當 每個數據庫將在內部是一致的,不同數據庫的快照 可能不會完全的同步。
一些操作系統(tǒng)的文件是有最大上限的,就會在創(chuàng)建大的pg_dump輸出文件時 出現問題。幸運的是,因為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)可以接受的大小。 比如,讓每個塊大小為 1MB :
pg_dump dbname | split -b 1m - filename
用下面命令恢復:
cat filename* | psql dbname
使用pg_dump自定義的轉儲格式. 如果PostgreSQL是在一個安裝了zlib壓縮庫的系統(tǒng)上制作的, 那么自定義轉儲格式將在寫入輸出文件的時候壓縮數據。 它會生成和使用gzip類似大小的轉儲文件, 但是還附加了一個優(yōu)點:你可以有選擇地恢復庫中的表。 下面的命令用自定義轉儲格式轉儲一個數據庫:
pg_dump -Fc dbname > filename
自定義格式的轉儲不是腳本,不能用于psql , 而是需要使用pg_restore轉儲。例如:
pg_restore -d dbname filename
請參考pg_dump和pg_restore的手冊獲取細節(jié)。
對于每一個大型數據庫來說,你可能需要把split和另外兩個方法之一來結合使用。