文章目录
环境
系统平台: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 |
- 停掉备节点数据库
sql
[root@HGDB-458 highgo]# pg_ctl stop
- 重命名备节点data目录
sql
[root@HGDB-458 highgo]# mv /data/highgo/data /data/highgo/databak
- 备节点使用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
- 创建复制槽
创建复制槽可以确保主从数据库之间的数据一致性。主数据库产生的 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 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