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日志,或者归档日志已经被删除;
此情况只能选择使用pg_basebackup重做备库,示例步骤如下:
示例环境:
[root@HGDB-458 highgo]# pg_ctl stop
[root@HGDB-458 highgo]# mv /data/highgo/data data/highgo/databak
[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日志累积严重会导致磁盘爆满,需要权衡其优缺点,并根据具体情况来选择是否使用,具体配置步骤如下:
主节点:
[root@HGDB-458 highgo]# psql highgo sysdbahighgo=# 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 start[root@HGDB-458 highgo]# psql -d highgo -U sysdbahighgo=# 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_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日志文件
此情况可通过拷贝归档日志到备节点恢复流复制
具体示例步骤如下:
示例环境:
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已经被删除",,,,,,,,
[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
[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/目录下,也可以用其他方式
解压归档日志到数据目录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 sysdbahighgo=# 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_lsn | 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/C3000000 | 0/C3000000 | | | | 0 | async | 2024-05-29 05:22:51.494491+08(1 行记录)# 流复制已恢复正常
创建复制槽可以确保主从数据库之间的数据一致性。主数据库产生的 WAL 日志在从数据库处理之前不会被删除,但若出现备节点异常宕机或断档情况会导使主节点wal日志累积严重会导致磁盘爆满,需要权衡其优缺点,并根据具体情况来选择是否使用,具体配置步骤如下:
主节点:
[root@HGDB-458 highgo]# psql highgo sysdbahighgo=# 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
版权声明:本文由瀚高及PG志愿者翻整理,转载请注明出处,本页面内容均源自PostgreSQL Weekly英文官网,翻译目的在于传递更多信息,并不意味着瀚高赞同其观点或证实其内容的真实性。如果其他媒体、网站或其他任何形式的法律实体和个人使用,必须经过著作权人合法书面授权并自负全部法律责任。不得擅自使用瀚高名义进行转载,或盗用瀚高名义发布信息。否则瀚高将保留追究法律责任的权利!





