PostgreSQL pgBackRest 是最好的PG备份工具 ? (深入一些疑难问题 2)

2023-10-24 19:42:01 浏览数 (1)

每天感悟

代码语言:javascript复制
突然想愤怒的时候,或别人认为你应该愤怒的时候,你不在愤怒,而是能理智的或冰冷的分析出为什么,原因是什么,并且尝试把自己放到他的位置去看明白原理或根本,恭喜你又升级了

上次在安装和简单的实现了备份后,产生了很多的问题,基于这些问题我们持续的开始针对pgbackrest进行研究和发现里面的一些问题。

本期提出一些问题

1 执行文件,日志文件等是否可以在编译的时候进行改变文件存储的目录位置

2 配置文件中的配置通过TCP/IP的方式来访问数据库是否可以

3 配置文件中的global 的一些配置信息的细节和参数的解释

4 增量备份恢复是否能进行制定增量备份恢复的时间点

基于以上的问题,我们来开始,逐个解决这些问题

1 第一个问题关于三个位置,1 执行文件的位置, 2 日志文件的位置 3 配置文件的位置,在编译中需要指定执行文件所在的目录

./configure --prefix=/usr/local/pgbackrest

代码语言:javascript复制
[root@postgresql13 src]# make install
install -d /usr/local/pgbackrest/bin
install -m 755 pgbackrest /usr/local/pgbackrest/bin

日志的位置需要在配置文件中指定,配置文件需要在执行命令进行标注如下,下面验证了相关的可以实现的部分和方案

代码语言:javascript复制
 pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=test --type=full backup

代码语言:javascript复制
[test]
pg1-path=/pgdata/data
pg1-port=5432
pg1-socket-path=/tmp

[global]
repo1-path=/pgbackrest/backup
repo1-retention-full=2
log-path=/pgbackrest
log-level-console=info
log-level-file=debug


[global:archive-push]
compress-level=3


问题1 已经解决,下面问题2 ,关于配置文件中的一些global的信息的问题,下面我们来进行解决

1 连接数据库选项

--pg-host

2 设置pgbackrest 命令执行的位置

--pg1-host-cmd

3 设置配置文件的位置

--pg1-host-config

4 设置数据库的访问端口

--pg1-port

5 数据目录位置

--pg1-path

6 本地数据库socket端口

--pg-socket-path

7 数据库用户

--pg-user

这里开始回答问题2 ,实际上问题2 中的一个部分困扰了我2天的时间,一直不得期间,我一直尝试解决这个问题,但一直在备份中报错,后来发现是不是我的配置出现问题,而是我的概念出现问题。

我先把错误粘出来

代码语言:javascript复制
2023-10-19 11:30:05.475 P00   INFO: check command begin 2.48: --exec-id=58063-f272e790 --log-level-console=info --pg1-database=postgres --pg1-host=192.168.198.100 --pg1-host-config=/etc/pgbackrest/pgbackrest.conf --pg1-host-config-path=/etc/pgbackrest --pg1-path=/pgdata/data --pg1-port=5432 --pg1-socket-path=/tmp --pg1-user=pgbackrest_user --repo1-path=/pgbackrest --stanza=test
2023-10-19 11:30:07.241 P00   INFO: check repo1 configuration (primary)
2023-10-19 11:30:07.648 P00   INFO: check repo1 archive for WAL (primary)
ERROR: [082]: WAL segment 000000010000000100000027 was not archived before the 60000ms timeout
       HINT: check the archive_command to ensure that all options are correct (especially --stanza).
       HINT: check the PostgreSQL server log for errors.
       HINT: run the 'start' command if the stanza was previously stopped.
2023-10-19 11:31:07.652 P00   INFO: check command end: aborted with exception [082]

代码语言:javascript复制
ERROR: [072]: archive-push command must be run on the PostgreSQL host
2023-10-19 19:42:33.858 CST [57618] LOG:  archive command failed with exit code 72
2023-10-19 19:42:33.858 CST [57618] DETAIL:  The failed archive command was: pgbackrest --stanza=test archive-push pg_wal/000000010000000100000026
ERROR: [072]: archive-push command must be run on the PostgreSQL host
2023-10-19 19:42:34.883 CST [57618] LOG:  archive command failed with exit code 72
2023-10-19 19:42:34.883 CST [57618] DETAIL:  The failed archive command was: pgbackrest --stanza=test archive-push pg_wal/000000010000000100000026
2023-10-19 19:42:34.883 CST [57618] WARNING:  archiving write-ahead log file "000000010000000100000026" failed too many times, will try again later
 

实际上的原因是我误会pgbackrest的功能了,其中配置参数中有-pg-host在备份中有些配置并不是在本地PG数据库上部署的,而是进行集中化备份实现而设置的,所以配置也分管理节点和本地数据库节点。

1 本地数据库节点,不能带有pg-host 这是为远程控制节点而设置的,不是本地的配置

2 本地配置了错误的远程控制的配置后,就会出现上面的错误。

3 本地备份的账号尽力单独设置,在pg_hba.conf 对这个账号访问数据库尽力trust 。

所以,第二个问题可以直接回答,远程必须通过TCP/IP访问,而如果是本地则是NO。

问题 3 关于global 里面的部分配置信息

[global]

buffer-size=16MiB

这部分值不能进行随意的设置值在最大不能超过16MB

最小在16kb,默认这部分主要使用在文件的copy 压缩,加密,以及其他的操作中使用的缓冲

Allowed values are 16KiB, 32KiB, 64KiB, 128KiB, 256KiB, 512KiB, 1MiB, 2MiB, 4MiB, 8MiB, and 16MiB

repo1-path=/pgbackrest/backup

这部分是备份文件的存储位置,这里我们统一认为是本地的文件位置

compress-type=gz

备份文件的压缩中份不同的等级,其中支持的压缩 bz2 9 个等级 gz 6个等级 LZ4 默认等级 zst 3个等级,这里我们选择常用的gz 并且选择了3这个等级

config-path=/etc/pgbackrestpgbackrest.conf

配置文件位置

delta=y

备份和恢复文件采用checksums

--dry-run 是否打开命令行中运行--dry-run的开关

io-timeout=120

这里由于pgbackrest里面的备份存储设备可以是S3 或其他设备,则这里需要针对IO读取设置超时的部分范围在 0.1 - 3600 秒

process-max=4

是否采用更多的线程来对数据库的工作进行操作,这里默认是1 ,不要设置太大,太大会在备份是影响数据库的运行。

repo1-retention-full=2

这个repo1-retention-full=2是必须要进行设置的,不设置的情况下会软件会给出警告,在设置后相关的repo1-retention-full 中的与之相关的其他的增量和差异备份,也会在过期后被清理出去。

log-path=/pgbackrest

log-level-console=info

log-level-file=debug

[global:archive-push]

compress-level=3

下面我们来到了问题4 ,在使用pgbackrest后,做了全备后我们删除了某个数据逻辑库或表是否可以通过备份进行恢复,回答是可以的,但必须保证pgbackrest 的归档是是正常的,否则就会出现无法进行的情况。在进行操作中也发现了一些其他的问题。

pgbackrest 的值得研究部分还很多,例如如何设置集中管理,通过软件进行多套postgresql的备份工作,这才是这个软件的对比pgrman的优点所在。

代码语言:javascript复制

postgres=# create database test1;
CREATE DATABASE
postgres=# create table test1 (id int);
CREATE TABLE
postgres=# 
postgres=# insert into test1 (id) values (1);
INSERT 0 1
postgres=# checkpoint;
CHECKPOINT
postgres=# select now();
              now              
-------------------------------
 2023-10-22 04:14:34.741778 00
(1 row)

postgres=# delete from test1;
DELETE 1
postgres=# select now();
             now              
------------------------------
 2023-10-22 04:14:55.79462 00

代码语言:javascript复制
postgres@pg15:/pgdata/data$ pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --log-level-console=info --stanza=test   --type=time "--target=2023-10-22 04:14:35" restore
2023-10-22 04:17:16.784 P00   INFO: restore command begin 2.48: --config=/etc/pgbackrest/pgbackrest.conf --exec-id=74643-c32bcb6e --log-level-console=info --pg1-path=/pgdata/data --repo1-path=/pgbackrest --stanza=test --target="2023-10-22 04:14:35" --type=time
2023-10-22 04:17:16.804 P00   INFO: repo1: restore backup set 20231022-040310F, recovery will start at 2023-10-22 04:03:10
2023-10-22 04:17:19.124 P00   INFO: write updated /pgdata/data/postgresql.auto.conf
2023-10-22 04:17:19.131 P00   INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
2023-10-22 04:17:19.132 P00   INFO: restore size = 42.2MB, file total = 1641
2023-10-22 04:17:19.133 P00   INFO: restore command end: completed successfully (2354ms)


代码语言:javascript复制
   Name    |  Owner   | Encoding | Collate | Ctype | ICU Locale | Locale Provider |
   Access privileges   
----------- ---------- ---------- --------- ------- ------------ ----------------- 
-----------------------
 dvdrental | pgadmin  | UTF8     | C       | C     |            | libc            |
 
 postgres  | postgres | UTF8     | C       | C     |            | libc            |
 
 template0 | postgres | UTF8     | C       | C     |            | libc            |
 =c/postgres           
           |          |          |         |       |            |                 |
 postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     |            | libc            |
 =c/postgres           
           |          |          |         |       |            |                 |
 postgres=CTc/postgres
 test      | postgres | UTF8     | C       | C     |            | libc            |
 
 test1     | postgres | UTF8     | C       | C     |            | libc            |
 
(6 rows)

postgres=# c test1
You are now connected to database "test1" as user "postgres".
test1=# select * from test1;
 id 
----
  1
(1 row)

0 人点赞