1. 程式人生 > >如何在PostgreSQL中實現增量備份

如何在PostgreSQL中實現增量備份

簡述

在postgres中,能夠使用簡單的pg_dump做某個資料庫的完整備份。
此外,postgres中也同樣能夠實現增量備份,但針對的是整個資料庫叢集,即所有資料庫都備份下來。

這裡實現增量備份的思路是
1. 記錄資料庫系統的操作記錄
2. 在某一時刻進行一次完整的資料庫備份
3. 需要恢復時,還原上一次完整的資料庫備份,根據操作記錄恢復資料庫至指定的某個時刻(即可以實現PITR 時間點恢復)

環境

系統:CentOS 6.5
資料庫版本: Postgres 9.6

做法

  1. 開啟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
      > /usr/local/pgsql/test.log 2>&1
    • (可選) archive_timeout

      archive_timeout強制伺服器定期切換到新的WAL段檔案,以至於WAL檔案不會太少

    1.2 在成功配置之後,在/mnt/server/archivedir/下就能看到WAL歸檔檔案

  2. 進行檔案系統級別的備份
    對postgres的資料庫的資料目錄 (我的是/var/lib/pgsql/9.6/data)進行壓縮備份,作為系統的base backup

    2.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 到此時已經完成資料庫的基本備份(連同整個資料庫的配置,資料等),可以進行一些資料庫操作,記錄這些操作進行的時間,以便之後進行恢復系統可以看到結果

  3. 恢復系統
    使用之前備份過的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:00

    3.6 重啟資料庫

    /etc/init.d/postgresql-9.6 restart

引用