PG:waiting for WAL to become available at 0/E000040

PostgreSQL 主从同步问题处理笔记

一、问题描述

某日,从库在尝试与主库同步时出现错误,日志显示 waiting for WAL to become available at 0/E000040primary server contains no more WAL on requested timeline 2,同时从库的 WALreceiver 进程反复终止,状态显示为 starting,无法正常同步。

二、问题分析过程

  1. 确认 WAL 文件存在性 :在主库的 pg_wal 目录下查看,发现 000000030000000000000040 文件不存在,表明主库可能已删除该 WAL 文件或从库时间线配置有误。
  2. 检查主库 WAL 配置 :发现主库的 wal_keep_segments 参数已废弃,需使用 wal_keep_size,且从库请求的时间线 2 与主库当前时间线 3 不一致,导致同步失败。
  3. 查看从库状态 :通过 patronictl list 命令发现从库状态为 starting,时间线为 空 。

三、解决步骤

  1. 检查主库的 pg_hba.conf 配置 :确保允许从库的复制连接,配置正确无误。
  2. 重新初始化从库 :在主库上执行 pg_basebackup 创建新备份,将备份数据复制到从库的数据目录,并编辑从库的 recovery.conf 配置文件,确保 standby_modeprimary_conninfo 等参数正确,重启从库服务。
  3. 调整主库的 wal_keep_size 参数 :在主库的 postgresql.conf 文件中,将其设置为合适的较大值,如 2048MB,以保留足够的 WAL 文件供从库使用。
  4. 验证从库同步状态 :在从库上执行 psql -c "SELECT * FROM pg_stat_wal_receiver;",确认同步状态是否正常。

四、总结

本次问题主要由于主库时间线切换后从库未能及时跟上,以及 WAL 文件保留配置不当导致同步失败。通过重新初始化从库、调整主库配置等操作成功解决了问题。后续需密切关注主从库的时间线一致性及 WAL 文件保留情况,避免类似问题再次发生。

补充:参数

PostgreSQL 中与 Write-Ahead Logging(WAL)相关的配置参数。以下是这些参数的简要解释:

  • wal_block_size:WAL块的大小,通常与数据库块大小一致。
  • wal_buffers:用于存储 WAL 数据的内存量,以数据库块为单位。
  • wal_compression:是否启用 WAL 压缩,on 表示启用,off 表示禁用。
  • wal_consistency_checking:是否启用一致性检查,通常用于调试。
  • wal_decode_buffer_size:用于解码 WAL 数据的缓冲区大小。
  • wal_init_zero:是否将 WAL 文件初始化为零,on 表示启用,off 表示禁用。
  • wal_keep_size:保留的 WAL 文件大小(字节),用于确保从库能获取足够的 WAL 数据进行同步。
  • wal_level:WAL 日志的详细程度,可设置为 minimalreplicalogical
  • wal_log_hints:是否记录提示信息,用于某些类型的恢复。
  • wal_receiver_create_temp_slot:是否为复制槽创建临时槽。
  • wal_receiver_status_interval:复制进程向主库发送状态更新的间隔时间(秒)。
  • wal_receiver_timeout:等待 WAL 数据的超时时间(毫秒)。
  • wal_recycle:是否循环使用 WAL 文件,on 表示启用,off 表示禁用。
  • wal_retrieve_retry_interval:从归档中检索 WAL 文件的重试间隔时间(毫秒)。
  • wal_segment_size:WAL 文件的大小(字节),通常是 16MB(即 16MB)。
  • wal_sender_timeout:WAL 发送进程等待复制确认的超时时间(毫秒)。
  • wal_skip_threshold:跳过 WAL 数据的阈值,用于性能优化。
  • wal_sync_method:用于同步 WAL 数据的系统调用方法。
  • wal_writer_delay:WAL 写入进程的延迟时间(毫秒)。
  • wal_writer_flush_after:WAL 写入后刷新的字节数。

这些参数对于配置和优化 PostgreSQL 的复制和恢复过程至关重要。如果你想查看某个具体参数的当前值,可以在 psql 中使用 SHOW 命令,例如:

SHOW wal_keep_size;

你可以使用以下命令来分别查看 max_wal_sendersmax_wal_size 的当前配置值:

SHOW max_wal_senders;
SHOW max_wal_size;

这两个参数的含义如下:

  • max_wal_senders:该参数决定了 PostgreSQL 可以同时处理的复制连接(即从库连接)的最大数量。如果你的集群中有多个从库,需要确保这个值足够大以容纳所有从库的连接。

  • max_wal_size:该参数设置了 WAL 文件在被自动归档或删除前可以增长到的最大总大小。当 WAL 文件的总大小达到这个值时,PostgreSQL 会尝试进行检查点操作来减少 WAL 文件的数量。

如果你需要调整这些参数,可以在 PostgreSQL 的配置文件 postgresql.conf 中进行修改,或者使用 SQL 命令进行动态调整:

SET max_wal_senders = 10;
SET max_wal_size = '2GB';

但要注意,使用 SET 命令进行的修改通常是临时的,仅对当前会话有效。如果需要永久生效,建议在 postgresql.conf 文件中进行相应的修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值