流复备机断档处理

文章目录

  • 环境
  • 症状
  • 问题原因
  • 解决方案

环境

系统平台:UOS(海光),UOS (飞腾),UOS(鲲鹏),UOS(龙芯),UOS (申威),银河麒麟svs(X86_64),银河麒麟(飞腾)svs,银河麒麟(龙芯)svs,银河麒麟 (X86_64),银河麒麟 (飞腾),银河麒麟 (鲲鹏),银河麒麟 (海光),银河麒麟 (龙芯),中科方德 (海光),中科方德 (X86_64),中科方德(海光)SVS,中科方德(兆芯),普华Linux(龙芯),银河麒麟(龙芯)R系 V4,银河麒麟(飞腾)U系 V4,中标麒麟 (鲲鹏),中标麒麟 (x86-64) 6
版本:9.0,6.0,5.1,5.6.5,14,13,12,11,10.4,5.6.4,5.6.3,5.6.1,4.5.9,4.5.8,4.5.7,4.5.6

症状

HGDB流复制环境,备库与主库数据不一致 数据库报错日志如下:

2024-05-28 14:17:18.707 CST,,,7820,,665576ee.1e8c,1,,2024-05-28 14:17:18 CST,,0,日志,00000,"在时间点: 0/BA000000 (时间安排6)启动日志的流操作",,,,,,,,,""
2024-05-28 14:17:18.707 CST,,,7820,,665576ee.1e8c,2,,2024-05-28 14:17:18 CST,,0,致命错误,XX000,"无法从WAL流中获得数据: 错误:  所要求的WAL段0000000600000000000000BA已经被删除",,,,,,,,

问题原因

数据库备节点所需wal日志已被删除,导致备节点接收不到相应日志,流复制断连

解决方案

流复制集群出现主备数据库因断档导致数据不同步的问题,均可使用以下第一种方式解决,此解决方法若是数据量较大的情况下要选择在夜间业务不繁忙时重做备库,因为重做过程可能会对资源占用较大,对数据库运行有一定影响。第二种方法适用于备库所需wal日志已被删除,但归档还在的情况,优先使用此种方式解决,两种方案的具体解决步骤如下所示:

一、主节点没有归档的情况

主备断档时间较久,备库需要的wal日志,或者归档日志已经被删除;

此情况只能选择使用pg_basebackup重做备库,示例步骤如下:

示例环境

IP数据目录
主节点x.x.2.49/data/highgo/data
备节点x.x.2.50/data/highgo/data
  1. 停掉备节点数据库
[root@HGDB-458 highgo]# pg_ctl stop
  1. 重命名备节点data目录
[root@HGDB-458 highgo]# mv /data/highgo/data /data/highgo/databak
  1. 备节点使用pg_basebackup重新同步数据目录
[root@HGDB-458 highgo]# pg_basebackup -h x.x.2.49 -p 5866 -U sysdba -D /data/highgo/data -Fp -P -Xs -R -v 
  1. 创建复制槽
    创建复制槽可以确保主从数据库之间的数据一致性。主数据库产生的 WAL 日志在从数据库处理之前不会被删除,但若出现备节点异常宕机或断档情况会导使主节点wal日志累积严重会导致磁盘爆满,需要权衡其优缺点,并根据具体情况来选择是否使用,具体配置步骤如下:

主节点:

[root@HGDB-458 highgo]# psql highgo sysdba
highgo=# select * from pg_create_physical_replication_slot('node_1');
highgo=# select * from pg_replication_slots;          # 检查是否创建成功

备节点:

修改postgresql.auto.conf配置文件,添加复制槽相关配置:

vim /data/highgo/data/postgresql.auto.conf
## 添加以下参数值
primary_slot_name = 'node_1'
  1. 启动备节点数据库,检查流复制状态
[root@HGDB-458 highgo]# pg_ctl start
[root@HGDB-458 highgo]# psql -d highgo -U sysdba
highgo=# select * from pg_stat_replication ;pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   |  sent_lsn  | write_lsn  | fl
ush_lsn  | replay_lsn |    write_lag    |    flush_lag    |   replay_lag    | sync_priority | sync_state |          reply_time           
------+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+--------------+-----------+------------+------------+---
---------+------------+-----------------+-----------------+-----------------+---------------+------------+-------------------------------1651 |     9999 | sysdba  | walreceiver      | x.x.2.50 |                 |       58026 | 2024-05-28 11:08:15.038853+08 |              | streaming | 0/B9000000 | 0/B9000000 | 0/
B9000000 | 0/B9000000 | 00:00:00.101506 | 00:00:00.101506 | 00:00:00.101506 |             0 | async      | 2024-05-28 11:08:14.512443+08
(1 行记录)

二、主节点有归档的情况

主备流复制断档,由于未配置复制槽,wal已被删除,查询数据库日志,某wal日志文件已被删除,但在主节点归档目录中查询到此wal日志文件

此情况可通过拷贝归档日志到备节点恢复流复制

具体示例步骤如下:

示例环境:

IP数据目录归档目录
主节点x.x.2.49/data/highgo/data/data/highgo/hgdbbak/archive
备节点x.x.2.50/data/highgo/data/data/highgo/hgdbbak/archive

1、通过数据库日志查询备节点所需wal日志# 相关文档

vim  /data/highgo/data/hgdb_log/highgodb_28.csv
## 相关日志如下所示
2024-05-28 14:17:18.707 CST,,,7820,,665576ee.1e8c,1,,2024-05-28 14:17:18 CST,,0,日志,00000,"在时间点: 0/BA000000 (时间安排6)启动日志的流操作",,,,,,,,,""
2024-05-28 14:17:18.707 CST,,,7820,,665576ee.1e8c,2,,2024-05-28 14:17:18 CST,,0,致命错误,XX000,"无法从WAL流中获得数据: 错误:  所要求的WAL段0000000600000000000000BA已经被删除",,,,,,,,

2、在主节点归档目录中找到查询出的wal日志

[root@HGDB-458 pg_wal]# cd /data/highgo/hgdbbak/archive
[root@HGDB-458 pg_wal]# ls -l 0000000600000000000000BA
-rw------- 1 root root 16777216 5月  28 13:30 0000000600000000000000BA

3、将此归档日志及之后的所有归档打包并拷贝到备节点中

[root@HGDB-458 archive]# cd /data/highgo/hgdbbak/archive
[root@HGDB-458 archive]# find . -type f -newermt '2024-05-28 13:30' -exec tar -zcvf hgdb_archive_bak0528.tar.gz {} +
# 将当前目录下修改时间在 '2024-05-28 13:30' 及之后的所有文件打包为hgdb_archive_bak0528.tar.gz
[root@HGDB-458 archive]# scp hgdb_archive_bak0528.tar.gz root@x.x.2.50:/data/highgo/
# 拷贝到备节点/data/highgo/目录下,也可以用其他方式

4、恢复wal日志(备节点操作)
解压归档日志到数据目录pg_wal文件夹下

[root@HGDB-458 archive]# tar -zxvf hgdb_archive_bak0528.tar.gz -C /data/highgo/data/pg_wal/

5、检查流复制是否恢复
主节点执行

[root@HGDB-458 opt]# psql highgo sysdba
highgo=# select * from pg_stat_replication ;pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   |  sent_lsn  | write_lsn  | flush_ls
n  | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state |          reply_time           
------+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+--------------+-----------+------------+------------+---------
---+------------+-----------+-----------+------------+---------------+------------+-------------------------------3716 |     9999 | sysdba  | walreceiver      | x.x.2.50 |                 |       58918 | 2024-05-28 14:17:24.354824+08 |              | streaming | 0/C3000000 | 0/C3000000 | 0/C30000
00 | 0/C3000000 |           |           |            |             0 | async      | 2024-05-29 05:22:51.494491+08
(1 行记录)
# 流复制已恢复正常

6、配置复制槽功能
创建复制槽可以确保主从数据库之间的数据一致性。主数据库产生的 WAL 日志在从数据库处理之前不会被删除,但若出现备节点异常宕机或断档情况会导使主节点wal日志累积严重会导致磁盘爆满,需要权衡其优缺点,并根据具体情况来选择是否使用,具体配置步骤如下:

主节点:

[root@HGDB-458 highgo]# psql highgo sysdba
highgo=# select * from pg_create_physical_replication_slot('node_1');
highgo=# select * from pg_replication_slots;          # 检查是否创建成功

备节点:

修改postgresql.auto.conf配置文件,添加复制槽相关配置:

vim /data/highgo/data/postgresql.auto.conf
## 添加以下参数值
primary_slot_name = 'node_1'

配置完成后重启备节点数据库使修改生效

[root@HGDB-458 highgo]# pg_ctl restart

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

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

相关文章

【蓝桥杯真题精讲】第 16 届 Python A 组(省赛)

文章目录 T1 偏蓝 (5/5)T2 IPv6 (0/5)T3 2025 图形 (10/10)T4 最大数字 (10/10)T5 倒水 (15/15)T6 拼好数 (0/15)T7 登山 (20/20)T8 原料采购 (20/20) 更好的阅读体验 高速访问:https://wiki.dwj601.cn/ds-and-algo/lan-qiao-cup/16th-python-a/永久链接&#xff1…

SpringBoot+Dubbo+Zookeeper实现分布式系统步骤

SpringBootDubboZookeeper实现分布式系统 一、分布式系统通俗解释二、环境准备(详细版)1. 软件版本2. 安装Zookeeper(单机模式) 三、完整项目结构(带详细注释)四、手把手代码实现步骤1:创建父工…

Spring的业务层,持久层,控制层的关系

在 Spring 框架中,控制层(Controller)、业务层(Service) 和 持久层(Repository/Mapper) 是分层架构的核心组成部分,职责分离明确,通过依赖注入(DI&#xff09…

css实现不确定内容的高度过渡

实现效果&#xff1a;鼠标悬浮按钮&#xff0c;高度过渡出现如图所示文本框 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

计算机视觉与深度学习 | matlab实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据)

以下是一个基于MATLAB的ARIMA-WOA-CNN-LSTM时间序列预测框架。由于完整代码较长,此处提供核心模块和实现思路,完整源码和数据可通过文末方式获取。 1. 数据准备(示例数据) 使用MATLAB内置的航空乘客数据集: % 加载数据 data = readtable(airline-passengers.csv); data …

在 Excel 中使用东方仙盟软件————仙盟创梦IDE

安装插件 用仙盟创梦编写插件代码 源码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 东方仙盟.仙盟创梦IDE_招标系统 {public static class 仙盟创梦_招标专…

Sql刷题日志(day9)

一、笔试 1、limit offset&#xff1a;分页查询 SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET start_row; --跳过前 start_row 行&#xff0c;返回接下来的 number_of_rows 行。 2、lag、lead&#xff1a;查询前后行数据 --lag函数用于访问当…

C++面试3——const关键字的核心概念、典型场景和易错陷阱

const关键字的核心概念、典型场景和易错陷阱 一、const本质&#xff1a;类型系统的守护者 1. 与#define的本质差异 维度#defineconst编译阶段预处理替换编译器类型检查作用域无作用域&#xff08;全局污染&#xff09;遵循块作用域调试可见性符号消失保留符号信息类型安全无类…

16-看门狗和RTC

一、独立看门狗 1、独立看门狗概述 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff08;不按照正常程序进行运行&#xff0c;如程序重启&#xff0c;但是如果我们填加看门狗的技术&#xff0…

w~自动驾驶~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦&#xff01; 在自动驾驶系统当中&#xff0c;感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&…

怎么打包发布到npm?——从零到一的详细指南

怎么打包发布到npm&#xff1f;——从零到一的详细指南 目录 怎么打包发布到npm&#xff1f;——从零到一的详细指南一、准备工作1. 注册 npm 账号2. 安装 Node.js 和 npm 二、初始化项目三、编写你的代码四、配置 package.json五、打包你的项目六、登录 npm七、发布到 npm八、…

【C++ - 仿mudou库one thread one loop式高并发服务器实现】

文章目录 项目介绍项目模块和服务器主要设计模式项目主要流程前置知识1.bind函数2.定时器任务TimerTask和时间轮思想TimerWheel3.正则表达式4.通用型容器Any类 服务器设计模式1&#xff09;单Reactor单线程模式2&#xff09;单Reactor多线程模式3&#xff09;多Reactor多线程模…

RISC-V 开发板 MUSE Pi Pro USB 测试(3.0 U盘,2.0 UVC摄像头)

视频讲解&#xff1a; RISC-V 开发板 MUSE Pi Pro USB 测试&#xff08;3.0 U盘&#xff0c;2.0 UVC摄像头&#xff09; 总共开发板有4个USB的A口&#xff0c;1个USB的TypeC口&#xff0c;我们插上两个USB3.0的U盘和一个USB2.0的UVC摄像头来进行测试 lsusb -tv 可以看到有3个US…

docker学习与使用(概念、镜像、容器、数据卷、dockerfile等)

文章目录 前言引入docker 简介docker的应用场景docker的虚拟化技术VS虚拟机docker的优点docker架构Docker仓库Docker镜像linux操作系统的大致组成部分 Docker容器 docker安装与启动校验版本移除旧的版本安装依赖工具设置软件源安装docker验证 配置镜像加速器docker服务相关命令…

记录一次服务器卡顿

一、服务器卡顿现象 服务用了一段时间后&#xff0c;突然很卡&#xff0c;发现在服务器上新建excel也很卡&#xff0c;发现服务器中病毒了&#xff0c;然后重新安装了操作系统。重新安装服务环境时&#xff0c;发现同时安装pdf、tomcat时都很慢&#xff0c;只能一个安装好了&am…

基于 Reactor 的 Java 高性能异步编程:响应式流与背压详解

本文将围绕 Reactor 框架&#xff0c;深入剖析响应式流的核心机制&#xff0c;重点讲解背压&#xff08;Backpressure&#xff09;的实现原理与实际应用。通过理论结合实践&#xff0c;希望帮助你真正掌握 Java 世界的响应式异步编程。 一、响应式编程与 Reactor 简介 1.1 什么…

知识蒸馏实战:用PyTorch和预训练模型提升小模型性能

在深度学习的浪潮中&#xff0c;我们常常追求更大、更深、更复杂的模型以达到最先进的性能。然而&#xff0c;这些“庞然大物”般的模型往往伴随着高昂的计算成本和缓慢的推理速度&#xff0c;使得它们难以部署在资源受限的环境中&#xff0c;如移动设备或边缘计算平台。知识蒸…

python:mysql全局大览(保姆级教程)

本文目录&#xff1a; 一、关于数据库**二、sql语言分类**三、数据库增删改查操作**四、库中表增删改查操作**五、表中记录插入**六、表约束**七、单表查询**八、多表查询**&#xff08;一&#xff09;外键约束**&#xff08;二&#xff09;连结查询**1.交叉连接&#xff08;笛…

Android framework 问题记录

一、休眠唤醒&#xff0c;很快熄屏 1.1 问题描述 机器休眠唤醒后&#xff0c;没有按照约定的熄屏timeout 进行熄屏&#xff0c;很快就熄屏&#xff08;约2s~3s左右&#xff09; 1.2 原因分析&#xff1a; 抓取相关log&#xff0c;打印休眠背光 相关调用栈 //具体打印调用栈…

怎么利用JS根据坐标判断构成单个多边形是否合法

怎么利用JS根据坐标判断构成单个多边形是否合法 引言 在GIS(地理信息系统)、游戏开发、计算机图形学等领域,判断一组坐标点能否构成合法的简单多边形(Simple Polygon)是一个常见需求。合法多边形需要满足几何学上的基本规则,本文将详细介绍如何使用JavaScript实现这一判…