使用 barman的备份和归档PostgreSQL

article/2025/9/23 19:03:59

 

1 前言

1.1 Barman简介

barman(备份和恢复管理器)是用于PostgreSQL服务器进行灾难恢复的开源管理工具,是以Python编写的。它支持对多台服务器执行远程备份,以降低风险并帮助DBA进行数据库恢复。

1.2 Barman的备份方式

本文假定读者熟悉理论上的灾难恢复概念,并且具有在PostgreSQL物理备份和灾难恢复方面的基础知识。

我们知道 PostgreSQL 的连续备份包含一个或多个基础备份和连续归档的WAL日志。Barman 支持两种方法实现这样的备份。我们讨论的情况是数据库服务和备份文件在不同服务器上的情况。

1.2.1 基于流协议的备份

基于流协议的备份方法是barman 提供的独特的方法。它适用于PostgreSQL 9.4或更高版本。它使用pg_basebackup进行基础备份,使用pg_receivewal ( PostgreSQL 10 以下是 pg_receivexlog)归档WAL。其结构如下图所示:

 

 

在这种情况下,您将需要配置:

  1. PostgreSQL的标准连接,用于管理,协调和监视
  2. pg_basebackup(用于基本备份操作)和pg_receivewal(用于WAL流归档)使用的流复制连接

 

Barman 的术语来说,此设置称为 streaming-only设置,因为它不需要任何SSH连接即可进行备份和归档操作。Barman 也支持基于基于流协议备份与基于SSH WAL 归档结合,下图描绘了这种实现:

 

这种方案要求:

  1. 额外的SSH连接,以允许用户postgres PostgreSQL服务器以barman的用户身份连接到Barman服务器上。
  2. PostgreSQL的配置文件postgresql.conf 中配置archive_command,内容是将WAL文件归档到Barman的归档目录。具体格式可参考官方手册

1.2.2 基于rsync/ SSH 的备份

基于rsync/ SSH 的备份是一种传统的基于文件的备份方式。它一般适用于下面的情形。

  1. PostgreSQL服务器版本是8.38.49.09.1
  2. 使用表空间的PostgreSQL服务器版本是9.29.3
  3. 增量备份,并行备份和重复数据删除
  4. 备份期间的网络压缩
  5. 更好地控制带宽使用,包括在表空间的基础上

它的体系结构如下图所示:

 

在这种情况下,您将需要配置:

  1. PostgreSQL的标准连接,用于管理,协调和监视
  2. 用于基础备份操作的SSH连接,rsync会使用它,以允许barman用户在Barman服务器上以用户postgres的身份连接到PostgreSQL服务器
  3. 用于WAL归档的SSH连接,archive_command会使用它,以允许用户postgres PostgreSQL服务器以用户barman的身份连接到Barman服务器。

PostgreSQL 9.2开始,您可以添加用于WAL流式传输的流复制连接。下图描绘了这种实现:

 

1.3 实验环境

实验需要两台服务器,下面是它们的一些基本信息。

 

操作系统: CentOS 7.5

内存: 32G

CPU 8个逻辑核

软件:

PostgreSQL 11.4

yum

python 3.6

barman 2.11

需要的python 模块:

argcomplete-1.12.0

argh-0.26.2

psycopg2-2.8.5

python-dateutil-2.8.1

setuptools-49.6.0

      

数据库服务器的IP地址:10.40.239.228

备份服务器的IP地址:10.40.239.229

ssh 端口:22,默认值

postgresql 的运行端口:5432

postgresql bin目录 /opt/postgresql/bin/

postgresql data 目录 /opt/postgresql/data

    注意,barman 要求特定版本操作系统和所依赖的软件。具体要求如附录1所示。

2 Barman备份环境的搭建

2.1 安装软件

2.1.1 数据库服务器上的操作

   1. 安装 rsync

yum install rsync

2.1.2 备份服务器上的操作

下面的操作都使用用户 root 完成。

1. 安装 epel  (Extra Packages for Enterprise Linux)

yum -y install epel-release 
 

2. 安装 Python 3.6

yum -y install python3-3.6.8-13.el7.x86_64

 

注意,如果你不想指定Python 3的版本,可以换成执行:

yum -y install python3

 

Python 3安装过程中,setuptools pip 也会被安装。

 

3. 安装rsync

yum -y install rsync

 

4. 安装 pgdg

rpm -ivh https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

 

5. 安装Barman

方法1:使用yum 安装barman

yum –y install barman-2.11-1.rhel7.noarch

 

使用yum安装的过程中,会自动安装下面的模块

python36-argcomplete.x86_64

python36-argh

python36-psycopg2

python36-dateutil

 

yum 安装完barman后,程序会创建一个操作系统用户 barman,并创建一个文件 /etc/barman.conf,内容是barman的一些全局配置项,一个目录 /etc/barman.d,存放与数据库服务器有关的配置信息。

 

 

方法2:使用源码安装。

  1. SourceForge 上下载barman源码,这里我们下载 barman-2.11.tar.gz
  2. 解压文件后,进入解压后的目录,使用python3安装它:

tar -zxvf barman-2.11.tar.gz

cd ./barman-2.11

python3 ./setup.py build

python3 ./setup.py install

 

3. 使用pip安装需要的python模块。进入 python3 的安装目录,执行命令如下:

./pip install argcomplete -i https://pypi.tuna.tsinghua.edu.cn/simple/

./pip install argh -i https://pypi.tuna.tsinghua.edu.cn/simple/

./pip install psycopg2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

./pip install python-dateutil -i https://pypi.tuna.tsinghua.edu.cn/simple/

   

4. 在操作系统中创建用户barman

useradd -m barman -d /var/lib/barman

 

5. 将barman 安装包解压后的barman-2.11/barman, 文件barman.conf  目录barman.d 拷贝到 /etc/ 中。

cd barman-2.11/barman

cp barman.conf  /etc/

cp -R barman.d  /etc/

2.2 配置

2.2.1 数据库服务器上的操作

下面的操作都使用用户 root 完成。

1.  用户postgres创建ssh密钥以及授权文件,如果它们不存在。

su postgres

cd ~

ssh-keygen -t rsa

echo “”>> ./ssh/authorized_key

 

随后在barman用户的主目录 /var/lib/pgsql/ 下的目录 .ssh中,会生成私钥文件 id_rsa和 公钥文件 id_rsa.pub。

 

2. 把PostgreSQL bin 目录复制到备份服务器的目录 /etc/barman.d/中。可以使用scp。例如,PostgreSQLbin 的位置是 /opt/postgresql/bin,则可以执行如下命令:

 

scp -r /opt/postgresql/bin root@10.40.239.229:/etc/barman.d/

 

3. 在数据库中创建用户 barman streaming_barman,其中barman 要是superuser, streaming_barman 有复制权限。具体的sql如下。

 

CREATE ROLE barman with LOGIN PASSWORD 'barman123' SUPERUSER;

CREATE ROLE streaming_barman with LOGIN PASSWORD 'streaming_barman123' REPLICATION;

 

4. 数据库的配置文件 postgresql.conf 应该做如下配置:

listen_addresses = '*'

wal_level = replica

max_wal_senders = 10

archive_mode = off

 

小贴士:你可能注意到,这里的配置和开启PostgreSQL原生的连续归档时的配置不同。他们的区别是,对于基于流协议的归档,我们需要保证 archive_mode = off,且不必配置archive_command;而对于PostgreSQL原生的连续归档,我们需要设置archive_mode = on,并配置archive_command

 

5. 在 pg_hba.conf 中,添加如下内容,允许用户barmanstreaming_barman访问。

host      all           barman                   127.0.0.1/32            md5

host      all           barman                   10.40.239.228/32        md5

host      all           barman                   10.40.239.229/32        md5

host      replication    streaming_barman         127.0.0.1/32            md5

host      replication    streaming_barman         10.40.239.228/32        md5

host      replication    streaming_barman         10.40.239.229/32        md5

 

2.2.2 备份服务器上的操作

下面的操作都使用用户 barman完成。

1. 为用户barman创建ssh密钥。

ssh-keygen -t rsa

 

随后在barman用户的主目录 /var/lib/pgsql/ 下的目录 .ssh中,会生成私钥文件 id_rsa和 公钥文件 id_rsa.pub。

 

2. 复制用户barman 的公钥文件 id_rsa.pub 中的内容,并将它追加到数据库服务器上

的用户 postgres 的主目录中的文件 .ssh/authorized_keys 中。这样做的目的是允许barman以用户postgres的身份免密访问数据库服务器

 

你可以手动复制此内容,并将它粘贴到数据库服务器上的用户 postgres 的主目录中的文件 .ssh/authorized_keys 末尾。

你也可以通过下面的命令完成复制。如果使用下面的命令,你需要保证数据库服务器上 postgres用户已经设置了密码。

ssh-copy-id postgres@10.40.239.228

  

3. 创建 barman 的日志目录 /var/log/barman

mkdir /var/log/barman

 

4. 编辑  /etc/barman.conf,在 “[barman]” 之下修改这些配置项,以设置全局的备份参数:

 

; System user

barman_user = barman

 

; Directory of configuration files. Place your sections in separate files with .conf extension

; For example place the 'main' server section in /etc/barman.d/main.conf

configuration_files_directory = /etc/barman.d

 

; Main directory

barman_home = /var/lib/barman

 

; Log location

log_file = /var/log/barman/barman.log

 

; Log level (see https://docs.python.org/3/library/logging.html#levels)

log_level = INFO

 

 

; Global retention policy (REDUNDANCY or RECOVERY WINDOW) - default empty

retention_policy = RECOVERY WINDOW OF 4 WEEKS

 

; Number of parallel jobs for backup and recovery via rsync (default 1)

parallel_jobs = 3

 

; Immediate checkpoint for backup command - default false

immediate_checkpoint = true

 

; Enable network compression for data transfers - default false

network_compression = false

 

; Number of retries of data copy during base backup after an error - default 0

basebackup_retry_times = 3

 

; Number of seconds of wait after a failed copy, before retrying - default 30

basebackup_retry_sleep = 30

 

 

; Minimum number of required backups (redundancy)

minimum_redundancy = 2

 

 

这里我们用中文解释一下这些参数的含义:

barman_user 运行barman 的用户

configuration_files_directory 配置文件所在目录。 将您的备份放在扩展名为.conf的单独文件中

barman_home barmn的主目录

log_file barman 日志文件的位置

log_level 日志级别

retention_policy 备份的保留策略。空表示禁用;REDUNDANCY 2 表示保留两份基础备份;RECOVERY WINDOW OF 4 WEEKS 表示保留4星期之内的备份。

parallel_jobs 通过rsync备份和恢复的并行作业数

immediate_checkpoint 备份命令是否执行立即检查点

network_compression 启用网络压缩以进行数据传输。对于流备份,这个参数设置为false

basebackup_retry_times 在基础备份期间发生错误后重新尝试的次数

basebackup_retry_sleep 复制失败后,重试之前等待的秒数

minimum_redundancy 所需的最小备份数量

 

5. 配置要备份的数据库的信息。

5.1 进入 /etc/barman.d, 将 streaming-server.conf-template 复制为 pg.conf,文件名中的“pg”也是此备份任务的名称。

cd /etc/barman.d

cp streaming-server.conf-template pg.conf

 

5.2 编辑 pg.conf,将 [streaming] 修改为 [pg],这是备份任务的名称,并配置如下参数:

conninfo =  host=10.40.239.228 port=5432 user=barman dbname=postgres password=barman123

 

streaming_conninfo = host=10.40.239.228 port=5432 dbname=postgres user=streaming_barman password=streaming_barman123

backup_method = postgres

streaming_archiver = on

slot_name = barman

path_prefix = "/etc/barman.d/bin"

   

下面是这些参数的含义:

conninfo 基础备份的连接信息。

streaming_conninfo 流归档的连接信息。

backup_method 基础备份的方式。“postgres”表示使用 pg_basebackup 进行备份;rsync 表示使用rsync备份。

streaming_archiver 是否启用流归档。on 表示是。

slot_name 复制槽的名称

path_prefix 客户端的postgresql 的bin 的路径。

 

3 使用barman备份和恢复

3.1 备份

下面的操作都在备份服务器上进行。

1. 执行barman的命令,创建名为 pg的复制槽

barman receive-wal --create-slot pg

 

2. 在后台不间断地从数据库服务端接收wal日志:

barman receive-wal pg &

    注意,& 表示在后台执行前面的命令。

 

​​​​​​​3. 检查备份任务pg 的运行状态

barman check pg

 

如果各项结果均为 OK,则表示状态正常。

 

​​​​​​​4. 做一次基础备份

        barman backup pg

基础备份文件位于 /var/lib/barman/pg/base 中。

 

​​​​​​​5. 设置常规的定时备份方案

 

设置每5分钟检查一次barman 服务的状态,进行一次维护操作:

echo "*/5 * * * * barman barman cron" >> /etc/crontab

 

其中,barman cron这条命令还可以维护barman后台的稳态。例如,它可以检查备份文件是否缺失,清理过期的备份文件。

 

设置 7天做一次基础备份:

echo "* * */7 * * barman barman backup pg" /etc/crontab

 

3.2 恢复

1. 在数据库服务器上停止数据库。

 

2. 在数据库服务器,将数据库的data目录的属主修改为barman

chown -R barman.barman ./data

 

3. 在barman 服务器上,执行命令恢复数据库。

3.1 首先查看有哪些基础备份:

    barman list-backup pg

结果示例如下:

pg 20200817T120000 - Mon Aug 17 12:00:00 2020 - Size: 515.6 MiB - WAL Size: 64.0 MiB - WAITING_FOR_WALS

pg 20200810T120000 - Mon Aug 10 12:00:00 2020 - Size: 412.5 MiB - WAL Size: 128.0 MiB

 

可以看到,pg2个备份,分别是20200824T12000020200817T120000

 

3.2 恢复数据库,我们选择用20200810T120000恢复,恢复到 2020年8月23日 12时。

barman recover --target-time '2020-08-23 12:00:00' pg 20200810T120000 /opt/postgresql/data/

 

可以使用四个互斥选项之一指定恢复目标:

--target-time TARGET_TIME:指定时间戳

--target-xid TARGET_XID:指定交易ID

--target-name TARGET_NAME:指定先前使用pg_create_restore_pointname)函数创建的命名还原点

--target-immediate:达到一致状态(即基本备份过程的结束)时,恢复将结束

恢复成功后,会收到提示:

Your PostgreSQL server has been successfully prepared for recovery!

 

4. 在PostgreSQL服务器上,将data的属主改回原来的用户。如果以前的用户是 postgres,那么命令就是:

chown -R postgres.postgres ./data

 

5. 重新启动 PostgreSQL,检查服务是否正常。

 

6. 数据库服务器上的postgresql正常后,在备份服务器上

barman receive-wal --create-slot pg

 

7. 在备份服务器上,在从数据库服务端接收wal日志

barman receive-wal pg &

 

 

附录

1 不同版本barman 对系统和软件的要求

 

Barman 2.4 ~ 2.7

  • Linux/Unix
  • Python 2.6 or 2.7
  • Python modules:
    • argcomplete
    • argh >= 0.21.2 <= 0.26.2
    • argparse (Python 2.6 only)
    • psycopg2 >= 2.4.2
    • python-dateutil <> 2.0
    • setuptools
  • PostgreSQL >= 8.3
  • rsync >= 3.0.4 ( PostgreSQL >= 9.2 是可选的)

 

Barman 2.8 ~ 2.11

  • Linux/Unix
  • Python >= 3.4
  • Python modules:
    • argcomplete
    • argh >= 0.21.2
    • psycopg2 >= 2.4.2
    • python-dateutil
    • setuptools
  • PostgreSQL >= 8.3
  • rsync >= 3.0.4 (对于 PostgreSQL >= 9.2 是可选的)

2 barman 用户手册

http://docs.pgbarman.org/release/2.11/

 


http://chatgpt.dhexx.cn/article/LXG80hM6.shtml

相关文章

github删除某个项目流程

1.进入网站 2.找到要删的项目&#xff0c;点进去 3.进去之后往下拉&#xff0c;拉到这里 接下来就点它按提示操作就删除了。

GitLab删除项目操作(亲测)

刚开始找了半天没找到删除按钮在哪&#xff0c;现在记录一下&#xff0c;分享。 第一步&#xff1a;点进入项目 第二步&#xff1a;进入项目Settings 第三步&#xff1a;往下拉&#xff0c;找到Remove,删除即可。 所有内容皆为个人总结或转载别人的文章&#xff0c;只为学习技…

删除gitlab上的分支

好久没有更新了, 今天记录一下删除gitlab上的分支的操作 登录仓库后, 依次点击: project --> home --> Readme --> repository --> branches 会看到所有master和所有分支, 点击右侧删除即可; 看到右边的红色垃圾桶了没, 删除按钮, 想要删除那个就点那个即可; 最近很…

GitLab如何删除已有项目

一。点击进入你需要删除的项目&#xff1a; 二。选择Settings&#xff0c;点击General&#xff0c;找到Advanced settings&#xff0c;点击Expand&#xff1a; 三。往下翻&#xff0c;找到Remove Project&#xff0c;点击&#xff1a; 四。根据提示&#xff0c;输入test&#x…

gitlab中如何删除Group,删除项目

删除自己创建的组&#xff1a; 一、首先查看自己的组&#xff0c;然后edit group,点击进入&#xff1b; 二、点击Settings中的General&#xff0c;然后点击Path, transfer, remove的Expend按钮&#xff1b; 3、滑到最下边&#xff0c;点击“Remove group”; 4、在弹出框中输入…

删除git、gitlab的分支

1.使用命令 删除本地分支 git branch -d dev 【git branch -参数 本地分支名称】删除远程分支 git push origin --delete dev 【git push origin --参数 远程分支名称】 2.在gitlab上删除分支 进入某个项目&#xff0c;例bootdo这个项目&#xff0c;bootdo->左右菜单Repos…

gitlab删除仓库文件夹

如图&#xff1a; 要删除router 首先进入项目master文件夹下, Git Bash Here ,打开命令窗口 $ git pull origin master # 将远程仓库里面的项目拉下来 $ dir # 查看有哪些文件夹 $ git rm -r --cached target # 删除target文件夹 $ git commit -m ‘删除了target’ # 提交…

gitlab 创建、修改、删除项目

一、创建用户组 1、setting --> Groups --> New group 2、填写用户组信息&#xff0c;点击 "Create group"。 3、选择需要加入改组的 用户和角色&#xff0c;点击 "Add users to group" 二、创建项目 1、点击 "New project" 2、填写项…

github上如何删除一个项目(仓库)

最近在学习使用git来管理项目&#xff0c;在学习管理远程库时&#xff0c;使用github来管理&#xff0c;创建的项目后来发现不需要这个项目了&#xff0c;想删除&#xff0c;找了好久都没找到在哪删除&#xff0c;在这里特意记录下来 首先创建一个Repositories 点击New reposi…

GitLab删除项目的操作步骤

1.进入项目首页 2.选择Settings-General 3.划至底部找到Advanced,点击右侧"Expand" 4.往下划可看到删除项目的按钮&#xff0c;点击后按操作提示即可

gitlab上删除项目

最近公司打算把不用svn而是git来托管代码. 然后我自己在公司的gitlab上建立了一个测试项目,这时候删除很容易直接在本页面上.一旦我上传了一些东西之后再删除就隐藏的比较深了.然后上网查的百度教程,发现不行.原因可能是git版本更新完之后,位置变了. 摸索了一通之后终于找到了…

如何删除gitlab上的文件夹

参考&#xff1a;如何删除gitlab上的文件夹 1.在本地新建一个文件夹&#xff0c;进入文件夹&#xff0c;右键git bash here。 2.在命令行窗口输入拉去gitlab仓库的命令&#xff0c;git clone "仓库地址"&#xff0c;然后查看是否拉取成功。 3.在本地把需要删除的文件…

gitlab怎么删除项目

首先点击setting–general–advanced-expand展开 滑到最下面找到remove project 将要删除的项目名称输入到框里&#xff0c;删除

怎样删除Github中的项目

我们在GitHub上创建项目的时候&#xff0c;如果想要删除当前项目&#xff0c;怎样进行操作呢&#xff0c;下面就简单介绍一下怎样去删除GitHub中的项目 1、选择要删除的项目 2、进入项目中的setting&#xff08;设置&#xff09;中 3、一直下拉&#xff0c;看到有红色字体出现&…

如何在GitLab与GitHub中删除项目(仓库)

文章目录 一、GitLab中删除项目1、进入Projects找到要删除的项目2、选中左下角Settings中的General3、点击Advanced栏下的Expand4、然后滑到最下面的Remove project5、输入要删除项目的名字&#xff0c;确认删除 二、GitHub中删除仓库1、找到要删除的仓库&#xff0c;点击右上方…

删除Github中项目步骤

这里写自定义目录标题 删除Github中项目步骤1、选择要删除项目2、点击“Setting”3、一直拉到最后&#xff0c;选择“Delete this repository”4、位置①就是你的项目名称&#xff0c;直接复制到位置②&#xff0c;点击位置③&#xff0c;即完成删除Github项目。 删除Github中项…

删除gitlab上仓库的分支

方法一&#xff1a;使用git命令来删除分支 1、进入相应的仓库&#xff0c;然后使用 git branch -a 命令查看该仓库所有的分支 2、删除相应的分支&#xff0c;这里以删除 “Redefine-PinDir-for-MoroccoA” 为例&#xff0c;执行git push origin --delete Redefine-PinDir-for…

gitlab中如何删除项目

1、首先&#xff0c;在你的项目列表中选择要删除的项目&#xff0c;点击进入&#xff1b; 2、点击Settings中的General&#xff0c; 然后点击Advanced settings 的Expend按钮&#xff1b; 3、滑到最下边&#xff0c;点击“Remove project” 4、在弹出框中输入要删除的项目名称即…

GitLab删除项目操作

1.选中所需删除的项目 2.选中settings —>general —>advance —>expand 3.选中最后 4.根据提示删除