postgresql熱備份與恢復

一 熱備份的原理是“基礎備份文件”+“歸檔日誌”進行restore。
1 配置postgresql.conf文件
wal_level = hot_standby
archive_mode = on
archive_command = 'test ! -f /usr/local/backups/%f && cp %p /usr/local/backups/%f'
重啓數據庫是配置生效。
2 進行基礎文件的備份
#!/bin/bash
date=`date +%Y%m%d`
bak_path="/var/lib/pgsql/9.3/backups"
log_path="/var/log/backup"
log="/var/log/backup/backup-mwa-data-$date.log"
wt_log()
{
if [ $? -ne 0 ] ;then 
    echo "${*}:失敗![end:`date +%Y%m%d'-'%H:%M:%S`]">>${log} 2>&1
else
    echo "${*}:成功![end:`date +%Y%m%d'-'%H:%M:%S`]">>${log} 2>&1
fi
}

/usr/pgsql-9.3/bin/psql -h localhost -c "select pg_start_backup('hot_backup');">${log} 2>&1
wt_log 開啓熱備份
/bin/tar -cf ${bak_path}/base_backup_${date}.tar /var/lib/pgsql/9.3/data/ --exclude /var/lib/pgsql/9.3/data/pg_xlog>>${log} 2>&1
wt_log 備份data文件夾下(除xlog)所有內容
/usr/pgsql-9.3/bin/psql -h localhost -c "select pg_stop_backup();">>${log} 2>&1
wt_log 關閉熱備份
基礎備份不必每天備份,之需要每天備份歸檔日誌就可以了,所以這個shell可以設置間隔一段時間運行。
(1)pg_start_backup('hot_backup')函數告訴數據庫我要進行文件備份,把髒數據給我刷新到磁盤上(checkpoint);置寫日誌標誌爲:XLogCtl->Insert.forcePageWrites = true,也就是把這個標誌設置爲true後,數據庫會把變化的整個數
據塊都記錄到數據庫中,而不僅僅是塊中記錄的變化。防止後面一邊複製文件一邊寫文件同一個數據快數據不一致。
(2)把data文件打包壓縮到另外一個地方上。(關鍵是做這個)
(3)pg_stop_backup()函數告訴數據庫文件備份完成了。

二 模擬數據庫崩潰
 刪除data下的部分文件; kill  postgres主進程;啓動數據庫失敗,數據庫崩潰

三 恢復數據到當前
1 保留當期data文件夾下pg_xlog下的日誌,因爲有可能日誌沒有來得及歸檔。
2 刪除data文件夾。
3 解壓之前備份的data文件夾到原來data所在目錄。
4 在data目錄下創建pg_xlog/archive_status文件夾
5 創建恢復配置文件。 cp /usr/local/pgsql9.4.3/share/recovery.conf.sample /usr/local/pgsql9.4.3/data
增加以下兩行:
    restore_command='cp /usr/local/backups/%f %p'
    recovery_target_timeline = 'latest'
其中restore_command指定歸檔日誌路徑;recovery_target_timeline = 'latest' 代表數據庫恢復到當前最新。(注意:如果/usr/local/backups 下面的歸檔日誌不是最新的,要把崩潰後的war日誌拷貝到這裏)
6 起動數據庫,數據庫開始redo
[postgres@LAMP1 data]$ pg_ctl -D $PGDATA start
pg_ctl: another server might be running; trying to start server anyway
server starting
[postgres@LAMP1 data]$ LOG:  database system was interrupted; last known up at 2015-06-29 10:29:14 CST
LOG:  restored log file "00000002.history" from archive
cp: cannot stat `/usr/local/backups/00000003.history': No such file or directory
LOG:  starting archive recovery
LOG:  restored log file "00000002.history" from archive
LOG:  restored log file "000000020000000000000002" from archive
LOG:  redo starts at 0/2000028
LOG:  consistent recovery state reached at 0/2000240
LOG:  restored log file "000000020000000000000003" from archive
cp: cannot stat `/usr/local/backups/000000020000000000000004': No such file or directory
LOG:  redo done at 0/3000430
LOG:  last completed transaction was at log time 2015-06-29 15:11:00.35998+08
LOG:  restored log file "000000020000000000000003" from archive
cp: cannot stat `/usr/local/backups/00000003.history': No such file or directory
LOG:  selected new timeline ID: 3
LOG:  restored log file "00000002.history" from archive
LOG:  archive recovery complete
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章