PG_備份還原系列之pg_rman


前言

安裝

前期准備

  創建備份和歸檔目錄

  修改PG歸檔配置

  初始化

設置備份策略

  全庫備份策略

  增量備份策略  

還原操作

后續操作

操作指令大全

exitcode

概念和配置參數

FAQ

 

前言

  PG_RMAN是Postgresql的一款插件,用於備份和還原PostgreSQL數據庫;它需要對整個數據庫集群,存檔WAL和服務器日志進行物理在線備份。

pg_rman支持使用PostgreSQL 9.0之后從備用站點獲取備份,還支持存儲快照備份。

pg_rman具有以下功能:

  • 僅使用一個命令即可對整個數據庫(包括表空間)進行備份。
  • 只需一個命令即可從備份中恢復。
  • 支持增量備份和備份文件壓縮,以便占用更少的磁盤空間。
  • 管理備份版本並顯示備份目錄。
  • 支持存儲快照。

pg_rman支持以下命令:

  • init --初始化備份目錄。
  • backup --進行在線備份。
  • restore --還原。
  • show --顯示備份歷史記錄。詳細信息選項顯示每個備份的附加信息。
  • validate --驗證備份文件。未經驗證的備份不能用於還原和增量備份。
  • delete --刪除備份文件。
  • purge --從備份目錄中刪除已刪除的備份。

安裝

可以從以下鏈接下載對應版本的pg_rman;

安裝方法1

--從源碼編譯安裝,缺包編譯報錯需要下載對應包任何重試
$ cd pg_rman
$ make
$ make install
--將生成的pg_rman拷貝到/opt/pgsql/12/bin、/usr/bin

安裝方法2

--RPM包安裝
# rpm -ivh pg_rman-x.x.xx-x.pgxx.rhelx.x86_64.rpm
--默認生成在/usr/pgxxx下面
--將生成的pg_rman拷貝到/opt/pgsql/12/bin、/usr/bin

前期准備

創建備份和歸檔目錄

備份和歸檔的目錄需要單獨掛盤,不能跟數據目錄放一起,因為會影響在線系統IO,推薦掛NFS遠程盤進行遠程備份。

--創建備份目錄
mkdir /pg_basebackup
--創建wal歸檔目錄
mkdir /pg_arch
--配置環境變量
echo 'export BACKUP_PATH=/pg_basebackup'>>~/.bash_profile
echo 'export ARCLOG_PATH=/pg_arch'>>~/.bash_profile

修改PG歸檔配置

為了對歸檔進行保存,修改歸檔相關配置

 --在$PGDATA目錄下創建arch.sh,保留30天歸檔
test ! -f /pg_arch/$1 && cp --preserve=timestamp $2 /pg_arch/$1 ; find /pg_arch/ -type -f mtime +30 -exec rm -f {} \;
--修改postgresql.conf配置
archive_mode=on   #開啟歸檔
archive_command= 'arch.sh %f %p' #shell腳本
archive_timeout=900 #強制wal日志切換時間
--重啟PG
pgrestart

初始化

--初始化
PGPASSWORD=XXX $PGHOME/bin/pg_rman -D $PGDATA -B /pg_basebackup -A /pg_arch -P -v init
--修改/pg_basebackup/pg_rman.ini配置文件,配置備份、歸檔保存天數
ARCLOG_PATH='/pg_arch'
SRVLOG_PATH='/pgsql/12/data/pg_log'
#配置壓縮參數
COMPRESS_DATA=YES
#歸檔日志保留天數
KEEP_ARCLOG_DAYS=14
#KEEP_ARCLOG_FILES=1000 --歸檔保留個數
#備份保留天數
KEEP_DATA_DAYS=30

設置備份策略

全庫備份策略

整個數據庫備份和存檔備份

--可以配置到crontab中每周日晚上執行一次
0 1 * * 0 root sh fullback.sh
--腳本fullback.sh,備份完必須執行validate,否則備份不能用於還原
PGPASSWORD=XXX $PGHOME/bin/pg_rman -D $PGDATA -B /pg_basebackup -A /pg_arch -P -v -b full backup
PGPASSWORD=XXX $PGHOME/bin/pg_rman  -B /pg_basebackup validate

增量備份策略

增量備份和存檔備份

--可以配置到crontab中每周日晚上執行一次
0 23 * * * root sh inrback.sh

--腳本inrback.sh
PGPASSWORD=XXX $PGHOME/bin/pg_rman -D $PGDATA -B /pg_basebackup -A /pg_arch -P -v -b incremental backup
PGPASSWORD=XXX $PGHOME/bin/pg_rman  -B /pg_basebackup validate

--查看備份情況
pg_rman -a show
$ pg_rman show

=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================

2015-07-30 13:31:08  2015-07-30 13:31:10  FULL    14MB    15  OK
2015-07-30 13:30:37  2015-07-30 13:30:38  ARCH    53kB    15  OK
2015-07-30 13:30:32  2015-07-30 13:30:33  ARCH    26kB    15  OK
2015-07-30 13:30:11  2015-07-30 13:30:13  FULL    14MB    15  OK
2015-07-30 13:28:10  2015-07-30 13:28:11  INCR   120kB    14  OK
2015-07-30 13:27:45  2015-07-30 13:27:46  INCR    54kB    14  OK
2015-07-30 13:27:32  2015-07-30 13:27:33  INCR    54kB    14  OK
2015-07-30 13:27:25  2015-07-30 13:27:26  INCR    54kB    14  OK
2015-07-30 13:24:02  2015-07-30 13:24:04  FULL    14MB    14  OK

還原操作

任何數據庫恢復操作,操作前都需要對原$PGDATA目錄進行備份;

--確認實例已經停掉
pgstop

--備份
cp -r $PGDATA /pgsql/12/data_bak
mkdir -p /pg_arch/arch_bak
cp -r /pg_arch/* /pg_arch/arch_bak

--還原到指定時間點or最新
PGPASSWORD=XXX $PGHOME/bin/pg_rman -D $PGDATA -B /pg_basebackup -A /pg_arch -P -v restore --recovery-target-time '2020-12-02 03:04:54'
PGPASSWORD=XXX $PGHOME/bin/pg_rman -D $PGDATA -B /pg_basebackup -A /pg_arch -P -v restore --recovery-target-timeline 'latest'

后續操作

--修改權限
chmod 700 $PGDATA
chown -R postgres:postgres $PGDATA

--啟動PG
pgstart

--啟動完后注釋掉postgres.conf最后還原配置
#restore_command='xxx'
#recovery-target-timeline='xxx'

--確認沒問題后干掉arch的備份目錄,不刪除會導致下次整庫備份報錯
rm -rf /pg_arch/arch_bak

--找時間重新做一份整庫備份

操作指令大全

1、初始化指令
PGPASSWORD=XXX $PGHOME/bin/pg_rman -D $PGDATA -B /pg_basebackup -A /pg_arch -P init

2、全庫備份指令(用於還原需要在執行驗證指令)
PGPASSWORD=XXX $PGHOME/bin/pg_rman -D $PGDATA -B /pg_basebackup -A /pg_arch -P -v -b full backup

3、增量備份策略(用於還原需要在執行驗證指令)
PGPASSWORD=XXX $PGHOME/bin/pg_rman -D $PGDATA -B /pg_basebackup -A /pg_arch -P -v -b incremental backup

4、standby節點全庫備份
pg_rman backup -D /home/postgres/pgdata_sby(備節點) -b full --host=masterIP --standby-host=standbyIP --standby-port=5432

5、驗證備份文件。未經驗證的備份不能用於還原和增量備份。
PGPASSWORD=XXX $PGHOME/bin/pg_rman  -B /pg_basebackup validate

6、備份查看指令
$PGHOME/bin/pg_rman -a show

7、備份刪除指令
pg_rman delete 2020-11-30 13:30:30

8、刪除已刪除的備份,盡管該delete命令從文件系統中刪除了實際數據,但是仍然保留一些已刪除備份的目錄信息
pg_rman purge

exitcode

Code

Name

Description

0

SUCCESS

Succeeded.

1

HELP

Print a help, then exit.

2

ERROR

Generic error.

3

FATAL

Exit because of repeated errors

4

PANIC

Unknown critical condition.

10

ERROR_SYSTEM

I/O or system error.

11

ERROR_NOMEM

Out of memory.

12

ERROR_ARGS

Invalid input parameters.

13

ERROR_INTERRUPTED

Interrupted by user. (Ctrl+C etc.)

14

ERROR_PG_COMMAND

SQL error.

15

ERROR_PG_CONNECT

Cannot connect to PostgreSQL server.

20

ERROR_ARCHIVE_FAILED

Cannot archive WAL files.

21

ERROR_NO_BACKUP

Backup file not found.

22

ERROR_CORRUPTED

Backup file is broken.

23

ERROR_ALREADY_RUNNING

Cannot start because another pg_rman is running.

24

ERROR_PG_INCOMPATIBLE

Version conflicted with PostgreSQL server.

25

ERROR_PG_RUNNING

Cannot restore because PostgreSQL server is running.

26

ERROR_PID_BROKEN

postmaster.pid file is broken.

概念和配置參數

時間線:

參考下面鏈接文章

http://mysql.taobao.org/monthly/2015/07/03/

歸檔恢復設置
restore_command:用於獲取一個已歸檔段的XLOG日志文件的命令
archive_cleanup_command:清除不在需要的XLOG日志文件的命令
recovery_end_command:歸檔恢復結束后執行的命令

恢復目標設置(默認情況下,數據庫將會一直恢復到 WAL 日志的末尾)
recovery_target = ’immediate’:在從一個在線備 份中恢復時,這意味着備份結束的那個點
recovery_target_name (string):這個參數指定(pg_create_restore_point()所創建)的已命名的恢復點,將恢復到該恢復點
recovery_target_time (timestamp):這個參數指定恢復到的時間戳
recovery_target_xid (string):這個參數指定恢復到的事務 ID
recovery_target_inclusive (boolean):指定是否在指定的恢復目標之后停止(true),或者在恢復目標之前停止 (false);適用於recovery_target_time或者recovery_target_xid被指定的情況;這個設置分別控制事務是否有准確的目標提交時間或 ID 是否將被包括在該恢復中;默認值為 true
recovery_target_timeline (string):指定恢復到一個特定的時間線
recovery_target_action (enum):指定在達到恢復目標時服務器應該立刻采取的動作,包括pause(暫停)、promote(接受連接)、shutdown(停止服務器),其中pause為默認動作

備庫參數設置
standby_mode(boolean):為on表示作為一個備庫,否則不為備庫
primary_conninfo (string):指定備庫連接主庫的連接字符串
primary_slot_name (string):通過流復制指定主庫的一個復制槽來復制主庫數據,如果沒有設置primary_conninfo,則此參數無效
trigger_file (string):指定一個觸發器文件,該文件存在可以結束備庫的恢復,即升級備庫為一個獨立的主庫
recovery_min_apply_delay (integer):這個參數允許將恢復延遲一段固定的時間,如果沒有指定單位則以毫秒為單位。
如果recovery.conf中同時指定了recoveryTargetXid、recoveryTargetName、recoveryTargetTime時,PostgreSQL會按照RECOVERY_TARGET_XID> RECOVERY_TARGET_NAME > RECOVERY_TARGET_TIME的優先級來獲取最終的目標恢復位點。

如果在recovery.conf指定recovery_targetTimeLine為latest,則可以基於當前TimeLineID為起點尋找最新時間線:

尋找當前TimeLineID的時間線歷史文件“XXX.history”,如果存在則繼續尋找,否則錯誤退出
TimeLineID是線性增長的,將當前TimeLineID自增1尋找是否存在時間線歷史文件,直到不存在對應的時間線歷史文件為止,即可找到最新的時間線。

FAQ

1. 還原啟動時報錯,“invalid checkpoint record”
  查看backup_label文件,發現WAL檢查點所在歸檔文件是存在的,在postgresql.conf中restore_command是一個cp指令,試試該指令,發現報錯權限不足,將路徑下目錄賦予權限后,正常啟動。

2. full backup時報錯,歸檔文件不存在
  pg_rman備份指令加-v 顯示詳細信息,發現是/pg_arch/bak報錯,bak目錄是之前還原時歸檔的備份,刪除后full backup正常。

3.還原到指定時間點后,數據庫處於只讀狀態
  pg還原到指定時間點默認動作recovery_target_action='pause',暫停;此時可以用超戶執行select pg_wal_replay_resume(); 或者在啟動數據庫實例前在postgresql.conf中添加recovery_target_action='promote'
4.關於能否前滾,現在有個問題假如星期一到星期五的歸檔都在,星期三做了一份全量備份,星期一之前無備份,那么能否回到星期二?
  

 

 

參考文獻:

http://ossc-db.github.io/pg_rman/index.html


免責聲明!

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



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