PostgreSQL備份與恢復(第三章)

作者:徐田原

pg_probackup備份工具

1.1 pg_probackup備份簡介

pg_probackup是管理PG資料庫叢集備份和恢復的工具。用於執行週期性備份PG例項。相容PG9。5,,96,10,11,12,13。和其他備份解決方案相比,提供下面優勢,幫助部署不同備份策略和處理大量資料。

1.2 pg_probackup功能與限制

1、增量備份。頁級別的增量備份,節省磁碟空間,加速備份和轉儲。有3種不同增量模式,根據資料流部署不同備份策略。

2、增量轉儲。頁級別的轉儲,在目標目錄中重用有效未更改的頁面來加速轉儲。

3、合併。幫助部署”incrementally updated backups”策略,無須進行完備備份。

4、驗證。自動資料一致性校驗和按需備份校驗,無須實際資料恢復。

5、校驗。使用checkdb命令按需驗證PG例項。

6、保留。根據保留策略管理存檔和備份。可以根據恢復實際或要保留的備份數配置保留策略。還可以為特定備份制定生存時間,過期的備份可以合併或者刪除。

7、並行化。在多個並行執行緒上進行備份、恢復、合併、刪除、驗證和檢驗。

8、壓縮。以壓縮狀態儲存備份資料以節省磁碟空間。

9、消除重複資料。透過不復制未更改的非資料檔案如_vm或者_fsm來節省磁碟空間。

10、遠端操作。備份位於遠端系統上的PG例項或遠端恢復備份。

11、從備機上進行備份。透過從備機上進行備份來避免主機上的額外負載。

12、外部目錄。備份位於資料目錄PGDATA之外的檔案和目錄,如指令碼、配置檔案、日誌或SQL轉儲檔案。

13、備份Catalog。以純文字或JSON格式獲取備份列表和相應的元資訊。

14、歸檔catalog。以純文字或JSON格式獲取所有WAL時間線和相應元資訊的列表。

15、部分還原。僅還原制定的資料庫或從轉儲中排出指定資料庫。

管理備份資料:pg_probackup建立一個備份目錄。這個目錄儲存所有備份檔案包括額外的元資訊,以及WAL歸檔。可以將不同例項的備份儲存在單個目錄的不同子目錄中。透過該工具可以進行完整備份和增量備份。

1、全量備份,包含從頭恢復資料庫叢集需要的所有資料檔案。

2、增量備份。只儲存自上次以來更改的資料。允許減小備份大小並加快備份操作。支援以下增量備份模式:

1)PAGE備份。掃描自上次備份以來歸檔的所有WAL檔案。新建立的備份僅包含WAL記錄到的頁面。如果這些檔案大小與資料庫叢集檔案總大小相當,則加速比較小,但備份佔用空間仍然較小。

2)DELTA備份。讀取PGDATA目錄下所有資料檔案,僅複製自上次備份以來的髒頁。無須持續歸檔。此外,該模式還可以施加與全量備份相同的只讀IO壓力。

3)PTRACK備份。會動態追蹤頁面改動。無須持續歸檔。每次更新資料頁時,都會在PTRACK點陣圖標記。由於一個頁面只需要PTRACK點陣圖中的一個bit,這個點陣圖非常小。跟蹤意味著會有開銷,但會顯著加速增量備份。

無論選擇哪種備份型別,都支援以下WAL傳遞策略:

1)自主備份,透過複製協議傳輸將叢集恢復到備份時的一致性狀態需要的所有WAL檔案。即使沒有設定連續歸檔,需要的WAL段也會包含在備份中。

2)歸檔備份,依賴於連續歸檔。

限制:備份和轉儲的PG必須block_size和wal_block_size相容且有相同主版本號;Windows下不支援ssh遠端備份;ssh遠端備份時,pg_probackup的版本必須相同。

1.3 pg_probackup安裝與使用

wget https://github。com/postgrespro/pg_probackup/archive/2。4。15。tar。gztar -zxvf 2。4。15。tar。gz cd pg_probackup-2。2。7/make USE_PGXS=1 PG_CONFIG=/data/postgresql/bin/pg_config top_srcdir=/home/postgres/postgresql-13。3make USE_PGXS=1 PG_CONFIG=/data/postgresql/bin/pg_config top_srcdir=/home/postgres/postgresql-13。3 install

一旦安裝了pg_probackup,請完成以下設定。

1.4 pg_probackup初始化備份目錄

所謂初始化:就是建立一個備份目錄;用於存放備份檔案和歸檔日誌檔案。

初始化備份目錄,請執行以下命令:

pg_probackup init -B backup_dir—— 示例pg_probackup init -B /data/postgres/probackup

pg_probackup建立備份目錄,其中包含以下子目錄:

—— wal/-wal檔案目錄。

—— backups/-備份檔案的目錄。

備份目錄初始化了就可以新增備份例項。

1.5 向備份目錄新增新的備份Instance

pg_probackup可以在一個備份目錄中儲存多個數據庫叢集的備份。要設定所需的子目錄,必須將備份例項新增到要備份的每個資料庫群集的備份目錄中。

要新增新的備份例項,請執行以下命令:

pg_probackup add-instance -B backup_dir -D data_dir ——instance instance_name [remote_options]—— 本地新增備份instance 示例pg_probackup add-instance -B /data/postgres/probackup -D /data/postgres/data ——instance local_6000

—— data_dir是要備份的群集的資料目錄。要設定和使用pg_probackup,需要對此目錄的寫訪問許可權。

—— instance_name是將儲存此群集的WAL和備份檔案的子目錄的名稱。

—— remote_options是可選引數,僅當data_dir位於遠端系統上時,才需要指定這些引數。後續在詳細講解,參考。

pg_probackup在備份目錄的 backups 和 wal 目錄下建立 instance_name 子目錄。backups/instance_name 目錄包含 pg_probackup。conf 控制此備份例項的pg_probackup設定的配置檔案。如果使用remote_選項執行此命令,則指定的引數將新增到pg_probackup。conf。

1.6 配置PostgreSQL叢集

如果使用非postgres使用者需要配置以下許可權

For PostgreSQL 10 or higher:$ psql -p 5432 -U postgresBEGIN;CREATE ROLE backup WITH LOGIN REPLICATION;GRANT USAGE ON SCHEMA pg_catalog TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。current_setting(text) TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。pg_is_in_recovery() TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。pg_start_backup(text, boolean, boolean) TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。pg_stop_backup(boolean, boolean) TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。pg_create_restore_point(text) TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。pg_switch_wal() TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。pg_last_wal_replay_lsn() TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。txid_current() TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。txid_current_snapshot() TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。txid_snapshot_xmax(txid_snapshot) TO backup;GRANT EXECUTE ON FUNCTION pg_catalog。pg_control_checkpoint() TO backup;COMMIT;

1.7 配置postgresql.conf

—— 確保wal_level引數高於minimal。

—— 如果要在primary上配置存檔,則存檔模式必須設定為“on”或“always”。要在standby下執行存檔,請將此引數設定為“always‘

—— 設定archive_命令引數,如下所示:

archive_command = ’install_dir/pg_probackup archive-push -B backup_dir ——instance instance_name ——wal-file-name=%f [remote_options]‘—— 示例/opt/pg13/bin/pg_probackup archive-push -B /data/postgres/probackup ——instance local_6000 ——wal-file-path=%p—— wal-file-name=%f

1.8 建立全量備份

建立備份,命令

pg_probackup backup -B backup_dir ——instance instance_name -b backup_mode

示例

pg_probackup backup -B /data/postgres/probackup ——instance local_6000 -b full

1.9 檢視備份

pg_probackup show -B /data/postgres/probackuppg_probackup show -B /data/postgres/probackup ——instance local_6000 -i QGQMKHpg_probackup show -B /data/postgres/probackup ——instance local_6000 ——archive

1.10 基於PITR備份與恢復

—— 備份pg_probackup backup -B /data/postgres/probackup ——instance local_6000 -b full——恢復之前需要先停庫;在清理PGDATA目錄以及外在的表空間目錄pg_ctl stop;rm -rf $PGDATA/*——恢復到新的PGDATA目錄pg_probackup restore -B /data/postgres/probackup ——instance local_6000 -D /data/postgres/data6000 ——recovery-target-time=’2021-07-11 11:05:17‘ 11:05:17’—— 恢復到原目錄pg_probackup restore -B /data/postgres/probackup ——instance local_6000 ——recovery-target-time=‘2021-07-11 11:05:17’

1.11 增量備份

—— 增量備份DELTApg_probackup backup -B /data/postgres/probackup ——instance local_6000 -b delta—— 增量備份pagepg_probackup backup -B /data/postgres/probackup ——instance local_6000 -b page—— https://postgrespro。com/docs/postgrespro/13/app-pgprobackup

1.12 遠端備份

——set up sshssh-copy-id postgres@node2——備份庫 新增備份例項pg_probackup add-instance -B /data/postgres/probackup -D /data/postgres/data ——instance pg207_6000 ——remote-proto=ssh ——remote-host=192。168。127。126 ——remote-port=22 ——remote-user=postgres ——remote-path=/opt/pg13/bin ——ssh-options=‘-o ServerAliveCountMax=5 -o ServerAliveInterval=60’——案例庫 配置的引數——備份需要用到postgres超級使用者;所以在pg_hba。conf;host all postgres 192。168。127。129/24 trust —— postgresql。confwal_level = replicaarchive_mode = onarchive_command = ‘/opt/pg13/bin/pg_probackup archive-push -B /data/postgres/probackup ——instance pg207_6000 ——wal-file-path=%p ——wal-file-name=%f ——remote-proto=ssh ——remote-host=192。168。127。129 ——remote-port=22 ——remote-user=postgres ——remote-path=/opt/pg12/bin’—— 備份庫; 執行遠端備份pg_probackup backup -B /data/postgres/probackup ——instance pg207_6000 -b full ——remote-proto=ssh ——remote-host=192。168。127。126 ——remote-port=22 ——remote-user=postgres ——remote-path=/opt/pg12/bin ——ssh-options=‘-o ServerAliveCountMax=5 -o ServerAliveInterval=60’——Take a FULL backup:pg_probackup-11 backup -B /mnt/backups ——instance ‘pg-11’ -b FULL ——stream ——remote-host=postgres_host ——remote-user=postgres -U backup -d backupdb——Take an incremental backup in the DELTA mode:pg_probackup-11 backup -B /mnt/backups ——instance ‘pg-11’ -b delta ——stream ——remote-host=postgres_host ——remote-user=postgres -U backup -d backupdb——pg_probackup-11 set-config -B /mnt/backups ——instance ‘pg-11’ ——remote-host=postgres_host ——remote-user=postgres -U backup -d backupdbpg_probackup-11 backup -B /mnt/backups ——instance ‘pg-11’ -b delta ——stream——pg_probackup-11 show-config -B /mnt/backups ——instance ‘pg-11’——pg_probackup-11 show -B /mnt/backups ——instance ‘pg-11’—— 備份庫;檢視備份pg_probackup show -B /data/postgres/probackup ——instance pg207_6000

1.13 遠端恢復

—— 恢復pg_probackup restore -B /data/postgres/probackup ——instance local_6000 ——recovery-target-time=‘2021-07-11 14:54:55’

1.14 delta模式和page模式的備份效能差異

測試目的:

本次測試pg_probackup工具的delta模式和page模式的備份效能差異

測試準備:

準備10億條資料(資料大小146G):

pgbench -i -s 10000 -U backup -h 127。0。0。1 pgbenchpgbench=# \dt List of relations Schema | Name | Type | Owner ————+——————————+————-+———— public | pgbench_accounts | table | backup public | pgbench_branches | table | backup public | pgbench_history | table | backup public | pgbench_tellers | table | backup(4 rows)pgbench=# select count(*) from pgbench_accounts; count —————— 1000000000(1 row)磁碟佔用:[postgres@ecos75]$ df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 7。5G 0 7。5G 0% /devtmpfs 7。5G 12K 7。5G 1% /dev/shmtmpfs 7。5G 9。2M 7。5G 1% /runtmpfs 7。5G 0 7。5G 0% /sys/fs/cgroup/dev/mapper/vg00-lv_root 20G 9。9G 8。8G 53% //dev/sda1 501M 335M 130M 73% /boot/dev/sda2 524M 12K 524M 1% /boot/efi/dev/sdb1 296G 147G 134G 53% /postgresql/data/dev/sdc1 296G 65M 281G 1% /postgresql/backuptmpfs 1。5G 0 1。5G 0% /run/user/0/dev/sdd1 296G 122G 160G 44% /postgresql/archive

全量備份(DELTA)

pg_probackup backup -B /postgresql/backup/ ——instance pgbak -j 4 -U probackup ——stream -b full[postgres@ecos75]$ pg_probackup backup -B /postgresql/backup/ ——instance pgbak -j 4 -U probackup ——stream -b full ——temp-slotINFO: Backup start, pg_probackup version: 2。4。15, instance: pgbak, backup ID: QLOIL1, backup mode: FULL, wal mode: STREAM, remote: false, compress-algorithm: none, compress-level: 1WARNING: This PostgreSQL instance was initialized without data block checksums。 pg_probackup have no way to detect data block corruption without them。 Reinitialize PGDATA with option ‘——data-checksums’。INFO: PGDATA size: 146GBINFO: Start transferring data filesINFO: Data files are transferred, time elapsed: 33m:19s2021-07-11 16:12:20。388 CST [24069] LOG: restore point ‘pg_probackup, backup_id QLOIL1’ created at 23/C00001782021-07-11 16:12:20。388 CST [24069] STATEMENT: SELECT pg_catalog。pg_create_restore_point($1)INFO: wait for pg_stop_backup()INFO: pg_stop backup() successfully executedINFO: Syncing backup files to diskINFO: Backup files are synced, time elapsed: 15sINFO: Validating backup QLOIL1INFO: Backup QLOIL1 data files are validINFO: Backup QLOIL1 resident size: 146GBINFO: Backup QLOIL1 completed時間:2021-07-11 15:39 ~ 2021-07-11 16:31

ps:出現如下錯誤,需要配置pg lib庫環境變數:

export LD_LIBRARY_PATH=/usr/local/postgresql-13。3/libERROR: could not connect to database postgres: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket ‘/var/run/postgresql/。s。PGSQL。5432’?

增量資料準備:

插入一億條增量資料(約15G資料)

pgbench -i -s 1000 -U probackup -h 127。0。0。1 pgbench_inc磁碟佔用:[postgres@ecos75]$ df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 7。5G 0 7。5G 0% /devtmpfs 7。5G 12K 7。5G 1% /dev/shmtmpfs 7。5G 9。1M 7。5G 1% /runtmpfs 7。5G 0 7。5G 0% /sys/fs/cgroup/dev/mapper/vg00-lv_root 20G 9。9G 8。8G 53% //dev/sda1 501M 335M 130M 73% /boot/dev/sda2 524M 12K 524M 1% /boot/efitmpfs 1。5G 0 1。5G 0% /run/user/0/dev/sdb1 296G 162G 119G 58% /postgresql/data/dev/sdc1 296G 147G 134G 53% /postgresql/backup/dev/sdd1 296G 13G 268G 5% /postgresql/archive

增量備份(DELTA)

pg_probackup backup -B /postgresql/backup/ ——instance pgbak -j 4 -U probackup ——stream -b delta ——temp-slot[postgres@ecos75]$ pg_probackup backup -B /postgresql/backup/ ——instance pgbak -j 4 -U probackup ——stream -b delta ——temp-slotINFO: Backup start, pg_probackup version: 2。4。15, instance: pgbak, backup ID: QLOMCV, backup mode: DELTA, wal mode: STREAM, remote: false, compress-algorithm: none, compress-level: 1WARNING: This PostgreSQL instance was initialized without data block checksums。 pg_probackup have no way to detect data block corruption without them。 Reinitialize PGDATA with option ‘——data-checksums’。INFO: Parent backup: QLOIL1INFO: PGDATA size: 161GBINFO: Start transferring data filesINFO: Data files are transferred, time elapsed: 31m:29s2021-07-11 17:32:00。310 CST [30184] LOG: restore point ‘pg_probackup, backup_id QLOMCV’ created at 26/C10001782021-07-11 17:32:00。310 CST [30184] STATEMENT: SELECT pg_catalog。pg_create_restore_point($1)INFO: wait for pg_stop_backup()INFO: pg_stop backup() successfully executedINFO: Syncing backup files to diskINFO: Backup files are synced, time elapsed: 0INFO: Validating backup QLOMCVINFO: Backup QLOMCV data files are validINFO: Backup QLOMCV resident size: 15GBINFO: Backup QLOMCV completed時間:2021-07-11 17:00 ~ 2021-07-11 17:35

全量備份(PAGE)

修改postgresql。confvi postgresql。confarchive_command=‘pg_probackup archive-push -B /postgresql/backup ——instance pgbak ——wal-file-name=%f’刪除增量庫pgbench_incpostgres=# drop database pgbench_inc;pg_probackup backup -B /postgresql/backup/ ——instance pgbak -j 4 -U probackup -b full[postgres@ecos75]$ pg_probackup backup -B /postgresql/backup/ ——instance pgbak -j 4 -U probackup -b fullINFO: Backup start, pg_probackup version: 2。4。15, instance: pgbak, backup ID: QLILZE, backup mode: FULL, wal mode: ARCHIVE, remote: false, compress-algorithm: none, compress-level: 1WARNING: This PostgreSQL instance was initialized without data block checksums。 pg_probackup have no way to detect data block corruption without them。 Reinitialize PGDATA with option ‘——data-checksums’。INFO: Wait for WAL segment /postgresql/backup/wal/pgbak/0000000100000020000000AE to be archivedINFO: PGDATA size: 146GBINFO: Start transferring data filesINFO: Data files are transferred, time elapsed: 38m:52sINFO: wait for pg_stop_backup()INFO: pg_stop backup() successfully executedvINFO: Syncing backup files to diskINFO: Backup files are synced, time elapsed: 14sINFO: Validating backup QLILZEINFO: Backup QLILZE data files are validINFO: Backup QLILZE resident size: 146GBINFO: Backup QLILZE completed時間:2021-07-12 08:57 ~ 2021-07-12 09:54

增量資料準備:

插入一億條增量資料(約15G資料)

pgbench -i -s 1000 -U probackup -h 127。0。0。1 pgbench_inc

磁碟佔用:

[postgres@ecos75]$ df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 7。5G 0 7。5G 0% /devtmpfs 7。5G 12K 7。5G 1% /dev/shmtmpfs 7。5G 18M 7。5G 1% /runtmpfs 7。5G 0 7。5G 0% /sys/fs/cgroup/dev/mapper/vg00-lv_root 20G 9。9G 8。8G 53% //dev/sda1 501M 335M 130M 73% /boot/dev/sda2 524M 12K 524M 1% /boot/efi/dev/sdb1 296G 162G 119G 58% /postgresql/data/dev/sdc1 296G 159G 122G 57% /postgresql/backuptmpfs 1。5G 0 1。5G 0% /run/user/0/dev/sdd1 296G 122G 159G 44% /postgresql/archive

增量備份(PAGE)

pg_probackup-12 backup -B /postgresql/backup/ ——instance pgbak -b PAGE -U probackup[postgres@ecos75]$ pg_probackup backup -B /postgresql/backup/ ——instance pgbak -b page -j 4 -U probackupINFO: Backup start, pg_probackup version: 2。4。15, instance: pgbak, backup ID: QLPZ42, backup mode: PAGE, wal mode: ARCHIVE, remote: false, compress-algorithm: none, compress-level: 1WARNING: This PostgreSQL instance was initialized without data block checksums。 pg_probackup have no way to detect data block corruption without them。 Reinitialize PGDATA with option ‘——data-checksums’。INFO: Wait for WAL segment /postgresql/backup/wal/pgbak/0000000100000029000000C8 to be archivedINFO: Parent backup: QLPUN6INFO: PGDATA size: 161GBINFO: Extracting pagemap of changed blocksINFO: Pagemap successfully extracted, time elapsed: 142 secINFO: Start transferring data filesINFO: Data files are transferred, time elapsed: 5m:16sINFO: wait for pg_stop_backup()INFO: pg_stop backup() successfully executedINFO: Syncing backup files to diskINFO: Backup files are synced, time elapsed: 8sINFO: Validating backup QLPZ42INFO: Backup QLPZ42 data files are validINFO: Backup QLPZ42 resident size: 15GBINFO: Backup QLPZ42 completed時間:2021-07-12 10:33 ~ 2021-07-12 10:44

測試結果:

本次只提供了測試流程和其中一次測試結果:

模式DELTAPAGE全量備份資料量:146G/10億 總耗時:52min 資料傳輸:34min 資料驗證:18min資料量:146G/10億 總耗時:57min 資料傳輸:39min 資料驗證:18min增量備份資料量:15G/1億 總耗時:35min 資料傳輸:31min 資料驗證:4min資料量:15G/1億 總耗時:11min 資料傳輸:8min 資料驗證:3min

透過本次測試發現,delta模式與page模式全量備份差異不明顯,增量備份方面,page模式比delta模式備份效率高3倍(在這個資料量級下,資料量越大,差異或許更大)