[转帖]PostgreSQL | 学习一下Barman备份,防止删库跑路(一)

postgresql,学习,一下,barman,备份,防止 · 浏览次数 : 0

小编点评

# Barman 文件夹下的临时存储位置分析 **简介:** Barman 是一个用于数据库管理的开源工具。它可以用于备份、恢复和维护数据库。 **目录结构:** * `testdb` 是一个用于测试数据的文件夹。 * `wals` 是一个用于存储 Barman 备份的子文件夹。 * `0000000100000006` 是一个数字,表示备份的序号。 **文件分析:** * `xlog.db` 是一个用于存储 Barman 备份的日志文件。 * `backup-rw-------.tar.gz` 是一个用于恢复数据库的压缩文件。 * 许多其他文件存储了 Barman 备份的信息,包括备份文件本身、备份日志和其他辅助文件。 **总结:** Barman 文件夹下包含了以下文件: * `xlog.db`:备份日志文件。 * `backup-rw-------.tar.gz`:用于恢复数据库的压缩文件。 * 其他辅助文件:用于备份和恢复数据库的各种文件。 这些文件用于了 Barman 恢复数据库的整个过程。

正文

https://www.modb.pro/db/48181

 

PostgreSQL PRIP备份

PostgreSQL官方文档指定了以下三种备份方法,详见:https://www.postgresql.org/docs/current/backup.html

  • 「SQL转储」,用pg_dump或pgdump_all进行备份,也是一种逻辑备份的方法,这种方法很容易操作,但是缺点就是一旦数据库太大,导入导出文件的效率就会降低。但是有了并行备份恢复和split拆分,也可以在这方面稍微优化。另一个缺点是无法恢复到故障发生的时刻。例如,你使用crontab定时任务在凌晨3点进行备份,结果12点就出故障,如果进行恢复,就会损失9小时的数据。
  • 「文件系统级备份」,可以在数据目录中执行"一致性快照",然后将快照复制到备份服务器上。这样就可以在异机进行恢复。
  • 「连续归档和时间点恢复(PRIP)」 。要了解PITR,我们首先必须了解什么是wal,wal代表预写日志文件,基本上您对数据库每次插入、更新、删除在实际应用之前,就写入了日志中。这样就算数据库突然出现了crash,在重新启动的过程中,PostgreSQL能够查看wal文件进行恢复并将数据库还原到可用的状态。

现在,我们将学习使用Barman实现 PITR。实际上PostgreSQL的备份软件有很多种,比如pgBackRest、WAL-G等后面也会一一介绍。有兴趣的可以参考wiki:https://wiki.postgresql.org/wiki/Binary_Replication_Tools

还有一个「比较矩阵」,大家可以根据实际的需要来选择备份工具。

Barman以Python语言为基础开发,并由第二象限(2ndQuadrant)进行开发维护。

流备份 VS rsync/SSH

Barman有两种备份方式,一种是比较传统的,通过SSH远程操作利用rsync进行物理备份。而在2.0版引入了对PostgreSQL流复制协议的支持,可以使用pg_basebackup进行流式备份。

上图是Barman的一个「特征矩阵」,官方推荐的是2.0版本之后,对于PostgreSQL9.4或更高版本,建议使用流复制进行备份。在没有使用表空间的情况下,可以在9.2版本就使用流复制进行备份。但在此要注意:

「注意」:Barman透明地使用了pg_basebackup
,因此不能提供增量备份、并行备份、重复删除和网络压缩等功能。在这种情况下,与传统的 rsync相比带宽是有限的。

而传统模式,就是当pg_basebackup
功能受到限制时,更适合使用(例如:可以从增量备份和重复数据删除中获得收益的,数据量大的数据库)。

当然这两个方式也可以同时使用,即流复制和传统复制同时使用。官方提供的架构图如下:

Barman安装

首先要测试的是「传统模式」,我的配置如下:192.168.56.119是PostgreSQL 13的单机版本,我们将在192.168.56.125上部署Barman用于备份。

「传统模式」官方提供的架构图如下:

先要在192.168.56.125上安装Barman。有几种Barman的安装方法,最简单的就是使用yum安装,也可以使用源代码安装。为便于测试,我们使用 yum进行安装。

yum install barman -y

这将自动帮助我们安装libpq、python3-psycopg2、rsync等依赖软件,同时也自动创建barman用户。在安装完成之后,首先为 barman设置一个密码,然后切换到barman用户,此时需要配置ssh免密钥,方便之后连接PostgreSQL服务器。

在postgreSQL服务器上运行

[postgres@centos8 ~]$ ssh-keygen -t rsa

在Barman服务器上运行

[barman@centos8 ~]$ ssh-keygen -t rsa

此时在两个服务器的.ssh的文件夹中会生成公钥文件。

[postgres@centos8 .ssh]$ ls -lrt
total 12
-rw-r--r--. 1 postgres postgres  406 Jan 28 14:47 known_hosts
-rw-r--r--. 1 postgres postgres  582 Feb 18 14:41 id_rsa.pub
-rw-------. 1 postgres postgres 2622 Feb 18 14:41 id_rsa

接着使用ssh-copy-id命令在PostgreSQL服务器上将公共密钥文件传递给 barman主机,然后测试是否可以免密码登录。

[postgres@centos8 .ssh]$ ssh-copy-id -i ~/.ssh/id_rsa.pub barman@192.168.56.125
[postgres@centos8 .ssh]$ ssh 'barman@192.168.56.125' date
Thu Feb 18 14:58:19 UTC 2021

反向操作一下barman主机,执行相同的命令并进行测试。

[barman@centos8 .ssh]$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@192.168.56.119
[barman@centos8 .ssh]$ ssh 'postgres@192.168.56.119' date
Thu Feb 18 15:01:07 UTC 2021

在完成了SSH免密钥登录配置后,两个主机可以免密地相互访问了。

Barman配置

在安装完毕之后,需要配置Barman, Barman有两种类型的配置文件:

  • 全局/常规配置
  • 服务器配置、

主要配置文件存放在/etc/barman/barman.conf
下面。它包含了全局/常规配置选项,当前文件属主是root用户,建议改成barman
用户。

[barman@centos8 ~]$ ls -l /etc/barman/
total 4
-rw-r--r--. 1 root root 3205 Nov 30 11:01 barman.conf
drwxr-xr-x. 2 root root  112 Feb 18 13:58 conf.d

目前barman.conf中配置内容较多,建议直接备份该文件,然后重新创建一个barman.conf文件,将属主改为barman。

「主要配置文件如下」:

[barman]
barman_home = /var/lib/barman
barman_user = barman
log_file = /var/log/barman/barman.log
log_level = INFO
configuration_files_directory = /etc/barman/conf.d

barman_home
就是备份存放的位置,需要足够的空间。

configuration_files_directory
指定服务器配置文件存储的目录。

常规配置里面还有很多参数,包括压缩,并行,网络带宽限制等,具体的参数配置可以参考官方文档。http://docs.pgbarman.org/release/2.12/#fn4

完成主要配置文件之后,还需要在configuration_files_directory
参数指定的目录下创建服务器配置文件。推荐是一套PG数据库配置一个文件,方便管理。

「服务器配置文件如下」

[testdb]
description = "PostgreSQL Test Database "
ssh_command = ssh postgres@192.168.56.119
conninfo = host=192.168.56.119 user=postgres port=5432
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF 7 days
wal_retention_policy = main
reuse_backup = link
backup_method = rsync
backup_options = exclusive_backup
archiver = on

ssh_command
在此您可以通过命令从Barman服务器连接到PostgreSQL服务器,确保ssh免密钥连接是正常的。

conninfo
从Barman服务器到PostgreSQL服务器的连接信息,这里要注意PostgreSQL服务器需要接受Barman服务器的连接,必须是超级用户或者是具有REPLICATION权限的用户连接。

retention_policy
设定保留策略,可以设定为时间策略,也可以设定为冗余策略,在这里我们使用时间策略。

wal_retention_policy
wal日志的保留策略。当前只能设置为main,它将wal的保留策略映射到基本备份的保留策略。

reuse_backup
主要有三个值,分别是off、link、copy。

  1. off 标准的完全备份。
  2. link 增量备份,它是重新使用上次备份(未更改的文件),并根据它们创建硬链接,这样做的好处是节约备份空间和备份时间。
  3. copy 增量备份,它是让服务器重用上次备份,并创建未更改文件的副本(仅用于减少备份时间)。

backup_options
,该选项使您可以控制Barman与PostgreSQL交互以进行备份的方式。

  1. exclusive_backup
    (默认为backup_method = rsync),使用标准的排他备份方法(技术上通过pg_start_backup
    pg_stop_backup
    )执行备份操作。
  2. concurrent_backup
    (如果backup_method = postgres,则是默认值),激活「并发备份模式」,在PostgreSQL 9.2、9.3、9.4、9.5版本上需要安装pgespresso
    插件,到了PostgrSQL 9.6版本因为引入了新的API,就不需要pgespresso
    插件了。
  3. external_configuration
    如果存在,则有关外部配置文件的任何警告将在备份执行期间被禁止。

backup_method
,指定备份方式,这里采用的是rsync/ssh
的传统备份方式。

在PostgreSQL服务器上设置WAL归档

下一步需要配置PostgreSQL服务器,首先需要向pg_hba.conf添加一行,使barman服务器能够连接PostgreSQL。

host all all 192.168.56.125/32 trust 

然后我们需要找到barman服务器上存放wal文件的位置。在下面的命令中找到incoming_wals_directory
的值。

[barman@centos8 barman]$ barman show-server testdb |grep incoming_wals_directory
        incoming_wals_directory: /var/lib/barman/testdb/incoming

接着切换回PostgreSQL服务器,修改参数。

postgres=# show archive_mode ;
 archive_mode 
--------------
 off
(1 row)

postgres=# show archive_command ;
 archive_command 
-----------------
 (disabled)
(1 row)

postgres=# alter system set archive_mode=on;
ALTER SYSTEM
postgres=# alter system set archive_command='rsync -a %p barman@192.168.56.125:/var/lib/barman/testdb/incoming/%f';
ALTER SYSTEM

重新启动服务器使参数生效。

[postgres@centos8 pgdata]$ psql
psql (13.1)
Type "help" for help.

postgres=# show archive_mode;
 archive_mode 
--------------
 on
(1 row)

postgres=# show archive_command ;
                           archive_command                            
----------------------------------------------------------------------
 rsync -a %p barman@192.168.56.125:/var/lib/barman/testdb/incoming/%f
(1 row)

测试备份

当以上配置完成后,我们可以登录barman服务器,对其进行测试并进行第一次备份。

列出可用的服务器

[barman@centos8 ~]$ barman list-server
testdb - PostgreSQL Test Database 

检查Barman服务器配置是否正确

[barman@centos8 ~]$ barman check testdb
Server testdb:
        PostgreSQL: OK
        superuser or standard user with backup privileges: OK
        wal_level: OK
        directories: OK
        retention policy settings: OK
        backup maximum age: OK (no last_backup_maximum_age provided)
        compression settings: OK
        failed backups: OK (there are 0 failed backups)
        minimum redundancy requirements: OK (have 0 backups, expected at least 0)
        ssh: OK (PostgreSQL server)
        not in recovery: OK
        systemid coherence: OK (no system Id stored on disk)
        archive_mode: OK
        archive_command: OK
        continuous archiving: OK
        archiver errors: OK

这里会全部显示ok,如果配置有问题,将产生failed,此时需要查看日志进行处理。比如我把pg_hba.conf中的条目删除。PostgreSQL在这里就会出现连接不上的情况。

# IPv4 local connections:
#host    all             all             192.168.56.125/32       trust

[barman@centos8 ~]$ barman check testdb
Server testdb:
        PostgreSQL: FAILED
        directories: OK
        retention policy settings: OK
        backup maximum age: OK (no last_backup_maximum_age provided)
        compression settings: OK
        failed backups: OK (there are 0 failed backups)
        minimum redundancy requirements: OK (have 0 backups, expected at least 0)
        ssh: OK (PostgreSQL server)
        not in recovery: OK
        systemid coherence: OK (no system Id available)
        archiver errors: OK

tail -200f /var/log/barman/barman.log
2021-02-19 13:50:29,862 [3574] barman.postgres WARNING: Error retrieving PostgreSQL status: fe_sendauth: no password supplied
2021-02-19 13:50:29,926 [3574] barman.backup_executor WARNING: Error retrieving PostgreSQL status: fe_sendauth: no password supplied
2021-02-19 13:50:29,927 [3574] barman.server ERROR: Check 'PostgreSQL' failed for server 'testdb'

执行备份

现在我们可以开始备份了。backup命令将创建基本的备份。执行命令可以看到它存储的位置。

[barman@centos8 barman]$ barman backup testdb
Starting backup using rsync-exclusive method for server testdb in /var/lib/barman/testdb/base/20210219T135415
Backup start at LSN: 6/5D000028 (00000001000000060000005D, 00000028)
This is the first backup for server testdb
WAL segments preceding the current backup have been found:
        000000010000000600000046 from server testdb has been removed
        000000010000000600000047 from server testdb has been removed
        000000010000000600000048 from server testdb has been removed
        000000010000000600000049 from server testdb has been removed
        00000001000000060000004A from server testdb has been removed
        00000001000000060000004B from server testdb has been removed
        00000001000000060000004C from server testdb has been removed
        00000001000000060000004D from server testdb has been removed
        00000001000000060000004E from server testdb has been removed
        00000001000000060000004F from server testdb has been removed
        000000010000000600000050 from server testdb has been removed
        000000010000000600000051 from server testdb has been removed
        000000010000000600000052 from server testdb has been removed
        000000010000000600000053 from server testdb has been removed
        000000010000000600000054 from server testdb has been removed
        000000010000000600000055 from server testdb has been removed
        000000010000000600000056 from server testdb has been removed
        000000010000000600000057 from server testdb has been removed
        000000010000000600000058 from server testdb has been removed
        000000010000000600000059 from server testdb has been removed
        00000001000000060000005A from server testdb has been removed
        00000001000000060000005B from server testdb has been removed
Starting backup copy via rsync/SSH for 20210219T135415
Copy done (time: 1 second)
This is the first backup for server testdb
Asking PostgreSQL server to finalize the backup.
Backup size: 81.5 MiB. Actual size on disk: 81.5 MiB (-0.00% deduplication ratio).
Backup end at LSN: 6/5D000138 (00000001000000060000005D, 00000138)
Backup completed (start time: 2021-02-19 13:54:16.511884, elapsed time: 3 seconds)
Processing xlog segments from file archival for testdb
        00000001000000060000005C
        00000001000000060000005D
        00000001000000060000005D.00000028.backup         

查看备份详细信息

备份信息可以使用list-backup命令显示。使用show-backup命令可以查看更多的细节。

[barman@centos8 ~]$ barman list-backup testdb
testdb 20210219T135415 - Fri Feb 19 13:54:19 2021 - Size: 97.5 MiB - WAL Size: 0 B  

[barman@centos8 ~]$ barman show-backup testdb 20210219T135415
Backup 20210219T135415:
  Server Name            : testdb
  System Id              : 6913881765733117590
  Status                 : DONE
  PostgreSQL Version     : 130001
  PGDATA directory       : /data/postgresql/pgdata

  Base backup information:
    Disk usage           : 81.5 MiB (97.5 MiB with WALs)
    Incremental size     : 81.5 MiB (-0.00%)
    Timeline             : 1
    Begin WAL            : 00000001000000060000005D
    End WAL              : 00000001000000060000005D
    WAL number           : 1
    Begin time           : 2021-02-19 13:54:15.936540+00:00
    End time             : 2021-02-19 13:54:19.310871+00:00
    Copy time            : 1 second
    Estimated throughput : 42.2 MiB/s
    Begin Offset         : 40
    End Offset           : 312
    Begin LSN           : 6/5D000028
    End LSN             : 6/5D000138

  WAL information:
    No of files          : 0
    Disk usage           : 0 B
    Last available       : 00000001000000060000005D

  Catalog information:
    Retention Policy     : VALID
    Previous Backup      : - (this is the oldest base backup)
    Next Backup          : - (this is the latest base backup)

归档存放

关于归档的备份问题,在默认情况下当主库生成归档文件时,它会自动传输到/var/lib/barman/testdb/income
文件夹下。这只是一个临时存储位置,后面它还会自动移动到/var/lib/barman/testdb/wals文件夹的子目录下。

[barman@centos8 incoming]$ ls -lrt
total 81920
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000062
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000063
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000064
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000065
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000066

[barman@centos8 wals]$ pwd
/var/lib/barman/testdb/wals
[barman@centos8 wals]$ ls
0000000100000006  xlog.db
[barman@centos8 wals]$ cd 0000000100000006/
[barman@centos8 0000000100000006]$ ls -lrt
total 163844
-rw-------. 1 barman barman 16777216 Feb 19 13:54 00000001000000060000005D
-rw-------. 1 barman barman      358 Feb 19 13:54 00000001000000060000005D.00000028.backup
-rw-------. 1 barman barman 16777216 Feb 19 14:09 00000001000000060000005E
-rw-------. 1 barman barman 16777216 Feb 19 14:09 00000001000000060000005F
-rw-------. 1 barman barman 16777216 Feb 19 14:09 000000010000000600000060
-rw-------. 1 barman barman 16777216 Feb 19 14:09 000000010000000600000061
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000062
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000063
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000064
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000065
-rw-------. 1 barman barman 16777216 Feb 19 14:14 000000010000000600000066

尾声

今天的Barman备份就到这里。接下来的章节我们将研究如何使用备份从数据库崩溃中恢复。

参考文档

1.https://docs.pgbarman.org/release/2.12/barman.5.html

2.https://www.postgresql.org/docs/current/backup.html

3.https://wiki.postgresql.org/wiki/Binary_Replication_Tools

 

与[转帖]PostgreSQL | 学习一下Barman备份,防止删库跑路(一)相似的内容:

[转帖]PostgreSQL | 学习一下Barman备份,防止删库跑路(一)

https://www.modb.pro/db/48181 PostgreSQL PRIP备份 PostgreSQL官方文档指定了以下三种备份方法,详见:https://www.postgresql.org/docs/current/backup.html 「SQL转储」,用pg_dump或pgdu

[转帖]openGauss每日一练第 5 天 |学习openGauss创建用户、修改用户属性、更改用户权限和删除用户

https://www.modb.pro/db/199037 自己安装的openGauss环境启动openGaussgs_ctl -D /gauss/data/db1/ start登录openGaussgsql -d postgres -p 26000 -r 1.创建用户user1、user2和us

[转帖]gitlab:一次近乎完美的PostgreSQL版本大升级实践

作者 | Jose Finotto 译者 | 马可薇 策划 | 万佳 2020 年 5 月,我们与 OnGres 合作,对 GitLab 上的 Postgres 集群进行版本大更新,从 9.6 版本升级到 11 版本。升级全部在维护窗口内运行,没有丝毫差错;更新中所有涉及的内容、计划、测试,以及全流

[转帖]墨天轮访谈 | IvorySQL王志斌—IvorySQL,一个基于PostgreSQL的兼容Oracle的开源数据库

https://zhuanlan.zhihu.com/p/532842415 分享嘉宾:王志斌 瀚高IvorySQL产品经理整理:墨天轮社区 导读 大家好,我是瀚高IvorySQL产品经理王志斌,IvorySQL是基于PostgreSQL的衍生开源项目。 我今天分享的内容主要分为三个部分:我们是谁?

[转帖]postgresql 编译选项 --with-uuid=e2fs、--with-uuid=ossp 的理解

postgresql 的 rpm 包使用的是 ‘–with-uuid=e2fs’ postgresql 源码 configure 的帮助选项有 uuid 的几个选项,有啥区别? # ./configure --help --with-uuid=LIB build contrib/uuid-ossp

[转帖]postgresql日志参数

https://www.jianshu.com/p/407c03aaa600 postgresql日志参数 logging_collector:这个参数启用日志收集器,它是一个捕捉被发送到stderr的日志消息的后台进程,并且它会将这些消息重定向到日志文件中;默认是OFF,修改参数需要重启。 log

[转帖]postgresql 的 pg_hba.conf 的行记录顺序

postgresql: 9.6 一直觉得 pg_hba.conf 的行记录与顺序无关,遵循细化优先的规则。今天在回顾 pg_hba.conf 文档时发现这种认识是错的。 下面这段话是从文档拷贝过来的: 因为每一次连接尝试都会顺序地检查pg_hba.conf记录,所以这些记录的顺序是非常关键的。通常,

[转帖]postgresql 的 .pgpass密码文件的使用

.pgpass 是 连接 postgresql 时使用的密码文件,通常位置为 ~/.pgpass。 在使用某些组件时还真的必须使用。具体的格式为: hostname:port:database:username:password 常见的使用如下: # su - postgres $ vi ~/.pg

[转帖]PostgreSQL进程结构

http://www.pgsql.tech/article_101_10000099 1、简介 本文简单的介绍了 PostgreSQL 的主要进程类型与功能。 2、PostgreSQL进程分为主进程与辅助进程。 2.1、主进程: PostMaster进程是整个数据库实例的总控进程,负责启动关闭该数据

[转帖]PostgreSQL与MySQL 分析对比

http://www.pgsql.tech/article_101_10000079 概述 在几个流行的数据库中,我首先接触到的是MySQL,随着工作发展,接触到越来越多的是PostgreSQL数据库。这两个十分流行的开源数据库。在这之后,我就会经常和一些朋友进行讨论:MySQL和PostgreSQ