流复备机断档处理

文章目录

环境

系统平台: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流复制环境,备库与主库数据不一致 数据库报错日志如下:

xml 复制代码
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. 停掉备节点数据库
sql 复制代码
[root@HGDB-458 highgo]# pg_ctl stop
  1. 重命名备节点data目录
sql 复制代码
[root@HGDB-458 highgo]# mv /data/highgo/data /data/highgo/databak
  1. 备节点使用pg_basebackup重新同步数据目录
sql 复制代码
[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日志累积严重会导致磁盘爆满,需要权衡其优缺点,并根据具体情况来选择是否使用,具体配置步骤如下:

主节点:

sql 复制代码
[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配置文件,添加复制槽相关配置:

sql 复制代码
vim /data/highgo/data/postgresql.auto.conf
## 添加以下参数值
primary_slot_name = 'node_1'
  1. 启动备节点数据库,检查流复制状态
sql 复制代码
[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日志# 相关文档

sql 复制代码
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日志

sql 复制代码
[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、将此归档日志及之后的所有归档打包并拷贝到备节点中

sql 复制代码
[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 [email protected]:/data/highgo/
# 拷贝到备节点/data/highgo/目录下,也可以用其他方式

4、恢复wal日志(备节点操作)

解压归档日志到数据目录pg_wal文件夹下

sql 复制代码
[root@HGDB-458 archive]# tar -zxvf hgdb_archive_bak0528.tar.gz -C /data/highgo/data/pg_wal/

5、检查流复制是否恢复

主节点执行

sql 复制代码
[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日志累积严重会导致磁盘爆满,需要权衡其优缺点,并根据具体情况来选择是否使用,具体配置步骤如下:

主节点:

sql 复制代码
[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配置文件,添加复制槽相关配置:

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

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

sql 复制代码
[root@HGDB-458 highgo]# pg_ctl restart
相关推荐
陪我一起学编程19 分钟前
关于ORM增删改查的总结——跨表
数据库·后端·python·django·restful
天空之城夢主41 分钟前
PostgreSQL 初体验
数据库·postgresql
数据知道2 小时前
【系统分析师】2009年真题:综合知识-答案及详解
数据库·系统分析师·综合知识
Samesky0012 小时前
Oracle数据库学习笔记 - 创建、备份和恢复
数据库·学习·oracle
大千AI助手3 小时前
Python3安装MySQL-python踩坑实录:从报错到完美解决的实战指南
数据库·python·mysql·mysqlclient·mysql-python
无色海3 小时前
mysql 通用响应数据包详解
数据库
AA-代码批发V哥3 小时前
MySQL-DML语句深度解析与实战指南
数据库·mysql
待什么青丝3 小时前
【linux】驱动学习问题及解决方法
linux·数据库·学习
天天爱吃肉82183 小时前
《零基础读懂新能源汽车》——V2G/电池梯次利用/氢能源生态级技术拆解与商业预言
数据库·python·汽车·能源·创业创新
我科绝伦(Huanhuan Zhou)4 小时前
数据库管理员密码重置指南:MySQL, Oracle, PostgreSQL
mysql·oracle·dba