当前位置: 首页 > news >正文

如何使用 pg_rman 进行 PostgreSQL 的备份与恢复

概述

PostgreSQL 是一种非常流行的开源关系型数据库管理系统,广泛应用于众多生产环境中。为了确保生产环境始终正常运行,您需要使用多种工具,其中备份与恢复工具是必不可少的。本篇博客将介绍一种专为 PostgreSQL 设计的备份与恢复工具,即 pg_rman。

什么是 pg_rman

pg_rman 是一个免费的实用程序,专为 PostgreSQL 数据库的备份与恢复设计。它可以对整个数据库集群进行物理在线备份,归档 WAL 日志和服务器日志,并在 PostgreSQL 离线时恢复特定备份。pg_rman 不仅支持主 PostgreSQL 服务器的备份,还可以从备服务器进行备份。如果您想了解更多关于 pg_rman 的信息,可以访问 https://github.com/ossc-db/pg_rman.git。

如何设置

根据您运行的 PostgreSQL 版本,本篇博客将使用 pg_rman 1.3.14,演示在 PostgreSQL 14 上的备份与恢复。

现在,假设您已正确安装 PostgreSQL 14,可以按照以下步骤设置 PostgreSQL 服务器。

mkdir pgdata_rman
initdb  -D pgdata_rmanecho "archive_mode = on" >> pgdata_rman/postgresql.conf
echo "archive_command = 'cp %p /media/david/disk1/archive/%f'" >> pgdata_rman/postgresql.conf
echo "log_directory = '/media/david/disk1/pglog'" >> pgdata_rman/postgresql.conf
pg_ctl -D pgdata_rman -l pglog/logfile start

然后,我们可以从 GitHub 检出源代码并进行编译。

git clone https://github.com/ossc-db/pg_rman.git
git checkout V1.3.14 -b local
make clean && make && make install

如果没有错误,那么您已准备好使用 pg_rman 进行后续测试。

备份与恢复

在运行任何备份与恢复测试之前,我们需要初始化 pg_rman 的备份,以正确设置备份文件夹。

# 初始化备份
pg_rman init -B /media/david/disk1/backup_rman -D /media/david/disk1/pgdata_rman 

备份文件夹初始化完成后,我们可以尝试创建几个表并插入一些数据,如下所示。

psql -d postgres -c "CREATE TABLE abc (ID INT);"
psql -d postgres -c "CREATE TABLE xyz (ID INT);"
psql -d postgres -c "INSERT INTO abc VALUES (1);"
psql -d postgres -c "INSERT INTO xyz VALUES (1);"
psql -d postgres -c "SELECT count(*) from abc;"
psql -d postgres -c "SELECT count(*) from xyz;"

现在,我们可以使用以下命令运行第一次备份:

# 进行备份
pg_rman backup --backup-mode=full --with-serverlog -B /media/david/disk1/backup_rman -D /media/david/disk1/pgdata_rman -A /media/david/disk1/archive -S /media/david/disk1/pglog -p 5432 -d postgres

在这里,我们进行了一次完整的备份,包含所有内容以及本次完整备份的基本信息。pg_rman 会在每次备份完成后要求您验证备份。因此,要验证备份,我们可以简单运行以下命令:

# 验证
pg_rman validate -B /media/david/disk1/backup_rman

如果备份有效,那么我们可以插入更多数据并运行另一次备份。您可以按照以下步骤操作:

psql -d postgres -c "INSERT INTO abc VALUES (2);"
psql -d postgres -c "INSERT INTO xyz VALUES (2);"
psql -d postgres -c "SELECT count(*) from abc;"
psql -d postgres -c "SELECT count(*) from xyz;"pg_rman backup --backup-mode=full --with-serverlog -B /media/david/disk1/backup_rman -D /media/david/disk1/pgdata_rman -A /media/david/disk1/archive -S /media/david/disk1/pglog -p 5432 -d postgres # 验证
pg_rman validate -B /media/david/disk1/backup_rman#### 插入更多数据
psql -d postgres -c "INSERT INTO abc VALUES (3);"
psql -d postgres -c "INSERT INTO xyz VALUES (3);"$ pg_rman show -B /media/david/disk1/backup_rman
=====================================================================StartTime           EndTime              Mode    Size   TLI  Status 
=====================================================================
2022-05-27 13:05:30  2022-05-27 13:05:32  FULL    51MB     1  OK
2022-05-27 13:05:28  2022-05-27 13:05:30  FULL    51MB     1  OK

现在,我们有两个完整备份:第一个备份中每个表有一条记录,第二个备份中每个表有两条记录,而在第二个备份后,我们又向每个表插入了第三条记录。如果您现在查询这两个表,可以看到以下结果:

$ psql -d postgres -c "SELECT count(*) from abc;"count 
-------3
(1 row)$ psql -d postgres -c "SELECT count(*) from xyz;"count 
-------3
(1 row)

假设我们在第三次操作中犯了错误,让我们停止 PostgreSQL 服务器并尝试恢复到第二个备份阶段。

# 停止
pg_ctl -D pgdata_rman -l pglog/logfile stop# 恢复到目标时间
pg_rman restore -B /media/david/disk1/backup_rman -D /media/david/disk1/pgdata_rman --recovery-target-time="2022-05-27 13:05:32"# 重新启动
pg_ctl -D pgdata_rman -l pglog/logfile start
$ psql -d postgres -c "SELECT count(*) from abc;"count 
-------2
(1 row)$ psql -d postgres -c "SELECT count(*) from xyz;"count 
-------2
(1 row)

如您所见,我们回到了第二个备份阶段,每个表只有两条记录。

有什么缺憾

pg_rman 是一个为 PostgreSQL 用户提供的出色免费开源工具,用于备份和恢复数据库。然而,目前它缺少一个功能,即针对特定表的恢复。作为数据库管理员,针对特定表的恢复功能可以在生产环境中降低风险,尤其是在只需要恢复单个表的情况下,这是一个明确的操作需求。

总结

在本篇博客中,我们讨论了使用免费开源工具 pg_rman 进行 PostgreSQL 备份与恢复的基础知识,希望这些信息能帮助您寻找 PostgreSQL 的免费备份与恢复解决方案。

http://www.dtcms.com/a/321391.html

相关文章:

  • 解决 vscode 编辑 markdown 文件时退格键/backspace 删除卡顿问题
  • 【普中STM32精灵开发攻略】--第 14 章 动态数码管实验
  • PyQt 中 pyqtSignal 的使用
  • Orangepi5-RK3588安装ffmpeg硬编码版本
  • UE4/UE5 Android 超大(视频)文件打包/防拷贝方案
  • 【07】OpenCV C++实战篇——鼠标在图片上绘制矩形,计算矩形区域内灰度值的累加值显示在图片上,支持连续多次框选,快速计算结果,快速刷新画面不卡顿
  • Atto Round 1 (Codeforces Round 1041, Div. 1 + Div. 2) A-C
  • 【身心健康】能量管理——为你的情绪和身体注入积极力量
  • LVS高可靠
  • [激光原理与应用-184]:光学器件 - 光学器件中晶体的用途、分类、特性及示例
  • CSS--后端也有自己的CSS要学
  • 化工厂安全升级:分布式光纤传感的 “实时监测 + 精准预警” 方案
  • 【mongoose】E11000 duplicate key error collection: test.counters
  • [hot100]和为K的子数组-Python3
  • AI入门学习--RAG是什么?
  • TyDi QA:面向语言类型多样性的信息检索问答基准
  • Selenium + Python + Pytest + Yaml + POM
  • Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害数值模拟与预警中的应用(388)
  • 机器视觉的笔记本辅料贴合应用
  • camera人脸识别问题之二:【FFD】太阳逆光场景,人像模式后置打开美颜和滤镜,关闭heif拍摄格式对着人脸拍照,成像口红出现位置错误
  • 嵌入式系统GUI
  • 基于linux环境在centos7上部署gitlab
  • LLM驱动的数据分析组合(HoraeDB+Polars+Snorkel AI)
  • Transformer Encoder 与 Decoder:从结构到功能的深度解析
  • 【MATLAB技巧】打开脚本(m文件)后,中文乱码的解决方案
  • Spring Boot 核心原理
  • 【面向对象编程】从类到控件:面向对象思想的具象化演进
  • 进程关系与守护进程
  • 常见通信协议详解:TCP、UDP、HTTP/HTTPS、WebSocket 与 RPC
  • 全栈:如何判断自己应该下载哪个版本的Tomcat