openGauss 基于PITR的恢复

news2024/9/20 3:29:37

作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理
微信:jem_db
QQ交流群:587159446
公众号:IT邦德

文章目录

  • 前言
    • 1.PITR说明
    • 2.开归档
    • 3.PITR恢复要点
    • 4.全量物理备份
    • 5.准备测试数据(源库)
    • 6.还原点恢复
    • 7.XID恢复
    • 8.恢复至lsn
    • 10.总结

前言

国产数据库使用的过程中,基于PITR的恢复非常的重要,这里给大家分享openGauss 基于PITR的恢复

1.PITR说明

当数据库崩溃或希望回退到数据库之前的某一状态时,opengauss的即时恢复功能( Point-In-Time Recovery,简称PITR ),可以支持恢复到备份归档数据之后的任意时间点。
仅主节点可以进行PITR恢复,备机需要进行全量build达成与主机数据同步。

2.开归档

1.使用omm用户登录主库确认归档是否开启
查看当前归档日志相关参数,查看当前openGauss数据库管理系统的归档设置:

openGauss=# select name,setting from pg_settings 
where name like 'archive%' or name = 'wal_level';

       name       |   setting   
------------------+-------------
 archive_command  | (disabled)
 archive_dest     | 
 archive_interval | 1
 archive_mode     | off
 archive_timeout  | 0
 wal_level        | hot_standby
(6 rows)


说明:可以看出,数据库在非归档方式(参数archive_mode的值为off)。


vi $PGDATA/postgresql.conf

# 修改archive_mode的值需要重启动数据库
archive_mode=on
# 修改archive_command的值不需要重启动数据库,只需要reload
archive_command = 'cp %p /archivelog/%f'
# 修改archive_time:归档周期,900表示每900秒(15分钟)切换一次
archive_timeout = 900

用Linux用户omm,执行下面的命令,启动openGauss数据库:
gs_om -t restart

再次查看归档日志相关参数
执行下面的命令,查看当前openGauss数据库的归档设置:
[omm@centos79 ~]$ gsql -c 
"select name,setting from pg_settings where name like 'archive%' or name = 'wal_level'"

       name       |       setting        
------------------+----------------------
 archive_command  | cp %p /archivelog/%f
 archive_dest     | 
 archive_interval | 1
 archive_mode     | on
 archive_timeout  | 900
 wal_level        | hot_standby
(6 rows)

3.PITR恢复要点

PITR恢复流程:
1.将物理备份的文件替换目标数据库目录。
2.删除数据库目录下pg_xlog/中的所有文件。
3.将归档的WAL日志文件复制到pg_xlog文件中
4.在数据库目录下创建恢复命令文件recovery.conf,指定数据库恢复的程度。
5.启动数据库。
6.连接数据库,查看是否恢复到希望预期的状态。
7.若已经恢复到预期状态,通过pg_xlog_replay_resume()指令使主节点对外提供服务。


####  归档恢复配置  ####
## 该SHELL命令获取已归档的WAL文件。
restore_command = 'cp /gauss/bak/archive/%f %p'   
## 清理备库WAL归档日志的shell命令,每次重启时会执行
archive_cleanup_command = 'pg_archivecleanup /gauss/bak/archive %r' 

#### 恢复目标设置(四选一) ####
## 还原到一个使用pg_create_restore_point()创建的还原点
recovery_target_name = 'restore_point_1'  
## 还原到一个指定时间戳    
recovery_target_time = '2020-01-01 12:00:00'  
 ## 还原到一个事务ID
recovery_target_xid = '3000'       
 ## 还原到日志的指定LSN点          
recovery_target_lsn = '0/0FFFFFF'  
 ## 声明是否在指定恢复目标之后停止(true) 或 之前停止(false),不支持recovery_target_name 配置          
recovery_target_inclusive = true             
## 注意:如果不配置任何恢复目标 或 配置目标不存在,则默认恢复到最新的WAL日志点。

4.全量物理备份

#使用gs_basebackup全量备份
创建备份文件存储目录,gs_basebackup备份
数据库需要处于开启状态

[omm@centos79 ~]$ mkdir -p /home/omm/gs_bak
[omm@centos79 ~]$ gs_basebackup -D /home/omm/gs_bak -p 15400
INFO:  The starting position of the xlog copy of the full build is: 0/E000028. The slot minimum LSN is: 0/0. The disaster slot minimum LSN is: 0/0. The logical slot minimum LSN is: 0/0.
[2024-09-19 05:49:45]:begin build tablespace list
[2024-09-19 05:49:45]:finish build tablespace list
[2024-09-19 05:49:45]:begin get xlog by xlogstream
[2024-09-19 05:49:45]: check identify system success                                                
[2024-09-19 05:49:45]: send START_REPLICATION 0/E000000 success                                     
[2024-09-19 05:49:45]: keepalive message is received                                                
[2024-09-19 05:49:45]: keepalive message is received                                                
[2024-09-19 05:49:50]:gs_basebackup: base backup successfully

5.准备测试数据(源库)

1)记录操作的起始位置
--创建测试数据
openGauss=# \c testdb
testdb=# \dt
                          List of relations
 Schema |  Name   | Type  | Owner |             Storage              
--------+---------+-------+-------+----------------------------------
 public | test    | table | omm   | {orientation=row,compression=no}
 public | testbak | table | omm   | {orientation=row,compression=no}
(2 rows)
-- 创建一个还原点restore_point_1
testdb=# select pg_create_restore_point('restore_point_1');
 pg_create_restore_point 
-------------------------
0/F00B638
(1 row)

2)创建测试数据t1表(源库),切日志
drop table t1;
create table t1(name varchar(50));
insert into t1 values('This is restore_point_1');

testdb=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/F016398
(1 row)

testdb=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/10000A68
(1 row)

3)记录第一次数据插入后的数据库位置
testdb=# \x
Expanded display is on.
testdb=# select * from pg_get_variable_info();
-[ RECORD 1 ]------------+-----------
node_name                | dn_6001
next_oid                 | 16417
next_xid                 | 45588
oldest_xid               | 12666
xid_vac_limit            | 4000012666
oldest_xid_db            | 15649
last_extend_csn_logpage  | 63
start_extend_csn_logpage | 0
next_commit_seqno        | 3298
latest_completed_xid     | 45587
startup_max_xid          | 45154

-- 查看最近提交的XID(latestCompletedXid-->45587 || nextXid-->45588)

4)创建测试数据t2表(源库)
-- 创建表t2并插入数据
create table t2(name varchar(50));
insert into t2 values('This is insert into t2');

testdb=# select pg_current_xlog_location();
 pg_current_xlog_location 
--------------------------
 0/1100BE28
(1 row)

testdb=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/1100D060
(1 row)

testdb=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/12001368
(1 row)


5)记录第二次数据插入后的数据库位置
-- 查询当前LSN 数据库t1、t2
testdb=# select pg_current_xlog_location();
 pg_current_xlog_location 
--------------------------
 0/13002E60
(1 row)

6.还原点恢复

配置recovery.conf文件(基于还原点restore_point_1恢复)
#创建recovery.conf文件

cd /home/omm/data/db1/

cat> recovery.conf<<EOF
restore_command = 'cp /archivelog/%f %p'
archive_cleanup_command = 'pg_archivecleanup /archivelog  %r'
recovery_target_name = 'restore_point_1'   ## 恢复到指定的还原点restore_point_1,此时还没有创建表t1和t2 
recovery_target_inclusive = true
EOF

#由于在本机操作,关闭源数据库,避免port冲突
$ gs_om -t stop
#启动恢复目标数据库并查看数据,数据目录: /home/omm/data/db1
$ gs_ctl start -D  /home/omm/data/db1

-- 检查当前数据库是否处于恢复状态 
gsql -r -d testdb

openGauss=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 t
(1 row)


openGauss=# select pg_current_xlog_location();
ERROR:  recovery is in progress
HINT:  WAL control functions cannot be executed during recovery.
CONTEXT:  referenced column: pg_current_xlog_location
openGauss=# drop table t1;
ERROR:  cannot execute DROP TABLE in a read-only transaction

恢复说明:
表t1和t2都不存在,且处于恢复状态数据库无法使用函数查看LSN位置,该数据库只读

#查看日志中的恢复情况
cd /openGauss/log/omm/omm/pg_log/dn_6001

grep -C 3 "restore_point_1"  /openGauss/log/omm/omm/pg_log/dn_6001/postgresql-2024-09-19_060448.log

image.png

7.XID恢复

-- 修改recovery_target,继续往前恢复
cd /home/omm/data/db1/
mv recovery.done recovery.conf
vi recovery.conf

--------------------------
# 根据前面的信息得知,xid=19251这个事务完毕时,仅有t1表,没有t2表
# 我们这一阶段仅恢复t1表即可
# 修改:
recovery_target_xid = '45587'  
--------------------------


-- 重启恢复测试数据
gs_ctl restart -D /home/omm/data/db1/

-- 检查当前数据库是否处于恢复状态 
gsql -r -d testdb

openGauss=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 t
(1 row)

testdb=# \dt
                                    List of relations
 Schema |  Name   | Type  | Owner |                       Storage                        
--------+---------+-------+-------+------------------------------------------------------
 public | t1      | table | omm   | {orientation=row,compression=no,storage_type=USTORE}
 public | test    | table | omm   | {orientation=row,compression=no}
 public | testbak | table | omm   | {orientation=row,compression=no}
(3 rows)

testdb=# select * from t1;
          name           
-------------------------
 This is restore_point_1
(1 row)


恢复说明:此时数据仅恢复了表t1,并未恢复表t2,实验结果满足预期目标                      ^
-- 从日志中我们也可以看到,数据库恢复至xid=45587后

#查看日志中的恢复情况
cd /openGauss/log/omm/omm/pg_log/dn_6001
grep -C 3 "45587"  /openGauss/log/omm/omm/pg_log/dn_6001/postgresql-2024-09-19_061518.log

image.png

8.恢复至lsn

-- 修改recovery_target,继续往前恢复

cd /home/omm/data/db1/
mv recovery.done recovery.conf
vi recovery.conf


# 根据前面的信息得知,lsn='0/13002E60'这个LSN位置时,t1表和t2表已经创建完毕
# 修改:
recovery_target_lsn = '0/13002E60'

-- 重启恢复测试数据
gs_ctl restart -D /home/omm/data/db1/

-- 检查当前数据库是否处于恢复状态 
gsql -r -d testdb

openGauss=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 t
(1 row)

testdb=# \dt
                                    List of relations
 Schema |  Name   | Type  | Owner |                       Storage                        
--------+---------+-------+-------+------------------------------------------------------
 public | t1      | table | omm   | {orientation=row,compression=no,storage_type=USTORE}
 public | t2      | table | omm   | {orientation=row,compression=no,storage_type=USTORE}
 public | test    | table | omm   | {orientation=row,compression=no}
 public | testbak | table | omm   | {orientation=row,compression=no}
(4 rows)

testdb=# select * from t1;
          name           
-------------------------
 This is restore_point_1
(1 row)

testdb=# select * from t2;
          name          
------------------------
 This is insert into t2
(1 row)


-- 从日志中我们也可以看到,数据库恢复至LSN=0/13002E60后,
检测到Double-write日志后续内容为空(Empty),则认为数据库已恢复至最新状态,此时恢复任务结束(Finish)


#查看日志中的恢复情况
cd /openGauss/log/omm/omm/pg_log/dn_6001
grep -A 5 "0/13002E60"  /openGauss/log/omm/omm/pg_log/dn_6001/postgresql-2024-09-19_062157.log

image.png

9.结束PITR


当未将数据库恢复至最新时刻状态时,此时需要手动结束PITR恢复任务。

-- 查询数据库恢复状态
testdb=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 t
(1 row)
 
-- 结束恢复,使机器对外提供读写服务
testdb=# select pg_xlog_replay_resume();
 pg_xlog_replay_resume
-----------------------

-- 查询数据库恢复状态(已结束)
testdb=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 f
(1 row)

--可以看到目前数据库可以读写了
testdb=# drop table testbak;
DROP TABLE

10.总结

%f即归档检索中的文件名,%p即复制目的地的路径名,%r最新可用重启点的文件名
如果多个备机从相同的归档路径恢复时,需要确保该路径存在所有备机恢复所需要的WAL文件。
整个恢复的过程为了方式端口被占用,请关闭原库

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

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

相关文章

聚焦汽车智能化与电动化,亚洲领先的汽车工业技术博览会 2025年11月与您相约 AUTO TECH 华南展

抢占市场先机︱聚焦汽车智能化与电动化&#xff0c;亚洲领先的汽车工业技术博览会 2025年11月与您相约 AUTO TECH 华南展 随着汽车智能化与电动化的迅猛发展&#xff0c;汽车电子技术、车用功率半导体技术、智能座舱技术、轻量化技术/材料、软件定义汽车、EV/HV技术、测试测量技…

python之openpyxl模块——实现Excel表格的处理(万字教学,全网最全,超详细!)

文章目录 前言1、Excel表格介绍扩展&#xff1a;.xls 和 .xlsx 2、openpyxl 模块2.1 模块的安装2.2 基础操作2.2.1 生成Excel文件对象&#xff0c;查看所有sheet表2.2.2 通过表名得到表对象2.2.3 获取活动表对象2.2.4 获取表格中数据所占大小2.2.5 获取单元格中的数据2.2.6 获取…

flask搭建微服务器并训练CNN水果识别模型应用于网页

一. 搭建flask环境 概念 flask:一个轻量级 Web 应用框架&#xff0c;被设计为简单、灵活&#xff0c;能够快速启动一个 Web 项目。CNN:深度学习模型&#xff0c;用于处理具有网格状拓扑结构的数据&#xff0c;如图像&#xff08;2D网格&#xff09;和视频&#xff08;3D网格&a…

集成学习详细介绍

以下内容整理于&#xff1a; 斯图尔特.罗素, 人工智能.现代方法 第四版(张博雅等译)机器学习_温州大学_中国大学MOOC(慕课)XGBoost原理介绍------个人理解版_xgboost原理介绍 个人理解-CSDN博客 集成学习(ensemble)&#xff1a;选择一个由一系列假设h1, h2, …, hn构成的集合…

LLM大模型基础知识学习总结,零基础入门到精通 非常详细收藏我这一篇就够了

在这个已经被大模型包围的时代&#xff0c;不了解一点大模型的基础知识和相关概念&#xff0c;可能出去聊天都接不上话。刚好近期我也一直在用ChatGPT和GitHub Copilot&#xff0c;也刚好对这些基础知识很感兴趣&#xff0c;于是看了一些科普类视频和报告&#xff0c;做了如下的…

从数据到决策,无限住宅代理还可以这么用

在企业发展中&#xff0c;一个良好的决策可以起到推波助澜的作用&#xff0c;让企业飞速发展。在决策的背后离不开数据的支撑&#xff0c;数据驱动决策已成为企业成功的关键因素。然而&#xff0c;随着数据量的激增和竞争的加剧&#xff0c;企业如何有效地收集、分析和应用数据…

Python 课程14-TensorFlow

前言 TensorFlow 是由 Google 开发的一个开源深度学习框架&#xff0c;广泛应用于机器学习和人工智能领域。它具有强大的计算能力&#xff0c;能够运行在 CPU、GPU 甚至 TPU 上&#xff0c;适用于从小型模型到大规模生产系统的各种应用场景。通过 TensorFlow&#xff0c;你可以…

【云原生监控】Prometheus之Alertmanager报警

Prometheus之Alertmanager报警 文章目录 Prometheus之Alertmanager报警概述资源列表基础环境一、部署Prometheus服务1.1、解压1.2、配置systemctl启动1.3、监控端口 二、部署Node-Exporter2.1、解压2.2、配置systemctl启动2.3、监听端口 三、配置Prometheus收集Exporter采集的数…

旧衣回收小程序:开启旧衣回收新体验

随着社会的大众对环保的关注度越来越高&#xff0c;旧衣物回收市场迎来了快速发展时期。在数字化发展当下&#xff0c;旧衣回收行业也迎来了新的模式----互联网旧衣回收小程序&#xff0c;旨在为大众提供更加便捷、简单、透明的旧衣物回收方式&#xff0c;通过手机直接下单&…

关于1688跨境官方接口的接入||跨境卖家必知的1688跨境要点

1688跨境是什么&#xff1f; 1688是国内领先的货源平台&#xff0c;每年服务超过6500万B类买家&#xff0c;其中很大一部分是跨境商家。这些跨境商家采购中国高性价比的商品到海外销售。 为什么要入驻跨境专供&#xff1f; 据统计&#xff0c;2028年跨境市场规模将实现翻三番&…

RabbitMQ(高阶使用)延时任务

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 1. 什么是延时任务&#xff1f; 1.1 和定时任务区别 2. 延时队列使用场景 3. 常见方案 3.1 数据库轮询 优点 缺点 3.2 JDK的延迟队列 优点 缺点 3.3 netty时间轮算法 优点 缺点 3.4 使用消息…

HTML5好看的水果蔬菜在线商城网站源码系列模板2

文章目录 1.设计来源1.1 主界面1.2 商品列表界面1.3 商品详情界面1.4 其他界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/142059220 HTML5好看的水果蔬菜在线商城…

MATLAB系列06:复数数据、字符数据和附加画图类

MATLAB系列06&#xff1a;复数数据、字符数据和附加画图类 6. 复数数据、字符数据和附加画图类6.1 复数数据6.1.1 复变量&#xff08; complex variables&#xff09;6.1.2 带有关系运算符的复数的应用6.1.3 复函数&#xff08; complex function&#xff09;6.1.4 复数数据的作…

通信工程学习:什么是ONU光网络单元

ONU&#xff1a;光网络单元 ONU&#xff08;Optical Network Unit&#xff0c;光网络单元&#xff09;是光纤接入网中的用户侧设备&#xff0c;它位于光分配网络&#xff08;ODN&#xff09;与用户设备之间&#xff0c;是光纤通信系统的关键组成部分。以下是关于ONU光网络单元的…

Web后端开发技术:RESTful 架构详解

RESTful 是一种基于 REST&#xff08;表述性状态转移&#xff0c;Representational State Transfer&#xff09;架构风格的 API 设计方式&#xff0c;通常用于构建分布式系统&#xff0c;特别是在 Web 应用开发中广泛应用。REST 是一种轻量级的架构模式&#xff0c;利用标准的 …

构建响应式API:FastAPI Webhooks如何改变你的应用程序

FastAPI&#xff0c;作为一个现代、快速&#xff08;高性能&#xff09;的Web框架&#xff0c;为Python开发者提供了构建API的卓越工具。特别是&#xff0c;它的app.webhooks.post装饰器为处理实时Webhooks提供了一种简洁而强大的方法。在本文中&#xff0c;我们将探讨如何使用…

Git使用教程-将idea本地文件配置到gitte上的保姆级别步骤

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

剖析Spark Shuffle原理(图文详解)

Spark Shuffle 1.逻辑层面 从逻辑层面来看&#xff0c;Shuffle 是指数据从一个节点重新分布到其他节点的过程&#xff0c;主要发生在需要重新组织数据以完成某些操作时。 RDD血统 Shuffle 触发条件&#xff1a; reduceByKey、groupByKey、join 等操作需要对数据进行分组…

制作OpenLinkSaas发行版

发行版配置 作为软件研发效能一站式解决方案&#xff0c;OpenLinkSaas提供了众多的功能。再不同的场景中&#xff0c;所需要的软件功能是有差异的。OpenLinkSaas提供了发行版配置功能&#xff0c;以便在不同场景下组合所有的功能。 修改代码下面的src-tauri/src/vendor_cfg.rs…

软考高级:嵌入式-嵌入式实时操作系统调度算法 AI 解读

讲解 嵌入式实时操作系统中的调度算法主要用于管理任务的执行顺序&#xff0c;以确保任务能够在规定时间内完成。针对你提到的几种调度算法&#xff0c;我会逐一进行通俗解释。 生活化例子 假设你在家里举办一个家庭聚会&#xff0c;家里人轮流使用一个游戏机玩游戏。你作为…