PostgreSQL在任何時候都在維護一套預寫日誌(WAL),這些日誌記錄著每次對資料庫的異動內容,其主要的目的是為了防止資料庫系統崩潰,資料庫可以透過重新放置上次檢查點,藉以日誌記錄來回復資料庫的完整性。日誌的存在還可以利用在另一種備份策略,日誌文件透過檔案系統備份,如需要回復時,以可以依據日誌文件的備份時間,重新放置日誌文件,把備份回復到備份的時間,以有效的管理資料庫的備份及回復作業。
環境說明
首先我們需要二台資料庫伺服器,第一台為Active的Primary server,而第二台為Standby的standby warm server,Standby warm server的目的為同步Primary server的資料,並且等待Primary server系統崩潰時,Standby warm server會轉變為Primary server,繼續提供服務。
環境設定
1. 建立Primary(192.168.0.100)及Standby warm server(192.168.0.101)之間的遠端日誌目錄
設定於Primary及Standby warm server,系統創建日誌目錄/pg_archivelog, Standby warm server透過nfs掛載Primary server的日誌目錄,以同步Primary server的資料。
a.創建日誌目錄
# mkdir /pg_archivelog
# chown postgres:postgres /pg_archivelog
b.設定nfsd於Primary server(需確認已安裝nfsd service)
# echo "/pg_archivelog 192.168.0.101(rw,sync,no_subtree_check)" >>/etc/exportfs
# exportfs -a
c.設定Standby warm server掛載Primary server的日誌目錄
# echo "192.168.0.100:/pg_archivelog /pg_archivelog nfs timeo=14,rsize=8192,wsize=8192,nolock,intr 0 0" >> /etc/fstab
# mount -a
d.設定Archive log,新增下列兩行於postgresql.conf,重新載入資料庫系統。
其中 %p 為資料庫要被歸檔的檔案絕對路徑, %f 為檔名。
archive_command = 'cp "%p" /pg_archivelog/"%f"'
archive_timeout = 120
$ pg_ctl reload
e.啟動Primary server,並且要確認日誌記錄檔是否正常產生。
2. 設定Primary server
a.建立基礎備份,執行 fullBackup.sh 備份,於 Primary server。
#!/bin/bash
BACKUP_FILE=`date +mydb_%Y%m%d.tgz`
PGHOME=/home/postgres
echo "Start dfdb backup ..."
echo "SELECT pg_start_backup('mydb');" | psql -U postgres
cd $PGHOME
echo "Backup $BACKUP_FILE ..."
tar cfz $BACKUP_FILE data pg_archivelog
echo "End dfdb backup ..."
echo "SELECT pg_stop_backup();" | psql -U postgres
3. 設定Standby warm server
a.停止資料庫系統
pg_ctl stop
b.複製基礎備份檔至Standby warm server
scp postgres@192.168.0.100:/home/postgres/mydb_20091007.tgz .
c.解開基礎備份檔,並且覆蓋資料庫系統
tar xfz mydb_20091007.tgz
d.刪除備份標記檔
rm /home/postgres/data/backup_label
e.設定回復檔 /home/postgres/data/recovery.conf
echo "restore_command='pg_standby -l -d -s 5 -k 50 -t /tmp/pgsql.trigger.5442 /pg_archivelog %f %p %r 2>>standby.log'" >/home/postgres/data/recovery.conf
f.啟動Standby warm server
pg_ctl start
※Standby warm server在啟動後會每5秒檢查一次是否有更新WAL日誌檔,並且更新至Standby warm server, 所以系統並沒有完全開啟,而是一直在回復資料(即是同步Primary server的資料),因此系統啟動後並不能使用Standby warm server。
4. 模擬Primary server崩潰,Standby warm server接手工作
重頭戲來啦,要如何模擬Primary server崩潰呢?其實並不好模擬出來,所以我們要做SOP來標準化作業模式,當Primary server發生異常時,若決議要Standby warm server接續作業後,無論Primary server上頭是否還有正常的功能能運作,都需要把Primary server停止下來,接著產生Standby warm server的停止作業觸發檔(/tmp/pgsql.trigger.5442),回復作業即會停止,Standby warm server即會正常啟動,變成Primary server提供服務給應用系統。
a.停止Primary server
pg_ctl stop
b.產生停止作業觸發檔
touch /tmp/pgsql.trigger.5442
c.更新應用系統的資料庫連線參數
5. Primary server回復作業
這個議題是在備援系統中往往會遺忘的部份,Primary server在修復後,總是要把工作交回給Primary server,因為Primary server往往設備會比Standby warm server較好一些,所以回復Primary server作業就會被需要。首先要做一份Primary server(原Standby warm server)基礎備份,在利用備份檔回復Primary server,即可開啟系統,Standby warm server再執行步驟 3 的作業。
a.做一份Primary server(原Standby warm server)基礎備份
請參照步驟 2
b.停止Primary server(原Standby warm server)
pg_ctl stop
c.複製基礎備份檔至Primary server
scp postgres@192.168.0.101:/home/postgres/mydb_20091007.tgz .
d.解開基礎備份檔,並且覆蓋資料庫系統
tar xfz mydb_20091007.tgz
e.刪除備份標記檔
rm /home/postgres/data/backup_label
f.設定回復檔 /home/postgres/data/recovery.conf
echo "cp /pg-archivelog/%f %p" >/home/postgres/data/recovery.conf
g.啟動Primary server
pg_ctl start
h.更新應用系統的資料庫連線參數
i.設定Standby warm server
請參照步驟 3
終於完工啦~~
訂閱:
張貼留言 (Atom)
HDB 擴充套件 PXF (Pivotal Extension Framework) 應用
在Hadoop生態圈裡, 雖然擁有眾多生態系統工具, 但大多用戶仍然需要的是SQL的操作介面, Pivotal HDB 提供一個在Hadoop上運行的標準SQL引擎介面, 箇中好處開發者最能感受, 但本篇重點不在這, 哈哈~ 主要分享在HDB上可以輕易整合外部資料的應用. ...
-
Update Multiple Columns 通常我們在執行多個欄位更新時, 我們的 SQL 大多會以下列語法來執行, UPDATE tablename SET col1 = 'val1' , col2 = 'val2' WHERE co...
-
資料載入的另一方式, 透過查詢檔案外部表, 可以直接應用外部檔案. 使用情境為載入資料檔及資料轉換,資料轉換部份為轉換日期格式,以下是實作的方式: 1. 準備一個外部檔 test.dat ,內容如下: 2. 建立延伸套件 file_fdw 3. ...
-
你曾有維護資料庫時,需要處理複雜的sql,以及繁瑣的程序,花費不少DBA的生命~~ 呵呵~~Partition Table可以減輕"部份"維護上的程序,提昇"部份"DBA的價值. 當然Partition已經不是什麼新鮮的技術,在Orac...
沒有留言:
張貼留言