PostgreSQL 主从同步问题处理笔记
一、问题描述
某日,从库在尝试与主库同步时出现错误,日志显示 waiting for WAL to become available at 0/E000040
和 primary server contains no more WAL on requested timeline 2
,同时从库的 WALreceiver 进程反复终止,状态显示为 starting
,无法正常同步。
二、问题分析过程
- 确认 WAL 文件存在性 :在主库的
pg_wal
目录下查看,发现000000030000000000000040
文件不存在,表明主库可能已删除该 WAL 文件或从库时间线配置有误。 - 检查主库 WAL 配置 :发现主库的
wal_keep_segments
参数已废弃,需使用wal_keep_size
,且从库请求的时间线 2 与主库当前时间线 3 不一致,导致同步失败。 - 查看从库状态 :通过
patronictl list
命令发现从库状态为starting
,时间线为 空 。
三、解决步骤
- 检查主库的
pg_hba.conf
配置 :确保允许从库的复制连接,配置正确无误。 - 重新初始化从库 :在主库上执行
pg_basebackup
创建新备份,将备份数据复制到从库的数据目录,并编辑从库的recovery.conf
配置文件,确保standby_mode
、primary_conninfo
等参数正确,重启从库服务。 - 调整主库的
wal_keep_size
参数 :在主库的postgresql.conf
文件中,将其设置为合适的较大值,如2048MB
,以保留足够的 WAL 文件供从库使用。 - 验证从库同步状态 :在从库上执行
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 日志的详细程度,可设置为
minimal
、replica
或logical
。 - 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_senders
和 max_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
文件中进行相应的修改。