天天看點

PostgreSQL資料備份政策概述WAL歸檔政策實體全備備份管理工具

概述

任何資料庫搭建完成,準備投入使用之後,首先要确定的就是資料庫的備份政策,合理有規劃的備份是資料安全的關鍵。

以下就是針對于PostgreSQL資料庫,設計的一整套備份政策

WAL歸檔政策

wal日志

所謂wal,即 write ahead log。存儲了資料庫系統中所有更改和操作的曆史,以確定資料庫不會因為故障(例如掉電或其他導緻伺服器崩潰的故障)而丢失資料。它是在寫的操作完成之前寫好,但當寫真正完成之後,它的意義似乎就沒那麼大了,但是絕不是以所用。雖然在預設的設定中wal歸檔并不是開啟的,而是會自動删除。

有時我們使用全備進行恢複資料時,時間點總是沒那麼精确,因為全備一般都是一段時間之前的資料,這之間的資料可以通過應用wal找回。這也是我們推薦開啟wal歸檔的原因

參數配置

在開啟wal日志歸檔前,首先需要設定幾個參數

  • wal_level = replica

    該參數的可選的值有minimal,replica和logical,wal的級别依次增高,在wal的資訊也越多。由于minimal這一級别的wal不包含從基礎的備份和wal日志重建資料的足夠資訊,在該模式下,無法開啟wal日志歸檔

  • archive_mode = on

    上述參數為on,表示打開歸檔備份,可選的參數為on,off,always 預設值為off,是以要手動打開

  • archive_command = 'cp %p /pgdata/10/archive_wals%f'

    該參數的預設值是一個空字元串,他的值可以是一條shell指令或者一個複雜的shell腳本。在shell腳本或指令中可以用 “%p” 表示将要歸檔的wal檔案包含完整路徑的資訊的檔案名,用“%f” 代表不包含路徑資訊的wal檔案的檔案名

注意:wal_level和archive_mode參數修改都需要重新啟動資料庫才可以生效。而修改archive_command則不需要。是以一般配置新系統時,無論當時是否需要歸檔,這要建議将這兩個參數開啟

歸檔政策腳本

這次分享的政策是使用一個shell腳本來管理歸檔:

在postgres家目錄下,分别建立bin,log目錄。bin目錄存放此腳本,log則記錄執行日志

歸檔政策是 在/data下的 archivedir中,按日期為名歸檔日志,保留20天。20天前的自動删除

archive_command參數的配置為:

archive_command ='/bin/bash /home/postgres/bin/pg_archive.sh %p %f'           

archive_command指令在歸檔時不再使用簡單的cp指令,而是使用預定好的腳本來備份,腳本内容為

#!/bin/bash
source /home/postgres/.bash_profile

DATE=`date +%Y%m%d`
DIR="/data/archivedir/$DATE"
BACK="/data/archivedir/"`date -d '-20 day' +%Y%m%d`
if [ -d "$BACK" ]; then
                rm -rf $BACK
                echo "success rm $BACK" > /home/postgres/logs/pg_archive_logs
        else
                echo "the old backup file not exists!" > /home/postgres/logs/pg_archive_logs
fi

(test -d $DIR || mkdir -p $DIR) && cp $1 $DIR/$2           

實體全備

使用pg_basebackup

PG資料庫自帶全備的備份指令,提供友善基礎備份的工具,這個指令會把整個資料庫執行個體的資料都拷貝出來。經常用來搭建主備 ,做全量備份

需要注意的是,在使用 pg_basebackup 的備份終端伺服器上,必須要有通路資料庫的權限,即在pg_hba.conf中要指定好權限

每一次的備份都會使用一個wal槽max_wal_senders。

備份腳本

每天一點備份,保留2周的全備

00 00 */1 * *     /home/postgres/bin/pgbackup.sh >/home/postgres/logs/pgbackup.log 2>&1 &

#!/bin/bash

back="/data/sas_pgbackup/"`date -d '-2 week' +%Y-%m-%d`

backf="/data/sas_pgbackup/"`date +%F`"/base.tar"

echo "starting backup....."

pg_basebackup -D /data/sas_pgbackup/`date +%F` -x -R -P -F t -U postgres

if [ -f "$backf" ]; then
    echo "success backup to $backf"
        if [ -d "$back" ]; then
                rm -rf $back
        echo "success rm $back"
        else
                echo "the old backup file not exists!"
        fi
else
    echo "backup failed, because of the file $backf not found"
fi           

備份管理工具

pg_rman

pg_rman是一款專門為PostgreSQL資料庫打造的優秀開源備份軟體,其使用的思路類似Oracle的rman,是一個非常友善的備份管理工具

pg_rman最大的亮點就是實作了增量備份,注意不是基于WAL日志的增量備份,是基于上次全量備份之後發生的變化資料塊的增量備份

pg_rman的備份原理給介紹一下:

  • pg_rman不是使用流複制協定進行拷份的,而是使用檔案拷貝,即先在主庫上執行pg_start_backup()函數,然後拷貝整個資料庫的資料目錄,最後再執行 pg_stop_backup()函數來結束備份。
  • 是以pg_rman必須和資料庫節點跑在一起。否則可以想的到是是無法拷貝資料庫的資料檔案,進而無法備份。是以通常備份時,需要使用NAS等NFS共享方法把備份機的檔案系統mount到資料庫機器上。
  • pg_rman可以在standby節點上做全庫的備份,但需要通過網絡連接配接到主庫上執行pg_start_backup和pg_stop_backup。
  • pg_rman需要主庫打開了歸檔才能更好的備份,是以需要在postgresql.conf中打開歸檔,以便讓pg_rman判斷出資料庫的歸檔目錄在哪裡。pg_rman主要是讀取postgresql.conf檔案中archive_command參數的值。
  • pg_rman還能備份PostgreSQL資料庫的一般程式日志,即pg_log目錄的日志檔案。是以pg_rman會讀取postgresql.conf中的log_directory參數以确定這些日志在哪個目錄下。當然這些程式日志通常不是太重要,可以不備份。

pg_rman使用

pg_rman的安裝不再贅述,說說它的簡單使用

做一次全備:

$ pg_rman backup --backup-mode=full
INFO: copying database files
INFO: copying archived WAL files
INFO: backup complete
INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.
           

全備完之後要校驗一下:

$ pg_rman validate
INFO: validate: "2019-6-13 17:45:07" backup and archive log files by CRC
INFO: backup "2019-6-13 17:45:07" is valid
然後用pg_rman show檢視狀态:

$ pg_rman show
=====================================================================
 StartTime EndTime Mode Size TLI Status
=====================================================================
2019-6-13 17:45:07 2019-6-13 17:45:09 FULL 50MB 1 OK           

此時便可看到full備份已經ok

在增量完成之後,如果過了一段時間,資料庫産生很多變化,還可以做全量備份

$ pg_rman backup --backup-mode=incremental --with-serverlog
INFO: copying database files
INFO: copying archived WAL files
INFO: copying server log files
INFO: backup complete
INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.
[postgres@pg01 ~]$ pg_rman show
=====================================================================
 StartTime EndTime Mode Size TLI Status
=====================================================================
2019-6-13 17:47:44 2019-6-13 17:47:46 INCR 67MB 1 DONE
2019-6-13 17:45:07 2019-6-13 17:45:09 FULL 50MB 1 OK

每次備份完成,不要忘了做pg_rman validate:

$ pg_rman validate
INFO: validate: "2019-6-13 17:47:44" backup, archive log files and server log files by CRC
INFO: backup "2019-6-13 17:47:44" is valid
$ pg_rman show
=====================================================================
 StartTime EndTime Mode Size TLI Status
=====================================================================
2019-6-13 17:47:44 2019-6-13 17:47:46 INCR 67MB 1 OK
2019-6-13 17:45:07 2019-6-13 17:45:09 FULL 50MB 1 OK