PostgreSQL logical replication 的常见配置坑
发布时间 - 2026-01-30 00:00:00 点击率:次wal_level必须设为logical才能启用逻辑复制,否则复制静默失败;还需配置max_wal_senders≥2、max_replication_slots≥1、pg_hba.conf添加replication权限行、用户授予REPLICATION属性及SELECT权限,并确保表结构完全一致。
wal_level 没设成 logical 就启动复制?直接静默失败
逻辑复制不是“开箱即用”的功能,wal_level 必须显式设为 logical,否则即使创建了 publication、subscription,复制也会卡在初始化阶段,不报错、不同步、不提示——只默默停在“waiting for initial copy”或根本收不到任何 INSERT/UPDATE 消息。
常见错误配置:wal_level = replica 或保留默认值 replica(PostgreSQL 12+ 默认),这仅支持物理复制,对逻辑复制无效。
-
wal_level = logical是硬性前提,改完必须重启 PostgreSQL(热重载不生效) -
max_wal_senders至少 ≥ 2:一个用于 base backup,一个用于逻辑复制流;建议设为5或更高 -
max_replication_slots必须 ≥ 1,且要 ≥ 实际创建的 slot 数量(publication 自动占用 slot)
pg_hba.conf 漏掉 replication 权限行,连接被拒却不报“replication”关键词
订阅端连接发布端时,用的是 replication 数据库类型,不是普通 dbname=xxx。如果 pg_hba.conf 只写了普通用户访问规则,连接会直接拒绝,但错误日志里往往只显示 connection rejected 或 FATAL: no pg_hba.conf entry,根本不会提“replication”三个字,极易误判为网络或密码问题。
- 必须加这一行(注意第 2 字段是
replication,不是数据库名):host replication repl_user 192.168.10.0/24 md5 - 用户
repl_user必须有REPLICATION属性:ALTER USER repl_user WITH REPLICATION; - 若用
pg_create_subscription()自动建 slot,该用户还需SUPERUSER或至少pg_read_all_data(PG 14+)
订阅端表结构不匹配,复制中途崩在 “duplicate

逻辑复制不校验表结构一致性,它只按 relation ID 和列序号投递数据。如果从库表少了字段、主键类型不一致、或已有冲突主键值,INSERT/UPDATE 会直接报错并中断复制进程,错误如:ERROR: duplicate key value violates unique constraint "t1_pkey"。
- 发布端
CREATE PUBLICATION后新增的表,不会自动加入 publication —— 必须显式ALTER PUBLICATION ... ADD TABLE - 订阅端建表时,所有列名、类型、NOT NULL 约束、主键定义必须与发布端严格一致(顺序也要一致)
- 首次同步前,务必清空订阅端目标表,或确保无主键/唯一键冲突数据(
TRUNCATE比DELETE更安全) - 若需跳过初始全量同步,可用
create_subscription(..., copy_data := false),但之后必须手动保证数据一致
Go 里用 pglogrepl 连不上?大概率是环境变量或权限没对齐
pglogrepl 示例程序依赖 PGLOGREPL_TEST_CONN_STRING 环境变量传连接串,但它要求这个串**必须包含 replication 权限**,且不能带 dbname= —— 应该指向发布端数据库,但连接类型是 replication。很多开发者填了普通应用连接串,结果 ReplicationConnect() 返回 ERROR: must be superuser or replication role 却没意识到是权限问题。
- 正确连接串示例:
user=repl password=xxx host=localhost port=5432(不含dbname) - 用户
repl必须有REPLICATION属性,且对发布数据库有SELECT权限(否则 base backup 阶段报permission denied for table) - 若用 PG 15+,还需
GRANT ALL ON SCHEMA public TO repl;,否则解析Relation消息时可能 panic - 跳过 base backup 测试?设
PGLOGREPL_SKIP_BASE_BACKUP=true,但生产环境不建议跳
逻辑复制的坑不在语法多难,而在于它把“一致性责任”从数据库推给了人:wal_level、hba 规则、表结构、用户权限、连接串格式,任意一环断掉,它都不报明确错误,只沉默或报错在下游。最稳妥的做法是——每改一项配置,都用 pg_isready -U repl -d 'replication' -h host 验证连接能力,再查 pg_replication_slots 确认 slot 存在且 active。
# word
# go
# ai
# 环境变量
# sql
# NULL
# for
# select
# Error
# public
# copy
# delete
# table
# postgresql
# 数据库
# 关键词
# 设为
# 主键
# 还需
# 报错
# 跳过
# 不报
# 的是
# 也会
# 首次
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
php 三元运算符实例详细介绍
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
实例解析Array和String方法
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
如何在阿里云ECS服务器部署织梦CMS网站?
Laravel如何创建自定义中间件?(Middleware代码示例)
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
JS去除重复并统计数量的实现方法
如何快速选择适合个人网站的云服务器配置?
Laravel如何使用Service Container和依赖注入?(代码示例)
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
如何用wdcp快速搭建高效网站?
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
5种Android数据存储方式汇总
如何在IIS中新建站点并配置端口与物理路径?
如何在IIS中新建站点并配置端口与IP地址?
如何确保西部建站助手FTP传输的安全性?
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel如何发送系统通知?(Notification渠道示例)
北京企业网站设计制作公司,北京铁路集团官方网站?
JavaScript中的标签模板是什么_它如何扩展字符串功能
Laravel如何实现用户注册和登录?(Auth脚手架指南)
在线制作视频的网站有哪些,电脑如何制作视频短片?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
新三国志曹操传主线渭水交兵攻略
Laravel如何使用查询构建器?(Query Builder高级用法)
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel集合Collection怎么用_Laravel集合常用函数详解
使用spring连接及操作mongodb3.0实例
佛山企业网站制作公司有哪些,沟通100网上服务官网?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
,交易猫的商品怎么发布到网站上去?
如何快速建站并高效导出源代码?
如何在IIS7上新建站点并设置安全权限?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel如何实现模型的全局作用域?(Global Scope示例)
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
详解MySQL数据库的安装与密码配置
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
公司门户网站制作流程,华为官网怎么做?
如何快速使用云服务器搭建个人网站?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
如何快速搭建高效WAP手机网站?
如何生成腾讯云建站专用兑换码?
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?

