PostgreSQL物理备份-pg_rman

1.简介

pg_rman 是类似于 oracle 的 rman 备份工具,它实现了全量、增量、归档等类型的备份,
可以很灵活的管理 PostgreSQL 数据库的备份。pg_rman 是一款开源的 PostgreSQL 的
备份恢复插件,支持在线备份和基于 PITR 的恢复方式。

2.pg_rman特点

 使用简单,一个命令即可完成备份和恢复. 
 支持在线全备,增量备份,归档备份. 
 支持备份压缩,通过 gzip 工具实现页内压缩. 
 自动备份维护,自动删除过期的 WAL 备份文件. 
 支持备份验证. 
 恢复期间无事务丢失,支持基于 PITR 的恢复 
pg_rman 注意事项: 
 pg_rman 基于 pg_start_backup,copy,pg_stop_backup()的备份模式,因为是文
件拷贝模式,而不是流复制协议,所以 pg_rman 必须在数据库节点上运行。
 pg_rman 需要在本地安装,不能远程备份 
 pg_rman 需要下载对应的版本 

3.pg_rman命令选项

命令选项: -D, --pgdata=PATH # 数据目录
-A, --arclog-path=PATH # 归档 wal 目录 -S, --srvlog-path=PATH # 数据库服务器日志路径 -B, --backup-path=PATH # 备份目录 -c, --check # 检查 -v, --verbose # 显示详细消息 -P, --progress # 显示处理进度 
备份选项: -b, --backup-mode=MODE # 备份模式:全备,增备,归档 -s, --with-serverlog # 备份服务器日志文件 -Z, --compress-data # 使用 zlib 压缩数据备份 -C, --smooth-checkpoint # 在备份前做平滑检查点 -F, --full-backup-on-error # 切换到完全备份模式,注意:此选项仅用于--backupmode = incremental 或 archive --keep-data-generations=2 # 保留 2 份全备 --keep-data-days=15 # 备份保留 15 天 --keep-arclog-files=NUM # 保留 NUM 个归档日志 --keep-arclog-days=DAY # 归档 WAL 保留多久 --keep-srvlog-files=NUM # 保留 NUM 个服务器日志 --keep-srvlog-days=DAY # 服务器日志保留多久 --standby-host=HOSTNAME # 指定备库 IP
--standby-port=PORT # 指定备库端口 
还原选项: 
--recovery-target-time # 恢复到指定时间戳 
--recovery-target-xid # 恢复到指定事务 ID 
--recovery-target-inclusive # 是否包含恢复目标 
--recovery-target-timeline # 恢复到特定的时间线 
--hard-copy # 复制 archivelog 而不是符号链接 
目录选项: -a # 显示已删除的备份 
删除选项: -f # 强制删除比规定日期更旧的备份 
连接选项: -d, --dbname=DBNAME # 连接指定库 -h, --host=HOSTNAME # 数据库主机名/IP 地址 -p, --port=PORT # 数据库端口 -U, --username=USERNAME # 数据库用户名 -w, --no-password # 不提示密码-W, --password # 强制密码提示 
通用选项: 
-q, --quiet # 不显示任何 INFO 或者 DEBUG 信息。 
--debug # 查看 debug 信息。

4.安装pg_rman

软件下载: https://github.com/ossc-db/pg_rman
文档地址: http://ossc-db.github.io/pg_rman/index.html
源码安装:
wget -c https://github.com/ossc-db/pg_rman/archive/refs/heads/master.zip 
cd pg_rman 
export PATH=/usr/local/pgsql/bin:$PATH 
make 
make install
pg_rman 会默认安装在/usr/local/pgsql/bin/目录下
[root@pghost ~]# which pg_rman 
/usr/local/pgsql/bin/pg_rman

RPM安装

wget -c https://github.com/osscdb/pg_rman/releases/download/V1.3.15/pg_rman-1.3.15-1.pg14.rhel8.x86_64.rpm wget -c https://github.com/osscdb/pg_rman/releases/download/V1.3.15/pg_rman-debuginfo-1.3.15-1.pg14.rhel8.x86_64.rpm yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 
yum makecache 
yum -y install pg_rman-1.3.15-1.pg14.rhel8.x86_64.rpm 
yum -y install pg_rman-debuginfo-1.3.15-1.pg14.rhel8.x86_64.rpmvi /etc/profile 
export PATH=/usr/pgsql-14/bin:$PATH 
source /etc/profile

配置环境变量

su - postgres 
vi .bashrc 
export BACKUP_PATH=/home/postgres/backups 
export ARCLOG_PATH=/home/postgres/archives 
export SRVLOG_PATH=/home/postgres/pgdata/log
--让环境变量生效 
source .bashrc

配置pg_rman

1.开启数据库归档模式

mkdir /home/postgres/backups 
mkdir /home/postgres/archives 
vi postgresql.conf 
archive_mode = on 
archive_command = 'cp %p /home/postgres/archives/%f' 
pg_ctl restart
注意:如果不开启归档模式在初始化备份目录的时候会出现下面的警告信息。
pg_rman init --backup-path=/home/postgres/backups 
WARNING: ARCLOG_PATH is not set yet 
DETAIL: The archive_command is not set in postgresql.conf. 
HINT: Please set ARCLOG_PATH in pg_rman.ini or environmental variable. 
INFO: SRVLOG_PATH is set to '/home/postgres/pgdata/log'

2.初始化备份目录

初始化一个 backup catalog,目录将用于存放备份的文件,也会存放一些元数据,例如
备份的配置文件,数据库的 systemid,时间线文件历史。
注意:备份目录不要放在数据目录下,否则每备份都会将之前的备份再备份一遍,从而导
致备份文件异常增大
[postgres@pghost ~]$ pg_rman init --backup-path=/home/postgres/backups 
INFO: ARCLOG_PATH is set to '/home/postgres/archives' 
INFO: SRVLOG_PATH is set to '/home/postgres/pgdata/log' 
[postgres@pghost backups]$ ll 
总用量 8 
drwx------. 4 postgres postgres 34 3 月 19 16:36 backup 
-rw-rw-r--. 1 postgres postgres 74 3 月 19 16:36 pg_rman.ini 
-rw-rw-r--. 1 postgres postgres 40 3 月 19 16:36 system_identifier 
drwx------. 2 postgres postgres 6 3 月 19 16:36 timeline_history
在 catalog 中有 pg_rman.ini 文件,可配置备份的环境变量、备份选项、备份集保留期限
等信息。
[postgres@pghost backups]$ cat pg_rman.ini 
ARCLOG_PATH='/home/postgres/archives' --归档目录 
SRVLOG_PATH='/home/postgres/pgdata/log' --数据库错误日志目录
COMPRESS_DATA = YES --压缩数据 
KEEP_ARCLOG_FILES = 10 --保存归档文件个数 
KEEP_ARCLOG_DAYS = 15 --保存归档的天数 
KEEP_DATA_GENERATIONS = 2 --备份冗余度
KEEP_DATA_DAYS = 15 --保存备份集时间
KEEP_SRVLOG_FILES = 10 --保存日志文件个数 
KEEP_SRVLOG_DAYS = 15 --保存日志文件天数

5.pg_rman备份 

全量备份
如果没有设置环境变量(BACKUP_PATH),需要手动指明备份路径 --backup
path=/home/postgres/backups
pg_rman backup --backup-mode=full --全量备份 
pg_rman show --查看备份集的状态 
pg_rman show detail --显示更多详细信息 
pg_rman show '2023-03-20 10:00:00' --指定日期可以查看备份的详细信息
pg_rman validate --校验备份集的有效性
未校验备份集 Status 显示为 DONE,校验后变为 OK
注意:每次备份的时候会创建一个当天日期的目录,然后目录下面创建一个与当前时间一
致的目录。
在做备份操作时,建议使用参数
-C, 备份前做检查点
-Z, 使用 zlib 压缩数据备份
增量备份
仅备份上次验证备份后修改的文件或页面。
pg_rman backup --backup-mode=incremental --with-serverlog 
--with-serverlog 表示将数据库日志文件一起备份 
注意: 创建增量备份之前必须先创建一个全量备份。 
pg_rman show 
pg_rman validate

归档备份

仅备份存档 WAL 文件
pg_rman backup --backup-mode=archive

6.备份管理

按指定时间从 catalog 删除备份集
例如只需要备份集能恢复到 2023-03-19 16:46:58,在这个时间点以前,不需要用来恢复
到这个时间点的备份全删掉。但是会保留一次全备份。加上-f 会强制删除
[postgres@pghost ~]$ pg_rman delete 2023-03-19 16:46:58 
WARNING: using force option will make some of the remaining backups unusable 
DETAIL: Any remaining incremental backups that are older than the oldest 
available full backup cannot be restored. 
INFO: delete the backup with start time: "2023-03-19 16:46:58" 
[postgres@pghost ~]$ pg_rman show 
=====================================================
================ StartTime EndTime Mode Size TLI Status 
=====================================================
================
注意: 删除增量备份的同时,也会把全量备份给删除了。
清除备份集(删除已删除的备份)
虽然 delete 命令从文件系统中删除了实际数据,但是仍然有一些已删除备份的目录信息,
需要执行 purge 命令来删除。
pg_rman show -a 
pg_rman purge 
pg_rman show -a
备份集校验(建议在备份后尽快验证备份文件。未验证的备份不能用于还原或增量备份)
备份成功后,其状态是 done,还需要进行 validate 操作后,备份集才可用于恢复,增量
备份才会用于做对比。
pg_rman validate

 7.定时备份

在生产环境中,需制定备份策略,通常每周全备,每天增量,同时备份归档日志
# 设置备份任务 
crontab -e 
#分 时 日 月 星期 命令/脚本 
00 22 * * 0 pg_rman backup --backup-mode=full 
00 22 * * 1-6 pg_rman backup --backup-mode=incremental

7.pg_rman恢复

pg_rman 恢复默认原地恢复(覆盖式),或者使用新的$PGDATA 作为恢复目标。
建议不要删除原始数据库,因为 pg_rman 必须从中检查时间轴 ID 或数据校验和状态。
Restore 命令将保存未归档的事务日志并删除所有数据库文件。
1、recovery-target-timeline TIMELINE
如果不指定时间线,则使用$PGDATA/global/pg_control,如果没有
$PGDATA/global/pg_control,则使用最新的全量备份集的时间线。
2、recovery-target-time TIMESTAMP
如果不指定,则恢复到最新时间
3、recovery-target-xid XID
如果不指定,则恢复到最新 xid
4、recovery-target-inclusive
是否在指定的恢复目标(true)之后停止,默认为 true,如果指定 false 意识是在恢复目
标之前停止
–hard-copy
在做恢复操作时,建议使用此参数
如果不指定 hard-copy,则归档日志目录里的归档日志是使用的硬连接指向备份目录中的
归档日志,加了这个参数的话,则是直接把备份目录中的归档日志拷贝到归档日志目录。
恢复数据库
先停用数据库服务,然后删除数据库文件
必须要先停止 postgresql 不然会报错 ERROR: PostgreSQL server is running 
pg_ctl stop 
rm -rf $PGDATA/* 
pg_rman restore --全量恢复 
pg_rman restore --recovery-target-time='2022-11-29 15:47:42' --恢复到指定时间点
恢复之后,重启数据库:会出现以下内容:
此时数据库进入只读状态。
需要执行以下命令才能继续
select pg_wal_replay_resume();
注意:
在基于时间点恢复之后,那么此时 DB 与之前的备份已经不在同一时间线上。恢复默认只
沿着基础备份建立时时间线恢复而不会切换到新的时间线,所以建议在恢复之后,立即对
数据库做一个全库的备份。

保留策略:

清除归档
清除指定归档之前的归档日志:
pg_archivecleanup /home/postgres/archive 000000010000000000000003
也可以在 postgresql.conf 文件中添加自动清除归档的命令:
archive_cleanup_command = 'pg_archivecleanup /home/postgres/archives %r'
修改备份策略
[postgres@pghost backups]$ vi pg_rman.ini
KEEP_DATA_GENERATIONS=2 
KEEP_DATA_DAYS=15 
KEEP_ARCLOG_DAYS=15 
KEEP_SRVLOG_DAYS=30
参数说明:
KEEP_DATA_GENERATIONS=2,保留 2 份以前全备数量,加上正在执行的全备,实际上
有 3 份全备
KEEP_DATA_DAYS=15,数据保留 15 天
KEEP_ARCLOG_DAYS=15,WAL 日志保留 15 天
KEEP_SRVLOG_DAYS=30,LOG 日志保留 30 天数

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

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

相关文章

Leetcode.1735 生成乘积数组的方案数

题目链接 Leetcode.1735 生成乘积数组的方案数 rating : 2500 题目描述 给你一个二维整数数组 q u e r i e s queries queries ,其中 q u e r i e s [ i ] [ n i , k i ] queries[i] [n_i, k_i] queries[i][ni​,ki​] 。第 i i i 个查询 q u e r i e s [ i …

JAVA SDK 整合 AI 大语言模型

目前主流模型厂商的 SDK 并没有很好的支持 JAVA 环境,主流还是使用的 Python ,如果希望将 AI 功能集成到业务中来,则需要找找有没有一些现成的开源项目,但是这种项目一般需要谨慎使用,以防有偷取 app_key 等风险问题 前…

如何在Linux下使用git(几步把你教会)

目录 一、注册github账号 二、新建项目 1.点击右上角自己的头像,然后点击Your repositories。 2.点击New。 3.配置新项目信息。 4.点击Create repository即可成功创建。 三、安装git 四、配置git 五、初始化git仓库 1.先进入想要使用git的目录。 2.初始化…

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性,并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容,并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和…

多孔散热器简介

今天给大家分享关于多孔散热器的一些构造、散热情况。 更多资讯,请关注B站【莱歌数字】,有视频教程~~ 常见的散热器通常由不渗透水、空气和其他液体的无孔材料制成。固体铝和铜是行业标准。 但散热器也可以作为半多孔材料或多孔涂层。研究和应用表明&…

防静电监控系统全方位防静电监测,保障产品质量

在当今高度精密的电子制造领域,产品质量的保障至关重要。哪怕是微小的静电干扰,都可能导致电子元件损坏、性能下降,从而影响整个产品的质量和可靠性。为了应对这一挑战,某电子工厂车间引入了先进的防静电监控系统,实现…

11g rac db安装软件时找不到 节点的问题处理

问题 在安装11.2.0.4db软件时数据库软件无法识别集群的两个主机 处理方法 [oracleracdg1-1 database]$ cd /u01/app/oraInventory/ [oracleracdg1-1 oraInventory]$ ls ContentsXML logs oraInst.loc orainstRoot.sh oui [oracleracdg1-1 oraInventory]$ cd ContentsXML/…

Qt | QSS自定义部件的外观

01、简介 一、自定义部件外观基础 1、有 3 种方法可实现自定义界面外观:重新实现 paintEvent()函数,使用 QStyle 类的绘制函数,子类化 QStyle,本小节仅介绍方法 1 和 2 的使用方式,方法 3 见下一节。 2、方法一:Qt 通过 QWidget::paintEvent()函数实现界面外观的绘制,…

7-什么是自动驾驶中的CopyCat?

"CopyCat"这个词通常有两个含义: 字面意思:它可以指一个模仿别人的人,就像猫一样模仿其他猫的行为。在日常用语中,如果有人说某人是个"copycat",他们可能是在说这个人缺乏原创性,总是…

Linux运行jar包:Invalid or corrupt jarfile

你们好,我是金金金。 场景 maven打包springboot项目得到一个jar包,我通过xshell上传到虚拟机环境里面,试图运行它,结果Invalid or corrupt jarfile:jar 文件无效或损坏 排查 jdk版本是否一致?结果&#xf…

参数页面设计

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 参数页面设计 {public partial class Form1 : Form{List<PMs> PMs new List<PMs>();public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){for (int …

深入解析 Python dataclass:类属性与类方法解释

文章目录 dataclass实例属性和类属性自动设置属性 实例方法静态方法&#xff08;staticmethod&#xff09;和 类方法&#xff08;classmethod&#xff09;静态方法类方法 dataclass dataclass 是 Python 3.7 引入的一个装饰器&#xff0c;用于简化类的定义。 使用 dataclass …

Django教程(001):安装及快速上手

1.1 Django安装 pip install django安装之后 c:\python39-python.exe-Scripts-pip.exe-django-admin.exe【安装django之后&#xff0c;工具&#xff0c;创建django项目】-Lib-内置模块-site-packages-flask-django(安装django之后&#xff0c;【django框架源码】)如下图&…

oracle如何分段写入clob字段

在Oracle数据库中&#xff0c;当需要向CLOB字段中写入大量数据时&#xff0c;通常需要分段写入&#xff0c;以避免因单次写入数据量过大而导致的问题。以下是正确分段写入CLOB字段中数据的步骤和注意事项&#xff1a; 1. 使用DBMS_LOB包 Oracle提供了DBMS_LOB包&#xff0c;它…

思考题:相交的几何图形

给定不超过 26 个几何图形&#xff0c;每个图形都有一个唯一大写字母作为其编号。 每个图形在平面中的具体位置已知&#xff0c;请你判断&#xff0c;对于每个图形&#xff0c;有多少个其他图形与其存在交点。 在判断交点时&#xff0c;只考虑边与边相交的情况&#xff0c;如…

AIGC+艺术=教育变革?

在数字化时代的浪潮中&#xff0c;技术的每一次跃进都深刻影响着社会的各个领域&#xff0c;教育亦不例外。近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术的兴起&#xff0c;为艺术教育领域带来了前所未有的变革机遇。当AIGC与艺术相结合&#xff0c;我…

kafka 集群安全认证机制的设计实现

kafka 集群安全认证机制的实现 Kafka 提供了多种安全认证机制来保护数据传输的安全性,包括加密、身份认证和授权。这些机制确保 了 Kafka 集群的通信安全和数据访问控制。以下是 Kafka 安全认证机制的实现和配置指南。 1. 安全认证机制概述 Kafka 支持以下几种主要的安全机…

vscode 删除不用的ssh远程连接

使用vscode连接一个远程服务器发现联不通&#xff0c;但是使用mobaxterm是可以通的&#xff0c;最后原因发现是这个服务器ip与之前连过的另一台相同&#xff0c;和之前连接保存的信息冲突了 解决办法&#xff1a; 使用记事本打开这个路径下的known_hosts(最好备份一下)&#x…

坦克大战游戏开发

目录 需求分析实现过程导包坦克类子弹类墙壁类爆炸类音效类游戏主窗口类 收获 需求分析 首先要有一个主窗口&#xff0c;游戏中所有的图形都在这里面渲染要有一个坦克类&#xff0c;有两个子类&#xff1a;我方坦克类、敌方坦克类坦克发射子弹&#xff0c;需要有一个子弹类游戏…

电脑打印文件怎么操作?

有打印机用户的打印操作 对于已经拥有打印机的用户来说&#xff0c;打印文件通常是一个简单的步骤。首先&#xff0c;你需要将你的文件&#xff08;如Word、PDF、PPT等&#xff09;在电脑上打开。然后&#xff0c;点击菜单栏中的“打印”选项&#xff0c;或者快捷键CtrlP&…