PostgreSQL配置synchronous_standby_names实现Barman同步流复制报错
PostgreSQL synchronous_standby_names 多同步备节点配置指南
报错原因
之前的配置写法将备节点名称写在了参数值的单引号外部,PostgreSQL解析配置时会将引号外的逗号识别为非法语法标记,因此触发syntax error near token ","报错。
该参数所有的同步规则、候选备节点列表必须全部写在参数值的单引号内部,不存在使用&&连接、引号外追加节点的合法写法。
参数语法规则
PostgreSQL 9.6及以上版本中,该参数的标准语法结构为:
[FIRST|ANY] num_sync ( standby_name [, standby_name ...] )
字段说明:
FIRST/ANY:同步策略,不填写时默认取FIRSTFIRST:按候选列表顺序优先选取靠前的备节点作为同步备,凑够num_sync个即可ANY:候选列表中任意num_sync个备节点返回写入确认,主库就认为写入成功
num_sync:需要返回写入确认的同步备节点数量standby_name:纳入同步候选的备节点名称,逗号分隔,支持*通配符匹配所有已连接的流复制备节点,名称需要和备节点连接时上报的application_name完全一致,大小写敏感。
面向Barman同步场景的正确配置
如果需要保留原有ANY 1 (*)的规则(任意1个备节点确认即写入成功),同时将Barman节点加入同步候选列表,正确配置如下:
synchronous_standby_names = 'ANY 1 (*, barman-wal-archive)'
常见配置示例
- 优先选取列表前2个节点作为同步备,候选列表包含普通备库node2、node3和Barman节点:
synchronous_standby_names = 'FIRST 2 (node2, node3, barman-wal-archive)'
- 要求任意2个备节点返回确认,所有已连接备节点均纳入候选:
synchronous_standby_names = 'ANY 2 (*)'
- PostgreSQL 9.5及更早版本(不支持FIRST/ANY语法),默认按列表顺序优先选1个同步备:
synchronous_standby_names = 'node2, barman-wal-archive'
生效验证
- 修改配置后执行重载操作,无需重启数据库:
-- psql中执行 SELECT pg_reload_conf();
- 验证参数是否加载成功:
SHOW synchronous_standby_names;
- 如果配置加载成功但Barman未进入同步列表,查询
pg_stat_replication视图确认Barman连接上报的application_name和配置中填写的名称完全匹配。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

