删库跑路不用怕,来看看pgbackrest最佳实践

作者

马文斌

时间

2024-02-26

标签

pgbackrest 备份 实践

服务器介绍

ip软件角色
192.168.1.14postgresprimary
192.168.1.15postgresstandby
192.168.1.16pgbackrest远程备份工具端

主从库远程备份

安装pgbackrest 备份工具

提前安装依赖包:

yum install make gcc postgresql12-devel openssl-devel libxml2-devel lz4-devel libzstd-devel bzip2-devel libyaml-devel libssh2-devel postgresql-libs

在postgres 主机上配置环境变量

vim /etc/profile
添加一下内容:
export PATH=$PATH:/usr/local/pg-12/bin:/usr/local/pgbackrest/bin
export LD_LIBRARY_PATH=/usr/local/pg-12/lib

官网下载安装

wget https://github.com/pgbackrest/pgbackrest/archive/refs/tags/release/2.49.tar.gz
cd /usr/local/src/
tar -zxf pgbackrest-release-2.49.tar.gz && cd pgbackrest-release-2.49/src
./configure --prefix=/usr/local/pg_backrest
make
make install

su - pgbackrest
sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

主库配置文件

vim /etc/pgbackrest/pgbackrest.conf

[test]
pg1-path=/data/pgdata
pg1-socket-path=/tmp
pg1-user=postgres

[global]
repo1-host=192.168.1.16
repo1-host-user=pgbackrest
log-level-file=detail
log-path=/var/log/pgbackrest

主库参数解释:

[test] 部分
这个 test 是备份集群的名字,多个备份集群可以添加 比如:[test-1],[test-2] 等等
pg1-path=/data/pgdata: 指定 PostgreSQL 数据库实例的数据目录路径。这是 pgBackRest 需要备份的主要内容所在的位置。
pg1-socket-path=/tmp: 指定 PostgreSQL 服务器的套接字文件(socket file)路径。pgBackRest 使用这个路径来通过 UNIX 套接字连接到数据库。
pg1-user=postgres: 定义 pgBackRest 连接到 PostgreSQL 实例时应该使用的用户名。这个用户需要有足够的权限来读取数据库文件和执行备份相关的操作。
[global] 部分
这部分的配置适用于 pgBackRest 的全局设置,影响所有备份和恢复操作。

repo1-host=192.168.1.16: 指定远程备份仓库的主机地址。这表明备份数据将被存储在指定 IP 地址的服务器上。pgBackRest 支持多个备份仓库,这里的 repo1 表示第一个仓库。
repo1-host-user=pgbackrest: 定义访问远程备份仓库主机时使用的用户名。pgBackRest 将以这个用户的身份在远程主机上执行操作。
log-level-file=detail: 设置文件日志记录的详细级别。detail 级别会记录更详细的操作信息,有助于故障排查和监控备份过程。
log-path=/var/log/pgbackrest: 指定日志文件的存储路径。pgBackRest 会将运行日志写入这个目录下,便于后续的日志分析和问题定位。

远程备份工具端配置文件

vim /etc/pgbackrest/pgbackrest.conf

[test]
pg1-path=/data/pgdata
pg1-port=5432
pg1-socket-path=/tmp
pg1-user=postgres
pg1-host-config-path=/etc/pgbackrest
pg1-host=192.168.1.14
pg1-host-port=22
pg1-host-user=postgres

pg2-path=/data/pgdata
pg2-port=5432
pg2-socket-path=/tmp
pg2-user=postgres
pg2-host-config-path=/etc/pgbackrest
pg2-host=192.168.1.15
pg2-host-port=22
pg2-host-user=postgres

[global]

backup-standby=y
process-max=3
start-fast=y
repo1-path=/pgbackrest/backup
repo1-retention-full=2
backup-user=postgres
log-level-console=info
log-level-file=debug
buffer-size=16MiB
compress-type=gz

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

工具端参数解释

[test]
这个 test 是备份集群的名字,多个备份集群可以添加 比如:[test-1],[test-2] 等等
pg1-path 和 pg2-path:指定了两个数据库实例的数据目录路径。
pg1-port 和 pg2-port:定义了两个实例的端口号,通常 PostgreSQL 默认端口是 5432。
pg1-socket-path 和 pg2-socket-path:指定了 UNIX 套接字文件的路径,用于本地连接。
pg1-user 和 pg2-user:定义 pgBackRest 连接到各个 PostgreSQL 实例时使用的用户名。
pg1-host-config-path 和 pg2-host-config-path:指定远程主机上 pgBackRest 配置文件的路径。
pg1-host, pg2-host:定义了各实例所在的主机地址。
pg1-host-port 和 pg2-host-port:指定了用于 SSH 连接的端口号,默认为 22。
pg1-host-user 和 pg2-host-user:定义了 SSH 连接时使用的用户名。

[global] 部分
这部分定义了全局备份策略和行为。
backup-standby=y:启用备份从备用服务器进行,这有助于减少对生产数据库的性能影响。
process-max=3:定义了 pgBackRest 同时执行任务的最大进程数。
start-fast=y:启用快速启动模式,尝试减少备份期间的停机时间。
repo1-path:指定了备份仓库的路径。
repo1-retention-full=2:定义了完整备份的保留数量,超过这个数量的旧备份将被删除。
backup-user:指定执行备份操作的用户。
log-level-console:设置控制台日志级别。
log-level-file:设置文件日志的详细级别。
buffer-size:定义了缓冲区大小,用于优化性能。
compress-type=gz:指定了压缩类型,这里使用的是 gzip。
[global:archive-push] 部分
这部分专门用于配置归档推送操作。

compress-level=3:定义了压缩级别,数值越高,压缩效果越好,但需要更多的 CPU 资源。

ssh免密登陆配置:

  1. 在1.14 和 1.15 服务器上postgres用户 配置 1.16 pgbackrest 的用户公钥

    vim /home/postgres/.ssh/authorized_keys
    添加
    ssh-rsa AAAAB3NzNqA8iyWQPwd1QXHwWZQiMqHwViSj pgbackrest@ck-1.16
    
    授权:
    chmod go-w /home/postgres/
    chmod 700 /home/postgres/.ssh/
    chmod 600 /home/postgres/.ssh/authorized_keys
  2. 在 1.16 服务器上 pgbackrest 用户 配置 1.14和1.15 postgre 的用户公钥

    添加用户
    groupadd pgbackrest
    adduser -gpgbackrest -n pgbackrest
    
    vim /home/pgbackrest/.ssh/authorized_keys
    添加一下秘钥
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA postgres@ck-1.15
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA postgres@ck-1.14
    
    授权:
    chmod go-w /home/pgbackrest/
    chmod 700 /home/pgbackrest/.ssh/
    chmod 600 /home/pgbackrest/.ssh/authorized_keys

设置postgresql归档

这个设置完,数据库得重启一次才行,因为 archive_mode 是psotmaster进程控制的,得重启才生效,不是sighup参数

archive_command = 'pgbackrest --stanza=test archive-push %p'
archive_mode = on
listen_addresses = '*'
log_line_prefix = ''
max_wal_senders = 3
wal_level = replica

开始备份

初始化

备份工具端初始化:
pgbackrest pgbackrest --stanza=test --log-level-console=info stanza-create
主库初始化:
pgbackrest pgbackrest --stanza=test --log-level-console=info stanza-create

完全备份

在备份机上操作即可
pgbackrest --stanza=test --log-level-console=info backup --type=full

增备

pgbackrest pgbackrest --stanza=test --log-level-console=info backup --type=incr

差异备份

pgbackrest pgbackrest --stanza=test --log-level-console=info backup --type=diff

查看备份库文件

[pgbackrest@ck-1.16 test]$ pwd
/pgbackrest/backup/backup/test
[pgbackrest@ck-1.16 test]$ ll
total 28
drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 14:47 20240222-144623F
drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 15:23 20240222-152217F
drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 15:24 20240222-152217F_20240222-152451I
drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 15:27 20240222-152217F_20240222-152747D
drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 14:47 backup.history
-rw-r----- 1 pgbackrest pgbackrest 3236 Feb 22 15:27 backup.info
-rw-r----- 1 pgbackrest pgbackrest 3236 Feb 22 15:27 backup.info.copy
lrwxrwxrwx 1 pgbackrest pgbackrest   33 Feb 22 15:27 latest -> 20240222-152217F_20240222-152747D
文件命令规律
F 结尾是全备,--type=full
I 结尾是增备,--type=incr
D 结尾是差异备份,--type=diff

恢复

这个恢复操作的一台新的postgresql主机上操作,并配置好 pgbackrest.conf 文件 和 备份机可以免密登陆 ssh 登陆

pgbackrest.conf 配置文件
[test]
pg1-path=/data/pgdata
pg1-socket-path=/tmp
pg1-user=postgres

[global]
repo1-host=192.168.1.16
repo1-host-user=pgbackrest
log-level-file=detail
log-path=/var/log/pgbackrest
查看备份信息
pgbackrest info

[pgbackrest@ck-1.16 ~]$ pgbackrest info
stanza: test
  status: ok
  cipher: none

  db (current)
      wal archive min/max (12): 0000000100000002000000C4/0000000100000002000000CA

      full backup: 20240222-144623F
          timestamp start/stop: 2024-02-22 14:46:23+08 / 2024-02-22 14:47:13+08
          wal start/stop: 0000000100000002000000C4 / 0000000100000002000000C4
          database size: 2.9GB, database backup size: 2.9GB
          repo1: backup set size: 355.9MB, backup size: 355.9MB

      full backup: 20240222-152217F
          timestamp start/stop: 2024-02-22 15:22:17+08 / 2024-02-22 15:23:07+08
          wal start/stop: 0000000100000002000000C6 / 0000000100000002000000C6
          database size: 2.9GB, database backup size: 2.9GB
          repo1: backup set size: 355.9MB, backup size: 355.9MB

      incr backup: 20240222-152217F_20240222-152451I
          timestamp start/stop: 2024-02-22 15:24:51+08 / 2024-02-22 15:24:54+08
          wal start/stop: 0000000100000002000000C8 / 0000000100000002000000C8
          database size: 2.9GB, database backup size: 80.3KB
          repo1: backup set size: 355.9MB, backup size: 693B
          backup reference list: 20240222-152217F

      diff backup: 20240222-152217F_20240222-152747D
          timestamp start/stop: 2024-02-22 15:27:47+08 / 2024-02-22 15:27:50+08
          wal start/stop: 0000000100000002000000CA / 0000000100000002000000CA
          database size: 2.9GB, database backup size: 80.3KB
          repo1: backup set size: 355.9MB, backup size: 711B
          backup reference list: 20240222-152217F
恢复命令
pgbackrest --stanza=test --delta --log-level-console=detail --type=time "--target=2024-02-22 15:27:50+08" restore --repo-path=/pgbackrest/backup/ --pg1-path=/data/pgdata

注意事项:

  1. 关于pgbackrest 配置文件的解释:

带 “host” 的参数是个服务器主机相关的,比如 repo1-host-user=pgbackrest 是代表备份记住登陆的ssh用户

不带 “host” 的参数的是postgresql 数据库相关的,比如 pg1-user=postgres 是代表登陆数据库的用户
  1. 从库不需要配置 pgbackrest 文件 也不需要备份集群初始化,只需要配置ssh免密登陆,因为远程备份期间,pgbackrest 工具会ssh到从库去拉数据文件

  2. 备份集群初始化顺序,先远程工具端初始化 --> 再数据库端初始化

    pgbackrest pgbackrest --stanza=test --log-level-console=info stanza-create
  3. pgbackrest 一台机上安装后,二进制bin文件可以直接拷贝到新的服务器上使用,无需再次安装

  4. 备份集群的名字 [test] 要和 postgresql归档库中的 名字要一致,不然会备份不了,也就是

    图片

图片

6. 要开启从库备份,则要在 pgbackrest.conf配置文件上加上这个参数,意思是允许从库备份

[global]
backup-standby=y

7 .远程备份期间 pgbackrest 会多次ssh 到主库和从库,所以免密ssh登陆一定要配置要,如果有堡垒机环境的是用不了ssh的,那很遗憾 无法使用这个pgbackrest 软件做备份

作者公众号:

参考

https://github.com/pgbackrest/pgbackrest

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/413048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32程序(移植)中头文件的路径

例:#include "./BSP/LCD/lcd.h"为什么有的头文件加了路径? 先看AI的回答: 在C和C编程中,当我们在源文件中包含(或称为“引入”或“导入”)一个头文件时,编译器需要知道这个头文件的位置。通常,编译器会在…

gnss尾矿库安全监测系统是什么

【TH-WY1】GNSS尾矿库安全监测系统是一种利用全球导航卫星系统(GNSS)技术对尾矿库进行安全监测的系统。尾矿库是矿山企业的重要设施之一,用于存放矿山开采过程中产生的尾矿。由于尾矿库具有高能势和复杂的地质环境,存在溃坝、滑坡…

C++之类和对象(2)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 2. 赋值运算符只能重载成类的成员函数不能重载成全局函数 3. 用户没有显式实现时&…

GPT润色指令

1. GPT润色指令 Below is a paragraph from an academic paper. Polish the writing to meet the academic style,improve the spelling, grammar, clarity, concision and overall readability. When necessary, rewrite the whole sentence. Paragraph :你的句子…

php伪协议 [SWPUCTF 2022 新生赛]ez_ez_php(revenge)

打开题目 题目源代码如下 <?php error_reporting(0); if (isset($_GET[file])) {if ( substr($_GET["file"], 0, 3) "php" ) {echo "Nice!!!";include($_GET["file"]);} else {echo "Hacker!!";} }else {highlight_fi…

RubyMine 2023:让Ruby编程变得更简单 mac/win版

JetBrains RubyMine 2023是一款专为Ruby开发者打造的强大集成开发环境&#xff08;IDE&#xff09;。这款工具集成了许多先进的功能&#xff0c;旨在提高Ruby编程的效率和生产力。 RubyMine 2023软件获取 RubyMine 2023的智能代码编辑器提供了丰富的代码补全和提示功能&#…

1298 - 摘花生问题

题目描述 Hello Kitty 想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所有…

AI与大数据:智慧城市安全的护航者与变革引擎

一、引言 在数字化浪潮的席卷下&#xff0c;智慧城市正成为现代城市发展的新方向。作为城市的神经系统&#xff0c;AI与大数据的融合与应用为城市的安全与应急响应带来了革命性的变革。它们如同城市的“智慧之眼”和“聪明之脑”&#xff0c;不仅为城市管理者提供了强大的决策…

软考47-上午题-【数据库】-数据查询语言DQL2

一、聚合函数 聚合函数实现数据统计的功能&#xff0c;返回一个单一的值。聚合函数一般与select语句的group by子句一起使用。 示例&#xff1a; 二、数据分组-group by 聚合函数加上group by子句进行分组。 通常一个聚合函数的作用范围是满足where子句中指定条件的记录&…

Vue:vue的安装与环境的搭建

文章目录 环境搭建安装node.js&#xff08;比较简单&#xff09;安装Vue脚手架初始化启动 环境搭建 安装node.js&#xff08;比较简单&#xff09; 首先要安装node.js&#xff0c;进入官网下载即可。 更改安装路径&#xff0c;保持默认配置&#xff0c;一直点击下一步安装即可…

真实项目中,由于内存泄漏(OOM),导致1W多次full gc,最终项目宕机

一、背景 由于要做http全链路调用追踪&#xff0c;我们团队修改了httpclient底层代码&#xff0c;加了http调用日志&#xff0c;并且和我们配置中心打通&#xff0c;可以通过配置中心动态的控制日志输出&#xff0c;正是由于加了这个动态开关&#xff0c;导致的内存泄漏。 下面…

华为OD机试真题-最长子字符串的长度(一)-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; 思路转化&#xff1a;求出o字母出现偶次&#xff08;o的索引&#xff09;&#xff1b;环形–双倍字母&#xff1b; 方法1&#xff1a;循环变量双倍字母&#xff08;保证环线&#xff09;&#xff0c;记录最大偶次&#xff0c;如果是&a…

MySQL之Pt-kill工具

工具下载 [rootlocalhost1 bin]# wget percona.com/get/percona-toolkit.tar.gz [rootlocalhost1 bin]# yum install perl-DBI [rootlocalhost1 bin]# yum install perl-DBD-MySQL [rootlocalhost1 bin]# ./pt-kill --help1、每10秒检查一次&#xff0c;发现有 Query 的进程就…

如何在有限的预算里做好服务器的DDOS防护?

在网络安全领域&#xff0c;防御分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一项持续且复杂的挑战。尤其对于预算有限的组织来说&#xff0c;如何在不牺牲安全性的前提下进行有效的防护&#xff0c;更是一个需要深思熟虑的问题。以下是一些建议&#xff0c;帮助你在有限…

QT C++实现点击按键弹出窗口并显示图片/视频|多窗口应用程序的设计和开发

一、介绍 首先&#xff0c;QT界面开发中主要大体分为2种多窗口的形式&#xff1a; 嵌入式&#xff1a; 新生成的窗口嵌入在主窗口内部独立窗口&#xff1a; 以弹窗形式的新窗口生成和展示 这里就讲解最简单的&#xff1a;点击案件后&#xff0c;跳出一个新窗口 二、代码实…

%00截断 [GKCTF 2020]cve版签到

打开题目 F12之后在Headers中发现hint 两者结合利用零字符截断使get_headers()请求到本地127.0.0. 结合链接 构造 ?urlhttp://127.0.0.1%00www.ctfhub.com 必须以123结尾 ?urlhttp://127.0.0.123%00www.ctfhub.com 得到flag 知识点&#xff1a; PHP中get_headers函数 g…

python爬虫实战:获取电子邮件和联系人信息

引言 在数字时代&#xff0c;电子邮件和联系人信息成为了许多企业和个人重要的资源&#xff0c;在本文中&#xff0c;我们将探讨如何使用Python爬虫从网页中提取电子邮件和联系人信息&#xff0c;并附上示例代码。 目录 引言 二、准备工作 你可以使用以下命令来安装这些库&a…

【pytorch】常用代码

文章目录 条件与概率torch.tensor()torch.rand()torch.randn()torch.randint()torch.multinominal() 逻辑运算torch.argmax()torch.max()torch.sum()torch.tanh()torch.pow() 功能性操作 torch.nn.functionalF.normalize()F.elu()F.relu()F.softmax() 张量计算torch.zeros()tor…

OpenHarmony分布式购物车案例展示~

简介 分布式购物车demo 模拟的是我们购物时参加满减活动&#xff0c;进行拼单的场景&#xff1b;实现两人拼单时&#xff0c;其他一人添加商品到购物车&#xff0c;另外一人购物车列表能同步更新&#xff0c;且在购物车列表页面结算时&#xff0c;某一人结算对方也能实时知道结…

苹果设备再现完美兼容32位软件 只需一款神奇工具 CrossOver 24发布:基于 Wine 9.0,能让 Mac 初步运行 32位应用

近日&#xff0c;CodeWeavers发布了CrossOver 24版本的更新。这次的更新是基于最新的Wine 9.0版本而进行的。这一版本的更新不仅能够兼容更多应用程序和游戏&#xff0c;而且还可以初步支持运行32位的应用程序。 自从苹果在macOS Catalina系统中移除对32位软件的支持之后&…