postgresql增量备份系列一

简介

在一些大容量得数据库应用中,采用全量备份得方式,会带来大量时间浪费和开销,此时定期的增量备份可以使得数据存储周期变长。本文讲解几个增量备份工具

pg_basebackup + pg_receivewal(异地归档模式)

使用pg_basebackup进行全量备份,并创建复制槽receivewal_slot,在使用pg_receivewal通过复制槽receivewal_slot对wal的定位进行增量接收wal日志。全量加WAL-archiver就是类似PITR的一个数据回滚技术。只可以支持一次数据增量恢复。

 pg_basebackup -Fp -P -v -D backup/ -h 10.0.0.138 -p 5432 -d dbname=postgres  --create-slot   --slot=receivewal_slot
--对运行库postgres进行备份,生成备份文档backup/
-- receivewal_slot 生成receivewal_slot复制槽,用于pg_receivewal定位wal接收起始节点。

对运行主库进行pgbench 相关操作,刷WAL日志,模拟数据操作。

-- 创建一个标识表,用于观察增量效果psql -c " create table local_end(id  integer);"pgbench -ipgbench -T 200-- 查看当前LSN  
psql -c " select  pg_current_wal_lsn ();"
-- 切换wal文件
psql -c "select pg_switch_wal()"
-- 在创建一个表示表,用于观察增量效果
psql -c " create table local_false(id  integer);"
-- 切换wal文件
psql -c "select pg_switch_wal()"

image.png

使用pg_receivewal 进行接收中间空缺的WAL日志

-- 使用捅backup同一个复制槽receivewal_slot  pg_receivewal  -D /home/postgres/back_archivedir -n -v --synchronous --no-loop --slot=receivewal_slot  -h 10.0.0.138 -p 5432 -U postgres -d dbname=postgres 

image.png
使用pitr原理 分别对备份进行增量到0/1B037B00、0/1C001FF8两个LSN节点
image.png
在备份库中进行相应操作

cd backup/
touch recovery.signal   --在备份数据目录下创建恢复模式标识文件 
vim    postgresql.conf   --编辑备份库的相关配置参数信息restore_command = 'cp /home/postgres/back_archivedir/%f %p'  #在备份指定其回放时,从归档路径中寻找历史wal
recovery_target_lsn = '0/1B037B00'   ## 增量到指定的LSN停靠点

启动数据库

pg_ctl -D backup/   start 

查看日志,此时已经停靠到指定的LSN,并且可以看到0/1B037B00前创建的 local_end 表。
image.png
再次进行增量,只需要修改recovery_target_lsn参数便可。使其LSN二次增量的停靠点为0/1C001FF8
image.png
使用pg_controldata -D backup/查看备份的信息记录,可以看到其停靠点为0/1C001EF8符合预期
image.png

该方法支持多次增量同步,每一次增量只能向后推进时间线不可以向前。

pgBackRest

pgBackRest官网对于该备份工具(全量备份、差异备份、增量备份)
全量备份:pgBackRest 将数据库集群的全部内容复制到备份中。数据库集群的第一次备份始终是 Full Backup。pgBackRest 始终能够直接还原完整备份。完全备份不依赖于完全备份之外的任何文件来实现一致性。
差异备份:pgBackRest 仅复制自上次完整备份以来已更改的数据库群集文件。pgBackRest 通过复制所选差异备份中的所有文件以及上一个完整备份中相应的未更改文件来还原差异备份。差异备份的优点是它比完整备份需要更少的磁盘空间,但是,差异备份和完整备份都必须有效才能还原差异备份。
增量备份:pgBackRest 仅复制自上次备份(可以是另一个增量备份、差异备份或完整备份)以来已更改的数据库集群文件。由于增量备份仅包括自上次备份以来更改的那些文件,因此它们通常比完整备份或差异备份小得多。与差异备份一样,增量备份依赖于其他备份有效才能还原增量备份。由于增量备份仅包括自上次备份以来的文件,因此所有先前的增量备份返回到先前的差异备份、先前的差异备份和先前的完整备份都必须有效,才能执行增量备份的还原。如果不存在差异备份,则所有先前的增量备份都返回到先前的完整备份(必须存在),并且完整备份本身必须有效,才能还原增量备份。
下载pgbackres 进行安装。pgbackrest要求openssl需要再1.1以上版本。查看openssl版本

opnessl  version  ##如果低于1.1版本,此时需要进行手工安装
## 下载最新版本进行安装
yum remove openssl -y 
yum group install 'Development Tools'yum -y install zlib-devel zlib perl*yum -y install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl openssl-devel xz xz-devel libffi-devel libuuid-devel perl-core epel-release tk-devel ncurses-libs gdbm-devel libdbi-devel python-backports-lzma perl-IPC-Cmd perl-Data-Dumper更新系统已安装软件yum -y install
tar -zxvf openssl-3.4.0.tar.gz mv openssl-3.4.0 openssl 
cd openssl/
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl --shared zlib
make 
make test ## 查看测试使得否通过
make ininstall 
## 软连接替换依赖
sudo mv /usr/lib64/libssl.so /usr/lib64/libssl.so.old
sudo ln -s /usr/local/openssl/lib64/libssl.so /usr/lib64/libssl.sosudo mv /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so.old
sudo ln -s /usr/local/openssl/lib64/libcrypto.so /usr/lib64/libcrypto.so
## 动态库配置
echo "/usr/local/openssl/lib64" >> /etc/ld.so.conf.d/openssl-3.1.4.conf  
ldconfig -v
##默认环境编配
echo "export PATH=/usr/local/openssl/bin:\$PATH" | sudo tee /etc/profile.d/openssl.sh
echo "export LD_LIBRARY_PATH=/usr/local/openssl/lib64:\$LD_LIBRARY_PATH" | sudo tee -a /etc/profile.d/openssl.sh
source /etc/profile.d/openssl.sh
## 查看安装结果
openssl version

pgbackrest安装步骤

wget https://github.com/pgbackrest/pgbackrest/archive/refs/tags/release/2.54.0.tar.gz 
--解压
yum install libxml2-devel libyaml-devel bzip2-devel -y tar  -zxvf pgbackrest-release-2.54.0.tar.gz cd pgbackrest-release-2.54.0/src
./configure LDFLAGS="-L/usr/local/openssl/lib64" CPPFLAGS="-I/usr/local/openssl/include"
make && make install
## 指令包 复制到/usr/bin目录下
sudo scp  pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest创建相关存储路径
sudo mkdir -p -m 770 /var/log/pgbackrest   ## 日志文件路径
sudo chown postgres:postgres /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 postgres:postgres /etc/pgbackrest/pgbackrest.conf## 测试pgbackrest是否可用
su - postgres 
pgbackrest

image.png

定义pgbackrest.conf配置,
在v2.02中,pgBackRest配置文件的默认位置已从/etc/pgbackrest.conf更改为/etc/pgbackrest/pgbackrest.conf。会优先加载/etc/pgbackrest.conf,若不存在才会加载/etc/pgbackrest/pgbackrest.conf文件。

备份端配置如下
# vim /etc/pgbackrest/pgbackrest.conf
[test]
pg1-path=/home/postgres/pg/data
pg1-port=5432
pg1-socket-path=/tmp
pg1-user=postgres
pg1-host-config-path=/etc/pgbackrest
pg1-host=10.0.0.138
pg1-host-port=22
pg1-host-user=postgres[global]
process-max=3
start-fast=y
repo1-path=/home/postgres/backup
repo1-retention-full=2
backup-user=postgres
log-level-console=info
log-level-file=debug
buffer-size=16MiB
compress-type=gz
backup-standby=n[global:archive-push]
compress-level=3备份源配置如下
## vim /etc/pgbackrest/pgbackrest.conf[test]
pg1-path=/home/postgres/pg/data
[global]
log-level-file=detail
repo1-host=10.0.0.107
repo1-host-user=postgres
log-path=/var/log/pgbackrest

在数据源端和备份端,需要创建两个机器的免密登录信息

 ssh-keygen -t rsassh-copy-id postgres@10.0.0.138ssh-keygen -t rsassh-copy-id postgres@10.0.0.107

在备份源端,
注意$PGHOME/lib 需要配置到 /home/postgres/.bashrc 下

echo "
export PGHOME=/home/postgres/pg
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH  " >> /home/postgres/.bashrc
source /home/postgres/.bashrc

调整archive_command参数

archive_command = 'pgbackrest --stanza=test archive-push %p'
archive_mode = on
##重启数据库

备份端
执行创建备份

## 必须使用stanza-create  进行初始化节点。[postgres@vm107 ~]$  pgbackrest --stanza=test --log-level-console=info stanza-create
2024-10-29 20:46:32.293 P00   INFO: stanza-create command begin 2.54.0: --buffer-size=16MiB --exec-id=4578-cca3ce09 --log-level-console=info --log-level-file=debug --pg1-host=10.0.0.138 --pg1-host-config-path=/etc/pgbackrest --pg1-host-port=22 --pg1-host-user=postgres --pg1-path=/home/postgres/pg/data --pg1-port=5432 --pg1-socket-path=/tmp --pg1-user=postgres --repo1-path=/home/postgres/backup --stanza=test
2024-10-29 20:46:32.550 P00   INFO: stanza-create for stanza 'test' on repo1
2024-10-29 20:46:32.664 P00   INFO: stanza-create command end: completed successfully (374ms)## 执行效验
[postgres@vm107 ~]$ pgbackrest --stanza=test check
2024-10-29 20:47:00.590 P00   INFO: check command begin 2.54.0: --backup-standby=y --buffer-size=16MiB --exec-id=4658-99926db1 --log-level-console=info --log-level-file=debug --pg1-host=10.0.0.138 --pg1-host-config-path=/etc/pgbackrest --pg1-host-port=22 --pg1-host-user=postgres --pg1-path=/home/postgres/pg/data --pg1-port=5432 --pg1-socket-path=/tmp --pg1-user=postgres --repo1-path=/home/postgres/backup --stanza=test
2024-10-29 20:47:00.980 P00   WARN: option 'backup-standby' is enabled but standby is not properly configured
2024-10-29 20:47:00.980 P00   INFO: check repo1 configuration (primary)
2024-10-29 20:47:01.027 P00   INFO: check repo1 archive for WAL (primary)
2024-10-29 20:47:01.648 P00   INFO: WAL segment 000000010000000000000022 successfully archived to '/home/postgres/backup/archive/test/16-1/0000000100000000/000000010000000000000022-8dcdaed28bccf22a0ba8424d449053abcd7f5fe9.gz' on repo1
2024-10-29 20:47:01.754 P00   INFO: check command end: completed successfully (1166ms)## 执行全备份
[postgres@vm107 ~]$ pgbackrest --stanza=test --log-level-console=info backup
2024-10-29 20:59:28.674 P00   INFO: backup command begin 2.54.0: --backup-standby=n --buffer-size=16MiB --compress-type=gz --exec-id=4846-9c94c63f --log-level-console=info --log-level-file=debug --pg1-host=10.0.0.138 --pg1-host-config-path=/etc/pgbackrest --pg1-host-port=22 --pg1-host-user=postgres --pg1-path=/home/postgres/pg/data --pg1-port=5432 --pg1-socket-path=/tmp --pg1-user=postgres --process-max=3 --repo1-path=/home/postgres/backup --repo1-retention-full=2 --stanza=test --start-fast
2024-10-29 20:59:29.044 P00   WARN: no prior backup exists, incr backup has been changed to full
2024-10-29 20:59:29.044 P00   INFO: execute non-exclusive backup start: backup begins after the requested immediate checkpoint completes
2024-10-29 20:59:29.145 P00   INFO: backup start archive = 000000010000000000000024, lsn = 0/24000028
2024-10-29 20:59:29.145 P00   INFO: check archive for prior segment 000000010000000000000023
2024-10-29 20:59:35.318 P00   INFO: execute non-exclusive backup stop and wait for all WAL segments to archive
2024-10-29 20:59:35.352 P00   INFO: backup stop archive = 000000010000000000000024, lsn = 0/24000138
2024-10-29 20:59:35.374 P00   INFO: check archive for segment(s) 000000010000000000000024:000000010000000000000024
2024-10-29 20:59:36.233 P00   INFO: new backup label = 20241029-205929F
2024-10-29 20:59:36.276 P00   INFO: full backup size = 42.7MB, file total = 988
2024-10-29 20:59:36.276 P00   INFO: backup command end: completed successfully (7604ms)
2024-10-29 20:59:36.276 P00   INFO: expire command begin 2.54.0: --buffer-size=16MiB --exec-id=4846-9c94c63f --log-level-console=info --log-level-file=debug --repo1-path=/home/postgres/backup --repo1-retention-full=2 --stanza=test
2024-10-29 20:59:36.277 P00   INFO: expire command end: completed successfully (1ms)
查看示例脚本

在其解压包有配置查看备份信息的脚本pgsql-pgbackrest-info.sql、pgsql-pgbackrest-query.sql

cd /build/pgbackrest-release-2.54.0/doc/example
## 如果备份端 有安装样例数据库的情况下,可以使用psql -f 可以进行加载
psql -f /build/pgbackrest-release-2.54.0/doc/example/pgsql-pgbackrest-info.sql  
psql -f /build/pgbackrest-release-2.54.0/doc/example/pgsql-pgbackrest-query.sql

image.png

执行增量备份
pgbackrest --stanza=test --log-level-console=info --type=incr backup

image.png

除了以上两个备份工具意外,常用比较多的还有pg_rman、pg_probackup。下一篇文章再写吧。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis pro 3.3.1安装教程

一、获取方式: http://dt4.8tupian.net/2/29913a61b1500.pg3二、软件目录: 三、安装步骤: (1)安装软件运行环境windowsdesktop-runtime 8.0.4; (2)选中安装文件arcgispro_33zh_cn_190127.exe&…

LabVIEW汽车状态监测系统

LabVIEW汽车状态监测系统通过模拟车辆运行状态,有效地辅助工程师进行故障预测和维护计划优化,从而提高汽车的可靠性和安全性。 项目背景: 现代汽车工业面临着日益增长的安全要求和客户对于车辆性能的高期望。汽车状态监测系统旨在实时监控汽…

GiantPandaCVARM Neon Intrinsics 学习指北:从入门、进阶到学个通透

【GiantPandaCV导语】Neon是手机普遍支持的计算加速指令集,是AI落地的工程利器。Neon Intrinsics 的出现,缓解了汇编语言难学难写的难题,值得工程师们开发利用。 前言 Neon是ARM平台的向量化计算指令集,通过一条指令完成多个数据…

python爬虫抓取豆瓣数据教程

环境准备 在开始之前,你需要确保你的Python环境已经安装了以下库: requests:用于发送HTTP请求。BeautifulSoup:用于解析HTML文档。 如果你还没有安装这些库,可以通过以下命令安装: pip install requests…

SD-WAN分布式组网:构建高效、灵活的企业网络架构

随着企业数字化转型的深入,分布式组网逐渐成为企业网络架构中的核心需求。无论是跨区域的分支机构互联,还是企业与云服务的连接,如何在不同区域实现高效、低延迟的网络传输,已成为业务成功的关键。SD-WAN(软件定义广域…

使用Python和OpenCV实现火焰检测

使用Python和OpenCV实现火焰检测 项目解释: 此 Python 代码是使用 OpenCV、线程、声音和电子邮件功能的火灾探测系统的简单示例。 以下是它的功能的简单描述: 导入库:代码首先导入必要的库: cv2:用于图像和视频处理…

一篇文章入门傅里叶变换

文章目录 傅里叶变换欧拉公式傅里叶变换绕圈记录法质心记录法傅里叶变换公式第一步:旋转的表示第二步:缠绕的表示第三步:质心的表示最终步:整理积分限和系数 参考文献 傅里叶变换 在学习傅里叶变换之前,我们先来了解一…

基于uniapp微信小程序的校园二手书交易系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

Spring 框架环境搭建

一、环境要求 JDK版本: JDK1.7及以上版本 Spring版本: Spring5.x版本 二、新建Maven项目 1. 创建 Maven 的普通 Java 项⽬ 2.设置项目坐标 3.设置项目的Maven环境 4.设置项目的名称和存放的工作空间 三、调整项目环境 1.修改JDK版本 properties&g…

前端 eslint 配置,以及在git提交之前自动format

目录 1、配置eslint步骤 1、eslint安装配置步骤 2、配置scripts步骤 3、测试eslint 2、配置git-hook1、安装环境2、最终效果 众所周知,前端项目可以在报很多error的情况下运行。但是良好的代码规范仍然有利于项目的开发维护,这里提供我的规范&#xff0c…

SpringBoot篇(运维实用篇 - 临时属性)

目录 一、临时属性设置 1. 简介 2. 属性加载优先级 那是否还有其他的配置方式呢? 3. 知识小结 二、开发环境中使用临时属性 1. 如何操作 2. 知识小结 3. 思考 三、配置文件分类 1. 简介 2. 4个级别 3. 为什么设计多种配置文件? 一个典型的应…

基于vue框架的的汇生活家居商城的设计与实现bdjlq(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:商品分类,商品信息,用户 开题报告内容 开题报告 项目名称:基于Vue框架的汇生活家居商城的设计与实现 一、项目背景与意义 随着互联网技术的不断发展和普及,电子商务已成为现代商业的重要组成部分。家居商城作…

免费可离线的AI抠图工具(鲜艺AI抠图 )免费下载

鲜艺AI抠图是一款使用Tauri 2 和RMBG-1.4 开发并免费提供的AI抠图工具,它能够快速去除图片背景,并支持本地和在线图片处理。: 极速AI抠图: 基于最新的AI技术,能够精准识别图像中的前景和背景,实现快速抠图…

面试经典 150 题.P27. 移除元素(002)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int removeElement(int[] nums, int…

标准正态分布的数据 tensorflow 实现正态分布图,python 编程,数据分析和人工智能...

登录后复制 import tensorflow as tfimport matplotlib.pyplot as plt# 设置随机种子以获得可重复的结果tf.random.set_seed(42)# 生成正态分布的数据# mean0 和 stddev1 表示生成标准正态分布的数据# shape(1000,) 表示生成1000个数据点data tf.random.normal(mean0, stddev1…

13.音乐管理系统(基于SpringBoot + Vue)

目录 1.系统的受众说明 ​​​​​​​ 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图(图2.2.1-1) 2.2.2 系统功能表(表2.2.2…

iOS调试真机出现的 “__llvm_profile_initialize“ 错误

一、错误形式&#xff1a; app启动就崩溃&#xff0c;如下&#xff1a; Demo__llvm_profile_initialize:0x1045f7ab0 <0>: stp x20, x19, [sp, #-0x20]!0x1045f7ab4 <4>: stp x29, x30, [sp, #0x10]0x1045f7ab8 <8>: add x29, sp, #0x100x1…

[Linux] linux 软硬链接与动静态库

标题&#xff1a;[Linux] linux 软硬链接与动静态库 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; /** _oo0oo_* o8888888o* 88" . "88* (| -_- |)* …

[mysql]相关子查询

相关子查询 相关子查询的概述 我们前面把单行子查询和多行子查询就已经说完了,我们现在要把继续把相关子查询的内容给大家说明白,因为之前用的都是不相关子查询的案例, 我们来谈一谈相关子查询,记住单行子查询和多行子查询是可以进行相关子查询,只是我们刚才写的案例都是相关…

【C++】—— priority_queue :平衡效率与秩序的算法利器

去感受一棵草、一缕风、一场日落&#xff0c;去重新触摸真正的生活。 ——高盛元 目录 1、优先级队列 1.1什么是优先级队列 1.2 priority_queue 的使用 1.3 仿函数 2、priority_queue 的模拟实现 2.1整体框架接口 2.2插入&&向上调整 2.2删除&&向下调整…