概述
任何資料庫搭建完成,準備投入使用之後,首先要确定的就是資料庫的備份政策,合理有規劃的備份是資料安全的關鍵。
以下就是針對于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