如何在PostgreSQL中實現增量備份
簡述
在postgres中,能夠使用簡單的pg_dump做某個資料庫的完整備份。
此外,postgres中也同樣能夠實現增量備份,但針對的是整個資料庫叢集,即所有資料庫都備份下來。
這裡實現增量備份的思路是
1. 記錄資料庫系統的操作記錄
2. 在某一時刻進行一次完整的資料庫備份
3. 需要恢復時,還原上一次完整的資料庫備份,根據操作記錄恢復資料庫至指定的某個時刻(即可以實現PITR 時間點恢復)
環境
系統:CentOS 6.5
資料庫版本: Postgres 9.6
做法
開啟postgres的WAL歸檔
WAL歸檔是記錄對資料庫的一些操作的序列檔案,postgres將最近的WAL檔案儲存在 pg_xlog 中,所以我們還需要設定在產生WAL檔案時將其持續儲存到遠端儲存或者在本地的另外一個地方。WAL檔案每個16MB,postgres自動進行分割。
1.1 在資料目錄/var/lib/pgsql/9.6/data 中找到posstgresql.conf配置檔案(資料目錄可能不同),這裡需要設定引數:
wal_level
設定儲存操作日誌的具體程度級別,要設定WAL歸檔至少要設定為replica
archive_mode
是否啟用WAL歸檔 , 設定為on
archive_command
執行本地shell命令來歸檔已完成的WAL檔案段,
%p表示每一個產生的WAL檔案位置,%f表示該檔名,以下命令表示把新產生的WAL檔案轉儲到指定目錄中
後面的部分表示將正常輸出,錯誤輸出重定向到日誌檔案中,方便檢視錯誤情況cp %p /mnt/server/archivedir/%f
(可選) archive_timeout
archive_timeout強制伺服器定期切換到新的WAL段檔案,以至於WAL檔案不會太少
1.2 在成功配置之後,在/mnt/server/archivedir/下就能看到WAL歸檔檔案
進行檔案系統級別的備份
對postgres的資料庫的資料目錄 (我的是/var/lib/pgsql/9.6/data)進行壓縮備份,作為系統的base backup2.1 在開始備份前,首先要在日誌檔案中做好標籤
使用預設賬號,登入psql,輸入
select pg_start_backup('fullbackup'
2.2 開始備份檔案系統,在另一終端中,壓縮備份postgres的資料目錄
tar -cvzf /var/lib/pgsql/9.6/pgdatabp20171112-1533.tar /var/lib/pgsql/9.6/data/
2.3 結束備份,在剛剛的資料庫連線中輸入
select pg_stop_backup();
2.4 此時再使用
ls -lsh
檢視下/mnt/server/archivedir/能夠看到備份標籤打在的時間點2.5 到此時已經完成資料庫的基本備份(連同整個資料庫的配置,資料等),可以進行一些資料庫操作,記錄這些操作進行的時間,以便之後進行恢復系統可以看到結果
恢復系統
使用之前備份過的data資料夾替換原來的,新增recovery.conf指令碼,重啟postgres服務3.1 假設系統意外崩潰
kill -9 $(head -1 /var/lib/pgsql/9.6/data/postmaster.pid)
3.2 先將舊的data目錄重新命名為bad.data,然後用之前備份的data目錄替換之
mv data bad.data tar -xvzf pgdatabp20171112-1533.tar mv var/lib/pgsql/9.6/data/ ./
3.3 啟動一次資料庫看看,看到的應該就是備份時的資料,並沒有備份後的操作結果存在
/etc/init.d/postgresql-9.6 restart
3.4 將bad.data內尚未歸檔的WAL檔案手動歸檔至新的data目錄中的pg_xlog目錄
cp /var/lib/pgsql/9.6/bad.data/pg_xlog/0* /var/lib/pgsql/9.6/data/pg_xlog
3.5 在新的data目錄內建立一個recovery.conf配置檔案
內容如下:
restore_command = 'cp /mnt/server/archivedir/%f %p > /var/lib/pgsql/9.6/recovery.log 2>&1 ' recovery_target_time = '2017-11-12 16:20:00'
recovery_target_time 表示要恢復到的時間點
recovery.conf檔案將使PostgreSQL從 /mnt/server/archivedir/資料夾中取得歸檔日誌檔案,並恢復資料更改,直到 2017-11-12 16:20:003.6 重啟資料庫
/etc/init.d/postgresql-9.6 restart