PostgreSQL12中實現增量備份與任意時間點恢復


在postgres中,能夠使用簡單的邏輯備份工具pg_dump做某個數據庫的完整備份

問題

如果數據庫在運行過程中發生故障, 使用邏輯備份只能將數據庫還原到備份時刻, 無法恢復到故障發生前的那個時刻;

由於誤操作修改或刪除了重要數據, 需要還原到誤操作前的那個時刻

解決方案

增量備份和任意時間點恢復

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

操作

1、配置數據庫、vim postgresql.conf

wal_level = replica
archive_mode = on
archive_command = 'cp %p /home/test/archive/%f && echo %f >> /home/test/archive/archive.list' 
wal_keep_segments
=1024

2、重啟數據庫

pg_ctl -D /home/test/data/ -l /home/test/log restart

3、此后數據庫的操作都會記錄wal日志文件到/home/test/archive目錄下

[test@localhost bin]$ ls /home/test/archive/
000000010000000000000001  000000010000000000000002  000000010000000000000003  000000010000000000000004  archive.list

4、創建基礎備份,可以使用pg_basebackup

pg_basebackup -D /home/test/back -Fp -v -P -Upostgres -R

5、測試數據准備

postgres=# create table t2(a int);
CREATE TABLE
postgres=# insert into t2 values (generate_series(1,1000000));
INSERT 0 1000000
記錄時間:
2020年 05月 09日 星期六 21:46:57 CST
 
        
postgres=# create table t3(a int);
CREATE TABLE
postgres=# insert into t3 values (generate_series(1,1000000));
INSERT 0 1000000

6、假定數據庫故障,停止數據庫,備份故障data並將基礎備份的back替換為新data

mv data data_back
mv back data

7、修改data目錄下postgresql.auto.conf

restore_command = 'cp /home/test/archive/%f %p > /home/test/archive/recovery.log 2>&1  '
recovery_target_time = '2020-05-09 21:46:57'
recovery_target_time表示要恢復到的時間點

8、啟動數據庫

 /usr/pgsql-12/bin/./pg_ctl -D data/ start

9、查看數據,可知t3未被恢復

[test@localhost ~]$ psql -Upostgres
psql (12.2)
輸入 "help" 來獲取幫助信息.

postgres=# \dt
              關聯列表
 架構模式 | 名稱 |  類型  |  擁有者
----------+------+--------+----------
 public   | t1   | 數據表 | postgres
 public   | t2   | 數據表 | postgres
(2 行記錄)

日志信息:

2020-05-09 21:40:15.638 CST [13422] 日志:  數據庫上次關閉時間為 2020-05-08 23:24:35 CST
2020-05-09 21:40:15.686 CST [13420] 日志:  數據庫系統准備接受連接
2020-05-09 22:05:18.986 CST [23055] 日志:  數據庫系統中斷;上一次的啟動時間是在2020-05-09 21:53:25 CST
2020-05-09 22:05:19.003 CST [23055] 日志:  正在進入備用模式
2020-05-09 22:05:19.019 CST [23055] 日志:  從歸檔中恢復日志文件 "000000010000000000000009"
2020-05-09 22:05:19.040 CST [23055] 日志:  redo 在 0/9000060 開始
2020-05-09 22:05:19.041 CST [23055] 日志:  在0/9000138上已到達一致性恢復狀態
2020-05-09 22:05:19.042 CST [23053] 日志:  數據庫系統准備接受只讀請求的連接
2020-05-09 22:05:19.055 CST [23055] 日志:  從歸檔中恢復日志文件 "00000001000000000000000A"
2020-05-09 22:05:19.384 CST [23055] 日志:  從歸檔中恢復日志文件 "00000001000000000000000B"
2020-05-09 22:05:19.837 CST [23055] 日志:  從歸檔中恢復日志文件 "00000001000000000000000C"
2020-05-09 22:05:20.343 CST [23055] 日志:  從歸檔中恢復日志文件 "00000001000000000000000D"
2020-05-09 22:05:20.986 CST [23055] 日志:  恢復停止在事物 494 提交之前, 時間 2020-05-09 21:47:16.174754+08
2020-05-09 22:05:20.986 CST [23055] 日志:  恢復操作已暫停
2020-05-09 22:05:20.986 CST [23055] 提示:  執行 pg_wal_replay_resume() 以繼續.

 the end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM