備份的意義在于發(fā)生意外時,具備恢復和還原的能力,及時將意外導致的損失降到最低。Postgresql的備份還原主要有:SQL轉儲、文件系統(tǒng)級備份和連續(xù)歸檔和時間點恢復(PITR)這三種方式。今天主要介紹的是postgresql基礎備份恢復方式-SQL轉儲。
PostgreSQL自帶的內置備份工具叫做pg_dump。這個工具是通過一系列的SQL語句讀取某個指定的數據庫并復制其中的內容,以它作為快照并用于日后的數據恢復。該工具的基本用法是:
pg_dumpdbname> dumpfile
pg_dump是將結果寫入標準輸出文件中。pg_dump可以用其他格式創(chuàng)建文件以支持并行和細粒度的對象恢復控制。pg_dump是一個普通的PG客戶端應用,這就意味著你可以在任何可以訪問該數據庫的遠端主機上進行備份工作。
在使用pg_dump工具進行備份之前,首先需要確保執(zhí)行用戶具有登錄到服務器并訪問將要備份的數據庫或表的權限。可以通過使用psql,進行服務器登錄。在客戶端中輸入主機名(-h),用戶名(-u)和密碼(-p),以及數據庫名,然后就可以校驗備份用戶是否被授權訪問。
使用pg_dump非常的簡單——只需要在命令提示符后面輸入將要導出的數據庫名就可以進行備份工作了,如下例所示(根據您自己的安裝路徑更改PostgreSQL路徑):
[postgres@pgsql1~]$ /db/pgsql/bin/pg_ctl -D -h localhost -U demo(用戶名)demodb(數據庫名稱)> demodb.sql
通過上面的命令就會創(chuàng)建一個名為demodb.sql的文件,文件中記錄了用于恢復數據庫的SQL命令。
和任何其他PostgreSQL客戶端應用一樣,pg_dump默認使用與當前操作系統(tǒng)用戶名同名的數據庫用戶名進行連接。要使用其他名字,要么聲明-U選項,要么設置環(huán)境變量PGUSER。請注意pg_dump的連接也要通過客戶認證機制。
pg_dump對于其他備份方法的一個重要優(yōu)勢是,pg_dump的輸出可以很容易的在新版本的PostgreSQL中載入,而文件級備份和連續(xù)歸檔都限制于服務器架構和版本。pg_dump也是唯一可以將一個數據庫傳送到一個不同機器架構上的方法,例如:從一個32位服務器到一個64位服務器。
由于pg_dump創(chuàng)建的備份在內部是一致的,SQL轉儲文件中是pg_dump開始運行時刻的數據庫快照,且在pg_dump運行過程中發(fā)生的更新將不會被轉儲。因此,pg_dump工作的時候并不阻塞其他進程對數據庫的操作。(但是會阻塞那些需要排它鎖的操作,比如ALTERTABLE等)。
pg_dump生成的文本文件可以由psql程序讀取。從轉儲中恢復的常用命令是:
psqldbname< dumpfile
其中dumpfile就是pg_dump命令的輸出文件,也就是之前導出的demodb.sql文件。這條命令操作之前需要有待導入的數據庫demodb。因此,必須在執(zhí)行psql前已經創(chuàng)建demodb(例如,用命令createdb-Ttemplate0 demodb)。psql支持類似pg_dump的選項用以指定要連接的數據庫服務器和要使用的用戶名。pg_dump產生的轉儲是相對于template0。這意味著在template1中加入的任何語言、過程等都會被pg_dump轉儲。結果是,如果在恢復時使用的是一個自定義的template1,你必須從template0創(chuàng)建一個空的數據庫。
在開始恢復之前,SQL轉儲庫中對象的擁有者以及在其上被授予了權限的用戶必須已經存在。如果不存在,那么恢復過程將無法將對象創(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
pg_dump每次只轉儲一個數據庫,而且它不會轉儲關于角色或表空間(因為它們是集簇范圍的)的信息。為了支持方便地轉儲一個數據庫集簇的全部內容,提供了pg_dumpall程序。pg_dumpall備份一個給定集簇中的每一個數據庫,并且也保留了集簇范圍的數據,如角色和表空間定義。該命令的基本用法是:
pg_dumpall> dumpfile
轉儲的結果可以使用psql恢復:
psql-f dumpfilepostgres
在恢復一個pg_dumpall轉儲時常常需要具有數據庫超級用戶訪問權限,因為它需要恢復角色和表空間信息。如果在使用表空間,需要確保轉儲中的表空間路徑適合于新的安裝。
pg_dumpall工作時會發(fā)出命令重新創(chuàng)建角色、表空間和空數據庫,接著為每一個數據庫pg_dump。這意味著每個數據庫自身是一致的,但是不同數據庫的快照并不同步。
集簇范圍的數據可以使用pg_dumpall的--globals-only選項來多帶帶轉儲。如果在單個數據庫上運行pg_dump命令,上述做法對于完全備份整個集簇是必需的。
在一些具有最大文件尺寸限制的操作系統(tǒng)上創(chuàng)建大型的pg_dump輸出文件可能會出現(xiàn)問題。pg_dump可以寫出到標準輸出,因此操作時可以使用標準Unix工具來處理這種潛在的問題。有幾種可能的方法:
使用壓縮轉儲
可以使用常用的壓縮程序,例如gzip:
pg_dumpdbname| gzip > filename.gz
恢復:
gunzip-c filename.gz| psql dbname
或者:
catfilename.gz| gunzip | psql dbname
使用split
split命令允許你將輸出分割成較小的文件以便能夠適應底層文件系統(tǒng)的尺寸要求。例如,讓每一塊的大小為1兆字節(jié):
pg_dumpdbname| split -b 1m - filename
恢復:
catfilename*| psql dbname
使用pg_dump的自定義轉儲格式
如果PostgreSQL所在的系統(tǒng)上安裝了zlib壓縮庫,自定義轉儲格式將在寫出數據到輸出文件時對其壓縮。這將產生和使用gzip時差不多大小的轉儲文件,但是這種方式的一個優(yōu)勢是其中的表可以被有選擇地恢復。下面的命令使用自定義轉儲格式來轉儲一個數據庫:
pg_dump-Fc dbname> filename
自定義格式的轉儲不是psql的腳本,只能通過pg_restore恢復,例如:
pg_restore-d dbnamefilename
對于非常大型的數據庫,你可能需要將split配合其他兩種方法之一進行使用。
使用pg_dump的并行轉儲特性
為了加快轉儲一個大型數據庫的速度,可以使用pg_dump的并行模式。它將同時轉儲多個表。可以使用-j參數控制并行度。并行轉儲只支持“目錄”歸檔格式。
pg_dump-j num-F d -f out.dirdbname
可以使用pg_restore-j來以并行方式恢復一個轉儲。它只能適合于“自定義”歸檔或者“目錄”歸檔,這個歸檔不一定由pg_dump-j創(chuàng)建。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130093.html
摘要:指定要用于查找的口令文件的名稱。前四個字段可以是確定的字面值,也可以使用通配符匹配所有。利用環(huán)境變量引用的文件權限也要滿足這個要求,否則同樣會被忽略。在上,該文件被假定存儲在一個安全的目錄中,因此不會進行特別的權限檢查。 pg_dump pg_dump 把一個數據庫轉儲為純文本文件或者是其它格式. 用法: pg_dump [選項]... [數據庫名字] 一般選項: -f, --fi...
摘要:作者譚峰張文升出版日期年月頁數頁定價元本書特色中國開源軟件推進聯(lián)盟分會特聘專家撰寫,國內多位開源數據庫專家鼎力推薦。張文升中國開源軟件推進聯(lián)盟分會核心成員之一。 很高興《PostgreSQL實戰(zhàn)》一書終于出版,本書大體上系統(tǒng)總結了筆者 PostgreSQL DBA 職業(yè)生涯的經驗總結,本書的另一位作者張文升擁有豐富的PostgreSQL運維經驗,目前就職于探探科技任首席PostgreS...
摘要:死鎖問題可以預防,可以解決死鎖年月日數據庫的完整性約束實體完整性約束定義主鍵。主鍵不能為空,不能重復參照完整性約束外鍵。系統(tǒng)需要進行多次連接,才能進行查詢操作,是的系統(tǒng)效率大大下降。 ...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20