增量備份 PostgreSQL

suzhouclark發表於2008-09-09
增量備份 PostgreSQL[@more@]

一、介紹

   PITR 的全稱是 Point In Time Recovery, 它結合檔案系統級備份 WAL 日誌檔案, 達
到增量備份 PostgreSQL 資料庫系統.
   WAL 的全稱是 Write Ahead Log, 它記錄著資料庫修改資料檔案的每一個動作. 如果
系統掛了, 讀入這些日誌檔案可以很方便快捷安全的恢復資料.
   要知道的是, PITR 備份不只是備份一張或幾張表, 它是完全的備份, 不管是表、儲存
過程等. 它幾乎是把原來的資料庫系統做了一次克隆. 也就是說, 這種備份讓我們無需
關心資料庫系統中有幾個資料庫, 每個資料庫中又有些什麼資料, 不用像 pg_dump 要
指定資料庫名稱, 也不用像 slony 那樣在配置檔案中指定表, 還得是有主鍵的表.
   別幻想什麼東西都是十全十美的, PITR 不是全能的. 它不能做 "高可用", 即 Master
和 Slave 的東東, 它也不能做 "負載均衡". 如果你一定要這些東西, 可以配合其他軟
件實現.
   OK, 嘮叨許多廢話. 嗯... 說明你很有耐心, 呵呵!!!

二、設定及操作

   實現 PITR 備份方案, 接下來我們說說設定、備份及恢復.
   * 設定
建立備份目錄. 備份分基線 (baseline) 和日誌備份, 所以我們要建立兩個目錄:
mkdir -p /opt/bubase
mkdir -p /opt/buxlog
   接著我們設定一些環境變數及備份所在目錄:
export PGDATA=/home/postgres/pgdata
export BUBASE=/opt/bubase
export BUXLOG=/opt/buxlog
   設定完上面那些變數後, 編輯 $PGDATA/postgresql.conf 檔案, 設定如下:
archive_mode = on
archive_command = 'cp %p /opt/buxlog/%f'
   OK, 所有設定都完成了, 啟動或重啟 PostgreSQL 服務.
   * 備份
備份是有順序的, 先做基線備份, 然後備份日誌.
   基線備份命令如下:
psql -d template1 -c "select PG_START_BACKUP('backup baseline')"
cp -R $PGDATA/* $BUBASE
psql -d template1 -c "select PG_STOP_BACKUP()"
   基線備份好後, 就可以時不時的備份日誌了, 命令如下:
cp -R $PGDATA/pg_xlog/* $BUXLOG

日誌備份儘可能的頻繁一些. 因為當線上提供服務的所在磁碟壞掉, 而你又沒有備份
WAL 日誌, 你會丟資料.
   * 恢復
哎呀, 線上提供服務的 PostgreSQL 宕了。不怕、不怕, 我們這不是有備份嘛, 嚯嚯!
   嘎嘎, 不小心又弄來一臺新機器(YY 中... 假設一下啦), 那我們把 baseline 的備份
弄過來, 不管你用哪種方法. 擬定也放在 /home/postgres/pgdata 目錄下.
   接著呢, 為了避免恢復還響應連線請求什麼的, 我們把服務只開啟本地連線, 修改 
$PGDATA/postgresql.conf 檔案:
listen_addresses = 'localhost'
   再下來, 在 $PGDATA 目錄下建立一個 recovery.conf 檔案. PostgreSQL 啟動的時候
如果發現 $PGDATA 目錄裡面有這個檔案就會進入恢復模式, 恢復完後會把這個檔案重
命名為 recovery.done. 檔案內容只有一行, 如下:
restore_command='cp /opt/buxlog/%f %p'
   注意這裡是單引號, 別用雙引號, 不然會提示錯誤.
   關鍵時刻了, 啟動資料庫:
pg_ctl start -D $PGDATA -l /tmp/pg.log
   這個時候觀察 /tmp/pg.log 檔案, 會發現正在恢復一堆一堆、一坨一坨的 WAL 日誌文
件。
   最後, 恢復完後, 再把 $PGDATA/postgresql.conf 檔案中的 listen_addresses 改回
原來的模樣。重啟:
pg_ctl restart -D $PGDATA -l /tmp/pg.log
   嚯嚯, 大功告成!!!

四、指令碼化及自動化

   個人覺著這些步驟還是很繁瑣的, 可以編寫個什麼指令碼之類的, 把指令碼放進 crontab 
裡面, 較比的省心.
   指令碼如何寫, 我就不獻醜了. 不過, 這裡需要說明一下的是, baseline 備份的頻繁度
會影響你恢復的速度. 為什麼這麼說呢, 因為每次備份 baseline, 恢復的時候也就恢
復這次備份 baseline 以後的所有修改資料庫資料檔案的 WAL 就可以了,相信這是很
好理解的.

以上所有的設定或測試都是基於 PostgreSQL 8.3.1 版本的.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9697/viewspace-1010448/,如需轉載,請註明出處,否則將追究法律責任。

相關文章