執行按期備份並有一整套恢復計劃是一個DBA的重要工做之一,這也是數據庫可用性和完整性的保障。咱們能夠在多個機房之間部署流複製集羣,以保證但節點故障,可是集羣沒法保證認爲的意外DELETE或者DROP操做而備份能夠。在這片文章中,咱們會討論PostgreSQL的一些可用的備份選項。sql
一般有兩種備份大類 - 邏輯備份和物理備份。在設計備份策略以前,首先須要認真理解這兩種備份的不一樣。固然,備份類型也決定了你須要使用哪一種特定的工具來實現。shell
邏輯備份的數據一般存儲爲平文件,以人類可讀活着容易理解的形式存儲。這中格式很是有用,若是須要,咱們設置能夠從備份中找到單獨的某行記錄並恢復它。可是從另外一方面來看,回覆整個邏輯備份是比較慢的,由於數據庫不得不對全部的數據加載一一處理,這種經過數據庫實例入庫數據的方式比直接複製數據文件要慢不少。數據庫
實際上,數據最終是一些磁盤文件的組合,物理備份就是將這些文件抓取出來。咱們能夠在某一個給定的時間點將數據文件複製出來進行備份。真正操做起來的時候,它並不像執行一個簡單的copy命令那麼容易。由於在執行物理備份時,咱們須要時刻清醒的意識到,此時可能正在發生數據庫修改。爲了確保物理備份的可用性,任何物理備份必須保持持續一致。ubuntu
物理備份對恢復整個數據庫十分有效,速度僅僅受限於磁盤活着網絡等硬件。c#
PostgreSQL,與大多數其餘關係型數據庫同樣,支持物理備份和邏輯備份。下面讓咱們一塊兒來看一下如何進行操做:網絡
PostgreSQL數據庫邏輯備份經過工具pg_dump來實現,它支持導出多種格式:默認存儲爲平文件,咱們也能夠經過參數控制生成結果爲tar文件活着其餘壓縮格式。這種備份能夠經過pg_restore命令恢復,咱們能夠很容易的手動解壓出SQL內容。下面具體來看一下如何用pg_dump建立一個備份:工具
首先,備份爲SQL平文件:post
root@vagrant-ubuntu-trusty-64:~/c# pg_dump -d pgbench -U psql -h 10.0.0.101 > pgbench.sql Password:
查看備份文件,能夠看到以下內容:vagrant
COPY pgbench_accounts (aid, bid, abalance, filler) FROM stdin; 1 1 0 2 1 0 3 1 0 4 1 0 5 1 0 6 1 0 7 1 0 8 1 0 9 1 0 10 1 0 11 1 0 12 1 0 13 1 0 14 1 0
若是你想輸出特定的備份格式,須要定義以下:設計
root@vagrant-ubuntu-trusty-64:~# pg_dump -d pgbench -U psql -h 10.0.0.101 --format c -f /root/c/pgdump.c Password:
恢復數據十分簡單。若是備份是默認平文件格式,咱們能夠直接用psql工具將該SQL語句加載到數據庫中。若是使用的是另外格式,能夠用pg_restore格式加載。若是容許丟棄部分新數據,那能夠將整個在線數據庫刪除後恢復整個備份(若是不進行刪除操縱,那麼恢復完後會存在雙份數據的問題)。例如:
postgres=# drop database pgbench; DROP DATABASE postgres=# create database pgbench; CREATE DATABASE root@vagrant-ubuntu-trusty-64:~# pg_restore --format c /root/c/pgdump.c -d pgbench -U psql -W -h 10.0.0.101 Password:
最後須要注意一點,pg_dump生成的持續備份是在一個單一的食物裏面完成的,這個特性說明PostgreSQL依賴於MVCC機制來保證當前的備份不被後來的事務影響。
物理備份只要備份就是全備份,因此恢復的時候也是全庫恢復。物理備份最大的問題是持續備份。固然,最簡單的辦法就是將PostgreSQL數據庫停掉,而後使用相似cp、scp活着rsync等工具直接備份。可是實際生產環境中,停掉數據庫基本是不可能的,因此咱們須要經過其餘的方式來實現。步驟大概以下:
這些操做能夠經過工具pg_basebackup來實現:
root@vagrant-ubuntu-trusty-64:~# pg_basebackup -U psql -h 10.0.0.101 -x -D /pgbase/
若是後面你須要實現基於檢查點的恢復,此刻須要開啓WAL歸檔設置:
wal_level = archive archive_mode = on
咱們也能夠經過設置archive_command參數將WAL段複製到一個單獨的位置存儲。
恢復物理備份也比較簡單,只須要將備份數據複製到一個乾淨的PostgreSQL數據目錄下便可。恢復完成後,一旦啓動PostgreSQL實例進程,數據庫便會自動恢復到備份的時間點。若是要基於時間點恢復,此時須要使用歸檔日誌:首先恢復基礎備份,而後建立一個recovery.conf文件定義一個恢復命令,這個命令用來告訴PostgreSQL如何重放WAL日誌。
Ends~