本系列主要是介紹基于pg10版本的日志備份技術悠夯,如何實現(xiàn)自動日志備份(主要是筆者業(yè)務上有這種功能,嘗試了幾天幾夜疗疟,特此記錄下)瞳氓,本篇文章是基礎篇,主要介紹pg的幾種數(shù)據(jù)備份方式店诗。
如果你已經熟悉音榜,可以看pg單機自動化日志備份系列二
一、pg_dump
) 和 pg_restore
?以下描述摘自官方文檔
pg_dump是一個用于備份PostgreSQL 數(shù)據(jù)庫的工具擦囊。
它甚至可以在數(shù)據(jù)庫正在使用的時候進行完整一致的備份嘴办。 pg_dump并不阻塞其它用戶對數(shù)據(jù)庫的訪問(讀或者寫)
pg_restore用于恢復由pg_dump 轉儲的任何非純文本格式中的PostgreSQL數(shù)據(jù)庫。
它將發(fā)出必要的命令重建數(shù)據(jù)庫涧郊,并把它恢復成轉儲時的樣子。 歸檔(備份)文件還允許pg_restore有選擇地進行恢復彤灶, 甚至在恢復前重新排列條目的順序.
? 描述已經說了兩者大概功能批旺,筆者平時也用pg_dump + psql 進行一些數(shù)據(jù)的轉移,但是從使用心得來看汽煮,pg_dump每次備份就相當于全量備份,所以進行數(shù)據(jù)恢復時搬卒,也不能恢復到某一個時間點的數(shù)據(jù)翎卓,所以不采用pg_dump + pg_restore 進行自動化日志備份。(由使用pg_dump需求的同學坯门,請自行去查閱官方文檔)
? 然后pg_dump每次只轉儲一個數(shù)據(jù)庫,如果有更高的需求古戴,可以看看pg_dumpall。
二肃续、文件系統(tǒng)級別備份
? 說白了叉袍,就是復制pg的數(shù)據(jù)文件,但是在某些條件下喳逛,有缺點,比如用tar -cf backup.tar /var/lib/postgresql/data
進行復制姐呐,有一下兩點:
? 1典蝌、數(shù)據(jù)庫服務器必須被關閉,官方文檔表示可能是tar和類似工具無法得到文件系統(tǒng)狀態(tài)的一個原子的快照赠法,還有服務器內部緩沖的原因。
? 2款侵、如果想通過相應的文件或者目錄來備份或恢復特定的表或者數(shù)據(jù)庫侧纯,是行不通的,因為缺少必要的日志文件(日志文件包含了事務的提交狀態(tài))眶熬。
?上面這種方式筆者沒有嘗試過(別怪我,真的是拳缠,精力有限贸弥。。。)哲鸳,不過,在開啟wal歸檔備份的時候徙菠,筆者通過cp -rf /var/lib/postgresql/data/ /var/lib/postgresql/test
復制整個目錄的方式(沒有關閉數(shù)據(jù)庫)婿奔,可以進行一次全量備份,而且在數(shù)據(jù)庫啟動時脸秽,也能成功加載出數(shù)據(jù)蝴乔。不過不能在任意時間點進行恢復。根據(jù)官方文檔的解釋片酝,是因為創(chuàng)建了數(shù)據(jù)目錄的的“一致快照”挖腰,而且備份文件在數(shù)據(jù)看來就像是出了故障,所以用備份數(shù)據(jù)啟動數(shù)據(jù)庫的時候猴仑,就會嘗試重放WAL日志(就是做redo),成功的進行數(shù)據(jù)恢復疾渣。
三崖飘、wal歸檔 和 基礎備份(全量備份)
?wal歸檔就是預寫式日志
,就是記錄了數(shù)據(jù)頁的修改記錄朱浴。pg痛過開啟wal歸檔,記錄下事務的執(zhí)行日志项乒,通過這些日志就可以支持任意時間點的數(shù)據(jù)恢復梁沧,即PITR。具體詳細介紹
? 啟用wal歸檔功能埃碱,需要對pg配置文件postgresql.conf
進行修改:
1、wal_level = replica
2砚殿、archive_mode = on
# backup_in_progress文件用來輔助wal日志備份,通過刪除配合test指令控制wal日志備份
3辛萍、archive_command = 'test ! -f /var/lib/postgresql/backup_in_progress || (test ! -f /var/lib/postgresql/pg_log_archive/%f && cp %p /var/lib/postgresql/pg_log_archive/%f)'
?/var/lib/postgresql/pg_log_archive
是存放wal日志備份的地方羡藐。配置完成后,啟動數(shù)據(jù)庫辉阶,就開啟了wal日志備份瘩扼,在wal段文件達到16MB時,就會執(zhí)行一次歸檔集绰。當然也可以手動執(zhí)行select pg_switch_wal();
進行歸檔。
? wal歸檔功能有了罕袋,但是這只是相當于差異備份碍岔,還需要全量備份,下面就來看看全量備份(基礎備份):
1付秕、使用底層API進行,參考點
touch /var/lib/postgresql/backup_in_progress
# 開始基礎備份,可以在代碼里連接數(shù)據(jù)庫執(zhí)行
psql -c "select pg_start_backup('hot_backup');" # 需要用postgres用戶
# 將數(shù)據(jù)庫文件進行備份
tar -cf /var/lib/postgresql/backup.tar /var/lib/postgresql/data/
# 結束備份,可以在代碼里連接數(shù)據(jù)庫執(zhí)行
psql -c "select pg_stop_backup();" # 需要用postgres用戶
# 停止wal日志備份
rm /var/lib/postgresql/backup_in_progress
# 將wal日志和基礎備份打包在一起
tar -rf /var/lib/postgresql/backup.tar /var/lib/postgresql/pg_log_archive
2掠河、使用pg_basebackup
su - postgres; # 切換到 postgres用戶
# 執(zhí)行備份
pg_basebackup -Ft -X none -D - | gzip > /var/lib/postgresql/%f_base.tar.gz;
四猛计、時間點恢復(PITR)
假設我們有一份備份文件,基礎備份:/var/lib/postgresql/backup_base.tar.gz
和 wal歸檔目錄:/var/lib/postgresql/pg_log_archive
勾拉,pg的數(shù)據(jù)目錄是:/var/lib/postgresql/data/pgdata
通過以上步驟進行數(shù)據(jù)恢復:
1、解壓數(shù)據(jù)
tar xvfz /var/lib/postgresql/backup_base.tar.gz -C /var/lib/postgresql/data/pgdata
2成肘、配置recovery.conf
vim /var/lib/postgresql/data/pgdata/recovery.conf
# recovery.conf 配置下面兩行
# 利用wal日志進行redo
restore_command = 'cp /var/lib/postgresql/pg_log_archive/%f %p'
# 指定要恢復的時間點斧蜕,也可以不指定,直接恢復所有數(shù)據(jù)
recovery_target_time = '2019-10-10 18:00:00 UTC'
3批销、指定/var/lib/postgresql/data/pgdata
為pg的數(shù)據(jù)目錄啟動pg,就可以進行數(shù)據(jù)恢復丘逸。如果是指定恢復到某一時間點掀宋,即有recovery_target_time
配置項,在啟動數(shù)據(jù)庫后囤萤,還需要執(zhí)行語句select pg_wal_replay_resume();
開啟wal備份是趴,完成本次數(shù)據(jù)恢復操作澄惊。
下一篇:pg單機自動化日志備份系列二