pg_rman 的编译和使用

news2024/11/25 4:53:43

一、编译

下载地址:

ossc-db/pg_rman: Backup and restore management tool for PostgreSQL (github.com)icon-default.png?t=N7T8https://github.com/ossc-db/pg_rman代码由日本电信的运维团队维护。

针对不同的PostgreSQL版本,使用不同的分支编译,我的PG版本试12.6,对应的分支为REL_12_STABLE。

pg_rman的编译要依赖PG的源码,或者是包含PG头文件和库文件的PG安装包,我之前从源码编译安装了PG,所以只要设置了PATH和LD_LIBRARY_PATH就行,本质上,编译pg_rman时,是使用了PG安装文件中的pg_config,来设置头文件和库文件的编译选项。

git clone https://github.com/ossc-db/pg_rman.git

cd pg_rman

git co -b rel_12_stable origin/REL_12_STABLE

make

make install

# make install 将pg_rman安装到PostgreSQL安装目录的bin目录下

二、使用

1、初始化

如果是第一次用,要初始化,使用pg_rman有个前提,就是要求PG服务端要开启归档日志,即archive_mode要设为on或always, 同时设置archive_command,这是必须的。

对于Oracle DBA,大多数情况,pg_rman中的概念,可以对比Oracle的RMAN。

pg_rman init \

-B /mnt/disk01/debug-PostgreSQL/bkp-dir \

-D /mnt/disk01/debug-PostgreSQL/_pg_root \

-S /mnt/disk01/debug-PostgreSQL/log \

-A /mnt/disk01/debug-PostgreSQL/arcdir

INFO: ARCLOG_PATH is set to '/mnt/disk01/debug-PostgreSQL/arcdir'
INFO: SRVLOG_PATH is set to '/mnt/disk01/debug-PostgreSQL/log'

-B 是设置pg_rman的工作目录,要求绝对路径,存储的是pg_rman的元数据、备份的数据,对应的环境变量是 BACKUP_PATH。

-D 是PG数据目录,要求绝对路径,是PG初始化时创建的那个目录,对应的环境变量是 PGDATA。

-S 是PG的运行日志所在目录,即postgresql.conf中log_directory参数指向的路径,要求绝对路径,注意这个不是WAL目录或归档日志目录,对应的环境变量是 SRVLOG_PATH。

-A 是PG的归档日志所在目录,即postgresql.conf中archive_command中保存归档日志命令的目的路径,要求绝对路径,对应的环境变量是 ARCLOG_PATH。

这些参数最好设置环境变量,不然每个命令都要带着。

pg_rman和Oracle的RMAN不同的是,并不是执行pg_rman后进入一个命令行环境,而是pg_rman后面紧接着子命令,一个pg_rman + 子命令,完成一个任务。

pg_rman支持下面一些子命令:

2、 备份

假设已经设置了下面的环境变量

export BACKUP_PATH=/mnt/disk01/debug-PostgreSQL/bkp-dir
export SRVLOG_PATH=/mnt/disk01/debug-PostgreSQL/log
export ARCLOG_PATH=/mnt/disk01/debug-PostgreSQL/arcdir
export PGDATA=/mnt/disk01/debug-PostgreSQL/_pg_root

PG服务器已经启动,并且使用默认端口5432,pg_man和PG服务器在同一台机器上

pg_rman backup -b full

# 之后还要执行validate,这样这个备份才可用,才能用来恢复

pg_rman validate

# 增量备份

pg_rman backup -b incremental

pg_rman validate

# 查看备份

pg_rman show

[postgres@qinh154 debug-PostgreSQL]$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2023-10-07 17:14:18  2023-10-07 17:14:20  INCR    33MB     1  OK
2023-10-07 17:06:46  2023-10-07 17:06:49  FULL    84MB     1  OK

# 备份归档日志也很有用,缺点是太占空间

pg_rman backup -b archive

pg_rman validate

pg_rman show

=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2023-10-07 17:17:01  2023-10-07 17:17:02  ARCH    16MB     1  OK
2023-10-07 17:14:18  2023-10-07 17:14:20  INCR    33MB     1  OK
2023-10-07 17:06:46  2023-10-07 17:06:49  FULL    84MB     1  OK

pg_rman的备份以时间作为id,所以选择备份用来恢复时,通过选择StartTime或EndTime,删除备份也是如此。

3、恢复

 恢复需要先停PG服务器,假设已经设置了下面的环境变量:

export BACKUP_PATH=/mnt/disk01/debug-PostgreSQL/bkp-dir
export SRVLOG_PATH=/mnt/disk01/debug-PostgreSQL/log
export ARCLOG_PATH=/mnt/disk01/debug-PostgreSQL/arcdir
export PGDATA=/mnt/disk01/debug-PostgreSQL/_pg_root

可以通过--recovery-target-time和--recovery-target-timeline指定恢复到时间点附近的备份:

pg_rman restore --recovery-target-time='2023-10-07 15:31:28' --recovery-target-timeline=2 

或直接 pg_rman restore 恢复到最新的备份。

注意,pg_rman的备份恢复时基于pg_basebackup的,因此备份其实是在做basebackup,而恢复时用备份的basebackup覆盖当前的数据目录,因此postgresql.conf都会恢复为备份时的设置。

恢复其实分两步:

第一步是PG服务器停机时restore,即用备份的数据目录覆盖当前的数据目录。

第二步是recovery,即利用PG自己的恢复机制,pg_rman在postgresql.conf里设置好恢复时间和时间线,创建recovery.signal :

restore_command = 'cp /mnt/disk01/debug-PostgreSQL/arcdir/%f %p'
recovery_target_time = '2023-10-07 17:14:18'
recovery_target_timeline = '1'

然后,启动PG服务器,PG服务器就按照配置自动恢复了,如果恢复完成,PG服务器会自动删除 recovery.signal,注意不要手动删除recovery.signal,有时候可能很长时间不能恢复完成,可以登录PG服务器执行select pg_is_in_recovery()查看状态,如果为t则仍然在恢复中,此时数据库是不可写的,此时查看日志应该提示登录PG服务器并且执行

select pg_wal_replay_resume();

还有,就是恢复完成后,要记得手动删除这三个参数!

这里有个细节要注意:在recovery时,postgresql.conf 中开启归档日志的参数archive_mode,最好是on,如果是always,那么在recovery时也会产生归档日志,这样会与归档日志目录下原有的归档日志,在文件名上有冲突,而用on,在recovery时就不会产生归档日志。

 

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

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

相关文章

【 构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!】

构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!!! 错误提示信息: Cannot download ZIP distribution from https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3…

Knife4j_接口概述、常用注解详解、搭建swagger项目、功能概述

文章目录 ①. knife4j的概述②. knife4j核心功能③. 从0开始搭建knife4j项目④. 常用注解 - Api④. ApiOperation注解⑤. ApiModelProperty注解⑥. ApiImplicitParam注解⑦. ApiImplicitParams注解⑧. 限制请求方式⑨. 导出离线API文档 ①. knife4j的概述 ①. knife4j是为Java …

C#上位机——根据命令发送

C#上位机——根据命令发送 第一步:设置窗口的布局 第二步:设置各个属性 第三步:编写各个模块之间的关系

【力扣】单调栈:901. 股票价格跨度

【力扣】单调栈:901. 股票价格跨度 文章目录 【力扣】单调栈:901. 股票价格跨度1. 题目介绍2. 思路3. 解题代码参考 1. 题目介绍 设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格…

文献综述|CV领域神经网络水印发展综述

前言:最近接触了「模型水印」这一研究领域,阅读几篇综述之后,大致了解了本领域的研究现状,本文就来总结一下该领域的一些基础知识,以飨读者。 ⚠️注:本文中出现的研究工作均基于计算机视觉任务开展&#x…

Git 学习笔记 | 安装 Git 及环境配置

Git 学习笔记 | 安装 Git 及环境配置 Git 学习笔记 | 安装 Git 及环境配置安装 Git配置 Git查看配置 Git 学习笔记 | 安装 Git 及环境配置 安装 Git 官方网站:https://git-scm.com/ 官网下载太慢,我们可以使用淘宝镜像下载:https://regist…

自学接口测试系列 —— 自动化测试用例设计基础!

一、接口测试思路总结 ❓首先我们在进行接口测试设计前思考一个问题:接口测试,测试的是什么? ❗我们必须要知道,接口测试的本质:是根据接口的参数,设计输入数据,验证接口的返回值。 那么接口…

Fast DDS之Transport

目录 transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。

Python——— 模块

(一)模块化(module)程序设计理念 模块和包概念的进化史 模块和包概念的进化史 ① Python程序由模块组成。一个模块对应 python 源文件,一般后缀名是: .py ② 模块由语句组成。运行Python 程序时,按照模块中语句的顺…

手把手教你编写LoadRunner脚本

编写 LoadRunner 脚本需要熟悉脚本语言、业务场景、参数化技术、断言和事务等基础知识。 在实际编写时,可以根据具体测试需求,结合实际情况进行合理的配置和调整。 基本步骤 创建脚本 在 LoadRunner 的 Controller 模块中,创建一个新的测试…

详解TCP三次握手(建立连接)和四次握手(释放连接)

TCP是是一个面向连接的协议,无论哪一方发送数据之前,都必须在双方之间建立一条连接。 一、建立连接 建立TCP连接时,要经历这样的流程: ① 请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始…

基于微信小程序的个人健康数据管理平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Unity可视化Shader工具ASE介绍——2、ASE的Shader创建和输入输出

大家好,我是阿赵,这里继续介绍Unity可视化写Shader的ASE插件的用法。上一篇介绍了ASE的安装和编辑器界面分布,这一篇主要是通过一个简单的例子介绍shader的创建和输入输出。 一、ASE的Shader创建 这里先选择Surface类型的Shader,…

Git 学习笔记 | 版本控制和版本控制工具

Git 学习笔记 | 版本控制和版本控制工具 Git 学习笔记 | 版本控制和版本控制工具什么是版本控制?版本管理工具的特性版本管理工具的发展简史主流的版本控制器本地版本控制集中版本控制分布式版本控制 Git与SVN的主要区别 Git 学习笔记 | 版本控制和版本控制工具 学…

孕期能吃韭黄吗?坐月子和哺乳期能吃韭黄吗?宝宝能不能吃韭黄?

韭黄又称韭芽、黄韭、韭菜白。韭菜隔绝光线,完全在黑暗中生长,因无阳光供给,不能进行光合作用,合成叶绿素,就会变成黄色,称之为「韭黄」。 孕期能吃吗? 能吃 韭黄味道独特,富含膳…

[Python入门教程]01 Python开发环境搭建

Python开发环境搭建 本文介绍python开发环境的安装,使用anaconda做环境管理,VS code写代码。搭建开发环境是学习的第一步,本文将详细介绍anaconda和vs code的安装过程,并测试安装结果。 视频教程链接:https://www.bil…

【ElasticSearch】深入了解 ElasticSearch:开源搜索引擎的力量

文章目录 前言一、初识 ElasticSearch 搜索引擎1.1 ElasticSearch 的核心概念1.2 ElasticSearch 的演进历程1.3 ElasticSearch 的优势与未来 二、正排索引与倒排索引:数据库与 ElasticSearch 的差异2.1 对正排索引的认识2.2 对倒排索引的认识2.3 正排索引 vs. 倒排索…

强迫症福音!一个小技巧,让DALLE-3创作排列美学

夕小瑶科技说 原创 编译 | 奶茶子 最近在Twitter上有一条备受欢迎的推文,其介绍了一个令人印象深刻的DALL-E应用。该推文中写道:“你可以使用DALL-E 3来制作一些令人惊叹的整齐排列风格的Knolling照片。”作者(chaseleantj)还分享了他所生成的Knolling…

【Golang】DFA算法过滤敏感词Golang实现

什么是DFA算法 DFA全称:Deterministic Finite Automaton,翻译过来就是确定性有限自动机,其特征是,有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态&…

java 常见api Arrays类

int类型数组 package daysreplace;import java.util.Arrays;public class Test {public static void main(String[] args) {int[] arrays{38,24,42,56,22,44};//直接输出数组名称就是内存地址System.out.println(arrays);//Arrays.toString()会将数组内容转成字符串形式System…