Postgres 请求的 WAL 段已被删除(但它实际上位于从属目录中)

sqw*_*ale 7 replication repmgr postgresql-9.4

我正在使用它repmgr作为我的复制工具。在从站上我不断收到错误:

请求的 WAL 段已被删除

当我检查主时,确实它不在那儿;但是,它位于从属目录中的pg_xlogs和中pg_xlogs/archive_status。我不明白为什么它会寻找这个文件,如果它已经在从站中?

事实上,它已经xlogs超出了要求的范围。如何处理 Postgres Slave 重置的 WAL 文件中的解决方案针对的是略有不同的问题。它们似乎适用于主服务器在从服务器接收日志文件之前删除日志文件的场景。就我而言,它在从属文件和所请求的文件之后的序列中的其他几个文件中非常频繁地出现。

这也告诉我,我不需要增加 keep wal 分段选项,因为它似乎没有落后?

小智 6

来自 PostgreSQL 文档中的流复制:

如果您使用流式复制而不进行基于文件的连续归档,则服务器可能会在备用服务器收到旧的 WAL 段之前回收它们。如果发生这种情况,则需要从新的基础备份重新初始化备用数据库。您可以通过将 wal_keep_segments 设置为足够大的值来避免这种情况,以确保 WAL 段不会过早回收,或者为备用数据库配置复制槽。如果您设置了可从备用数据库访问的 WAL 存档,则不需要这些解决方案,因为备用数据库始终可以使用存档来赶上,只要它保留足够的段。

要解决此问题,您必须从主服务器重新初始化数据。删除从站上的数据目录:

root@replica:~# su postgres
postgres@replica:~# mv /var/lib/postgresql/12/main /var/lib/postgresql/12/main_old
Run Code Online (Sandbox Code Playgroud)

从主服务器复制所有数据:

sudo -u postgres pg_basebackup -h [PRIMARY_IP] -D /var/lib/postgresql/12/main -U replication -P -v
Run Code Online (Sandbox Code Playgroud)

如果版本为12,则创建standby.signal文件,否则配置replica.conf:

touch /var/lib/postgresql/12/main/standby.signal
Run Code Online (Sandbox Code Playgroud)

从机配置:

listen_addresses = 'localhost,[IP_ADDRESS_OF_REPLIACA_ON_LAN]'              # what IP address(es) to listen on; 
max_connections = 100 # Ensure that this value is the same as the primary's
wal_level = 'replica'
archive_mode = on
archive_command = 'cd .'
primary_conninfo = 'host=[PRIMARY_IP] port=5432 user=replication password=[REPLICATION PASSWORD]'
hot_standby = on

max_wal_senders = 48

Run Code Online (Sandbox Code Playgroud)

pg_basebackup 需要多长时间?请记住,段大约每 5 分钟生成一次,因此如果备份需要一个小时,则至少需要存储 12 个段。在 2 小时时,您需要 24 等,我会将值设置为大约 12.2 段/小时备份。

https://www.gab.lc/articles/postgresql-12-replication/


sqw*_*ale 2

我只是赌了一把,将丢失的一个文件复制回母版。它有效,我仍然不知道是什么导致了这个问题。