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

流复备机断档处理

文章目录

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

环境

系统平台: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.lryc.cn/news/2383292.html

相关文章:

  • Linux 安装 pytorch+cuda+gpu 大模型开发环境过程记录
  • 局部放大maya的视图HUD文字大小的方法
  • 数学复习笔记 16
  • 初识Linux · NAT 内网穿透 内网打洞 代理
  • STM32接收红外遥控器的遥控信号
  • Redis从入门到实战 - 高级篇(下)
  • NGINX常用功能—笔记
  • JVM 性能问题排查实战10连击
  • 【jvm第8集】jvm调优工具(图形化工具)
  • Python测试单例模式
  • 多技术栈 iOS 项目的性能调试实战:从 Flutter 到 Unity(含 KeyMob 工具实测)
  • STM32简易计算机设计
  • GUI实验
  • 量子计算 | 量子密码学的挑战和机遇
  • linux系统查看硬盘序列号
  • 分享一些多模态文档解析思路
  • CSS 选择器入门
  • 【Django】Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景)
  • AI知识梳理——RAG、Agent、ReAct、LangChain、LangGraph、MCP、Function Calling、JSON-RPC
  • Vue组件通信方式及最佳实践
  • 【实用教程】如何快速搭建一套私有的埋点系统?
  • 深入解析 Uniswap:自动做市商模型的数学推导与智能合约架构
  • spring配置并使用rabbitmq
  • Android开发——不同布局的定位属性 与 通用属性
  • React 19版本refs也支持清理函数了。
  • Python高效网络爬虫开发指南
  • Python爬虫实战:获取国家统计网最新消费数据并分析,为从业者做参考
  • Python中使用uv创建环境及原理详解
  • 阿尔泰科技助力电厂——520为爱发电!
  • 【Golang笔记02】函数、方法、泛型、接口学习笔记