天天看點

PostgreSQL備份工具 pgBackRest使用

pgBackRest是一款開源的備份還原工具,目标旨在為備份和還原提供可靠易用的備份。

前言

特性

并行備份和還原

備份操作期間壓縮通常是其瓶頸所在。pgBackRest通過并行處了解決了備份期間壓縮出現的瓶頸問題。

本地遠端操作

自定義協定允許 pgBackRest以最小化配置通過SSH在本地或者遠端執行備份、還原和歸檔。并且該程式也通過協定層提供了PostgreSQL查詢接口,以便于必須要再遠端通路PostgreSQL,進而保證了其安全性能。

全量,增量和差異備份

支援全量,增量和差異備份。pgBackRest不受異步時間影響,是以差異和增量備份完全安全。

備份保留政策和和歸檔過期

支援保留政策設定可以在任意時間建立全備和差異備份的覆寫。

備份完整性

可以計算備份中每個檔案的校驗和,并在還原期間重新檢查。備份完成檔案複制後,将等待直到每個WAL段所需的備份保持一緻然後存儲到備份倉庫中。

塊校驗和

斷點備份

流壓縮和校驗和

增量還原

并行異步WAL Push和Get

表空間重新映射和Link支援

S3存儲支援和Azure相容對象存儲支援

加密

使用

安裝

解壓

[postgres@pgserver12 tools]$ tar -zxf pgbackrest-release-2.31.tar.gz 
[postgres@pgserver12 tools]$ ls      

建立必要目錄

ostgres@sungsasong ~]$ sudo mkdir -p -m 770 /var/log/pgbackrest
[postgres@sungsasong ~]$ sudo chown postgres.postgres /var/log/pgbackrest/
[postgres@sungsasong ~]$ sudo mkdir -p /etc/pgbackrest
[postgres@sungsasong ~]$ sudo mkdir -p /etc/pgbackrest/conf.d
[postgres@sungsasong ~]$ sudo touch /etc/pgbackrest/pgbackrest.conf
[postgres@sungsasong ~]$ sudo chmod 640 /etc/pgbackrest/pgbackrest.conf 
[postgres@sungsasong ~]$ sudo chown postgres.postgres -R /etc/pgbackrest/
[postgres@sungsasong ~]$ sudo mkdir /usr/bin/pgbackrest
[postgres@sungsasong ~]$ sudo chown postgres.postgres /usr/bin/pgbackrest/
[postgres@sungsasong ~]$ sudo chmod 755 /usr/bin/pgbackrest/      

編譯安裝

[postgres@sungsasong src]$ ./configure --prefix=/usr/bin/pgbackrest/
[postgres@sungsasong src]$ make  -j24
[postgres@sungsasong src]$ make install -j24
install -d /usr/bin/pgbackrest/bin
install -m 755 pgbackrest /usr/bin/pgbackrest/bin      

指令測試

[postgres@sungsasong src]$ /usr/bin/pgbackrest/bin/pgbackrest 
pgBackRest 2.31 - General help

Usage:
    pgbackrest [options] [command]

Commands:
    archive-get     Get a WAL segment from the archive.
    archive-push    Push a WAL segment to the archive.
    backup          Backup a database cluster.
    check           Check the configuration.
    expire          Expire backups that exceed retention.
    help            Get help.
    info            Retrieve information about backups.
    restore         Restore a database cluster.
    stanza-create   Create the required stanza data.
    stanza-delete   Delete a stanza.
    stanza-upgrade  Upgrade a stanza.
    start           Allow pgBackRest processes to run.
    stop            Stop pgBackRest processes from running.
    version         Get version.

Use 'pgbackrest help [command]' for more information.      

配置資料庫監聽和通路及日志(可選)

[postgres@sungsasong pgbackrest-release-2.31]$ egrep "10.10" $PGDATA/pg_hba.conf
host    all             all             10.10.20.0/24           trust
[postgres@sungsasong pgbackrest-release-2.31]$ egrep -v "^#" $PGDATA/postgresql.auto.conf
logging_collector = 'on'
listen_addresses = '*'      

配置PostgreSQL資料庫資料存儲目錄

[postgres@sungsasong src]$ cat >>/etc/pgbackrest/pgbackrest.conf <<EOF
> [demo]
> pgl-path=/data/pg10/pgdata
> EOF      

配置環境變量

[postgres@sungsasong ~]$ echo "export PATH=/usr/bin/pgbackrest/bin:\$PATH" >> .bashrc       

建立備份和歸檔倉庫

[postgres@sungsasong ~]$ sudo mkdir -p /pgbackrest/repos
[postgres@sungsasong ~]$ sudo chmod 750 /pgbackrest/ -R
[postgres@sungsasong ~]$ sudo chown postgres.postgres /pgbackrest/  -R      

将倉庫路徑加載在pgBackRest配置檔案中

[postgres@sungsasong ~]$ cat /etc/pgbackrest/pgbackrest.conf 
[demo]
pgl-path=/data/pg10/pgdata

[global]
repol-path=/pgbackrest/repos      

配置資料庫歸檔

[postgres@sungsasong ~]$ egrep -v "^#" $PGDATA/postgresql.auto.conf
logging_collector = 'on'
archive_mode = 'on'
archive_command = 'pgbackrest --stanza=demo archive-push %p'
listen_addresses = '*'
log_filename = 'postgresql.log'
log_line_prefix = ''
max_wal_senders = '3'
wal_level = 'replica'      

重新啟動資料庫

[postgres@sungsasong ~]$ pg_ctl  restart -D $PGDATA -l /tmp/logfile
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started      

可選配置歸檔壓縮

[postgres@sungsasong ~]$ cat /etc/pgbackrest/pgbackrest.conf 
[demo]
pgl-path=/data/pg10/pgdata

[global]
repol-path=/pgbackrest/repos

[global:archive_push]
compress-level=3      

配置基于保留政策的歸檔

[postgres@sungsasong ~]$ cat /etc/pgbackrest/pgbackrest.conf 
[demo]
pg1-path=/data/pg10/pgdata
pg1-host-config-path=/data/pg10/pgbackrest
pg1-host-port=22
pg1-host-user=postgres
pg1-host=sungsasong
pg1-port=10001
pg1-user=postgres

[global]
repo1-path=/pgbackrest/repos
repo1-retention-full=2

[global:archive_push]
compress-level=3      

建立存儲空間并檢查配置

[postgres@sungsasong ~]$ pgbackrest --stanza=demo --log-level-console=info  stanza-create 
2021-01-08 20:42:58.887 P00   INFO: stanza-create command begin 2.31: --exec-id=9283-e9744c3e --log-level-console=info --pg1-host=sungsasong --pg1-host-config-path=/data/pg10/pgbackrest --pg1-host-port=22 --pg1-host-user=postgres --pg1-path=/data/pg10/pgdata --pg1-port=10001 --pg1-user=postgres --repo1-path=/pgbackrest/repos --stanza=demo
2021-01-08 20:42:59.835 P00   INFO: stanza-create command end: completed successfully (948ms)      

檢查配置

[postgres@sungsasong ~]$ pgbackrest --stanza=demo --log-level-console=info check
2021-01-08 21:41:29.851 P00   INFO: check command begin 2.31: --exec-id=21648-1862ac0d --log-level-console=info --pg1-path=/data/pg10/pgdata --pg1-port=10001 --pg1-user=postgres --repo1-path=/pgbackrest/repos --stanza=demo
2021-01-08 21:41:32.826 P00   INFO: WAL segment 000000010000000000000006 successfully archived to '/pgbackrest/repos/archive/demo/10-1/0000000100000000/000000010000000000000006-2f027934f4f35cd3983ca4b1b7b43c32ab089448.gz'
2021-01-08 21:41:32.826 P00   INFO: check command end: completed successfully (2975ms)      

執行備份

預設為增量備份,增量備份将會請求一個基礎全備,如果沒有基礎全備,增量備份将會變更到全備。

pgbackrest --stanza=demo --log-level-console=info backup
2021-01-08 21:43:55.014 P00   INFO: backup command begin 2.31: --exec-id=21661-13c54272 --log-level-console=info --pg1-path=/data/pg10/pgdata --pg1-port=10001 --pg1-user=postgres --repo1-path=/pgbackrest/repos --repo1-retention-full=2 --stanza=demo
WARN: no prior backup exists, incr backup has been changed to full
...
此處省略很多輸出
...
2021-01-08 21:44:00.951 P00   INFO: full backup size = 23.3MB
2021-01-08 21:44:00.951 P00   INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
2021-01-08 21:44:01.153 P00   INFO: backup stop archive = 000000010000000000000008, lsn = 0/8000130
2021-01-08 21:44:01.154 P00   INFO: check archive for segment(s) 000000010000000000000008:000000010000000000000008
2021-01-08 21:44:01.273 P00   INFO: new backup label = 20210108-214355F
2021-01-08 21:44:01.301 P00   INFO: backup command end: completed successfully (6288ms)
2021-01-08 21:44:01.301 P00   INFO: expire command begin 2.31: --exec-id=21661-13c54272 --log-level-console=info --repo1-path=/pgbackrest/repos --repo1-retention-full=2 --stanza=demo
2021-01-08 21:44:01.304 P00   INFO: expire command end: completed successfully (3ms)      

可以定義備份的類型為增量還是差異備份

使用—type參數指定

[postgres@sungsasong ~]$ pgbackrest --stanza=demo --log-level-console=info --type=diff backup
2021-01-08 21:47:00.964 P00   INFO: backup command begin 2.31: --exec-id=21671-d3f8f8bf --log-level-console=info --pg1-path=/data/pg10/pgdata --pg1-port=10001 --pg1-user=postgres --repo1-path=/pgbackrest/repos --repo1-retention-full=2 --stanza=demo --type=diff
2021-01-08 21:47:01.770 P00   INFO: last backup label = 20210108-214355F, version = 2.31
2021-01-08 21:47:01.770 P00   INFO: execute non-exclusive pg_start_backup(): backup begins after the next regular checkpoint completes
2021-01-08 21:47:02.309 P00   INFO: backup start archive = 00000001000000000000000A, lsn = 0/A000028
2021-01-08 21:47:03.617 P01   INFO: backup file /data/pg10/pgdata/global/pg_control (8KB, 99%) checksum 5f020e7df484269ea245041be3228673560184ef
2021-01-08 21:47:03.721 P01   INFO: backup file /data/pg10/pgdata/pg_logical/replorigin_checkpoint (8B, 100%) checksum 347fc8f2df71bd4436e38bd1516ccd7ea0d46532
2021-01-08 21:47:03.722 P00   INFO: diff backup size = 8KB
2021-01-08 21:47:03.722 P00   INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
2021-01-08 21:47:03.942 P00   INFO: backup stop archive = 00000001000000000000000A, lsn = 0/A0000F8
2021-01-08 21:47:03.943 P00   INFO: check archive for segment(s) 00000001000000000000000A:00000001000000000000000A
2021-01-08 21:47:04.062 P00   INFO: new backup label = 20210108-214355F_20210108-214701D
2021-01-08 21:47:04.092 P00   INFO: backup command end: completed successfully (3129ms)
2021-01-08 21:47:04.092 P00   INFO: expire command begin 2.31: --exec-id=21671-d3f8f8bf --log-level-console=info --repo1-path=/pgbackrest/repos --repo1-retention-full=2 --stanza=demo
2021-01-08 21:47:04.095 P00   INFO: expire command end: completed successfully (3ms)      

備份資訊檢視

[postgres@sungsasong ~]$ pgbackrest info
stanza: demo
    status: ok
    cipher: none

    db (current)
        wal archive min/max (10-1): 000000010000000000000001/00000001000000000000000A

        full backup: 20210108-214355F
            timestamp start/stop: 2021-01-08 21:43:55 / 2021-01-08 21:44:01
            wal start/stop: 000000010000000000000008 / 000000010000000000000008
            database size: 23.3MB, backup size: 23.3MB
            repository size: 2.7MB, repository backup size: 2.7MB

        diff backup: 20210108-214355F_20210108-214701D
            timestamp start/stop: 2021-01-08 21:47:01 / 2021-01-08 21:47:03
            wal start/stop: 00000001000000000000000A / 00000001000000000000000A
            database size: 23.3MB, backup size: 8.2KB
            repository size: 2.7MB, repository backup size: 425B
            backup reference list: 20210108-214355F      

還原一個備份

模拟資料庫損壞

[postgres@sungsasong ~]$ cd $PGDATA/
[postgres@sungsasong pgdata]$ rm -rf *
#100分警告:千萬不要拿生産庫執行      

執行還原

[postgres@sungsasong pgdata]$ pgbackrest --stanza=demo restore      

[postgres@sungsasong pgdata]$ pg_ctl  start -D $PGDATA -l /tmp/logfile
waiting for server to start.... done
server started
[postgres@sungsasong pgdata]$ psql
psql (10.13)
Type "help" for help.      

以上就是pgbackrest介紹及使用。目前使用的最新版本已經可以支援PostgreSQL13版本,僅僅是文檔上标注支援最新到PostgreSQL11版本。感興趣的同學可以下去試一下。

PostgreSQL備份工具 pgBackRest使用

繼續閱讀