
PostgreSQL 逻辑复制原理与实践pgoutput 输出插件、逻辑解码与数据迁移完全指南【免费下载链接】postgresMirror of the official PostgreSQL GIT repository. Note that this is just a *mirror* - we dont work with pull requests on github. To contribute, please see https://wiki.postgresql.org/wiki/Submitting_a_Patch项目地址: https://gitcode.com/gh_mirrors/po/postgresPostgreSQL 逻辑复制Logical Replication是基于逻辑解码Logical Decoding的发布-订阅式数据同步机制它通过内置的 pgoutput 输出插件将 WAL 日志转换为行级变更流让你可以跨版本、跨平台地完成细粒度数据迁移与增量同步。一、什么是 PostgreSQL 逻辑复制逻辑复制按行的复制身份通常为主键来复制数据对象及其变更而不是像物理流复制那样按字节级别逐块复制。这意味着细粒度只复制你关心的表甚至可以用行过滤器只复制部分行跨版本发布端与订阅端可以是不同的 PostgreSQL 大版本跨平台支持 Linux 到 Windows 等异构平台间复制单向拉取订阅端从发布端拉取数据还可以再发布出去实现级联复制它支持发布Publication 订阅Subscription模型一个或多个订阅者subscriber订阅发布节点publisher上一个或多个发布publication。这是官方文档 logical-replication.sgml 描述的核心概念。 典型场景增量变更同步、一库多发广播、多库汇聚到分析库、跨版本升级迁移、按用户分群授权访问数据。二、核心原理逻辑解码Logical Decoding如何工作1. 从 WAL 中翻译出应用级变更逻辑解码的过程是把存储层视角的 WALWrite-Ahead Log记录解码成无需了解数据库内部状态就能理解的形式如元组流、SQL 语句流。启用逻辑解码需要满足以下任一条件条件说明wal_level logical显式开启逻辑 WAL 级别wal_level replica且存在至少一个逻辑复制槽PostgreSQL 会自动激活逻辑解码原理细节可参考官方文档 logicaldecoding.sgml其源码实现位于 src/backend/replication/logical/decode.c、logical.c、snapbuild.c等文件。2. 复制槽Replication Slot变更流的书签复制槽表示一条可以按发生顺序重放给客户端的变更流它的两个关键特性持久且崩溃安全槽位置在检查点时持久化与连接无关宕机重启后依然保留阻止资源回收只要槽存在它需要的 WAL 和系统目录行就不能被清理⚠️重要提醒不再需要的逻辑槽必须手动删除否则它会一直保留 WAL极端情况下可能撑满磁盘甚至导致数据库为防事务 ID 回绕而拒绝写入。三、pgoutput标准逻辑解码输出插件1. 输出插件的角色输出插件Output Plugin负责把 WAL 内部表示转换为消费端想要的格式。PostgreSQL 内置了两个插件插件用途pgoutput标准插件供内置逻辑复制使用输出二进制协议数据test_decoding示例插件输出文本可读的变更适合学习和调试pgoutput 的核心实现是 pgoutput.c示例插件见 contrib/test_decoding/。2. 整体架构walsender 与 apply 协作逻辑复制的架构与物理流复制类似由两个进程协作完成见 logical-replication.sgml Architecture 章节发布端 walsender 进程启动逻辑解码加载 pgoutput 插件将 WAL 变更转换为逻辑复制协议消息并按发布定义过滤数据订阅端 apply worker 进程接收变更流映射到本地表按事务顺序应用初始数据同步则由并行的表同步 worker完成快照拷贝拷贝完成后进入同步模式补齐期间变更3. pgoutput 常用选项速查创建逻辑槽使用 pgoutput 时可通过选项控制其行为选项作用publication_names逗号分隔的发布名列表必填proto_version协议版本 1-4v2 支持流式传输大事务v3 支持两阶段提交v4 支持并行应用streamingoff/on/parallel控制是否在事务提交前流式发送大型未提交事务binary启用二进制传输模式比文本更快但略脆弱two_phase发送两阶段事务需协议 v3origin按复制起源过滤变更none可避免级联复制形成死循环messages转发pg_logical_emit_message()写入的消息四、数据迁移实践三步搭建逻辑复制 ️步骤 1发布端创建 Publication在发布端为需要迁移的表创建发布可限定 DML 操作类型和行过滤条件CREATE PUBLICATION pub1 FOR TABLE t1; -- 只复制满足条件的行行过滤器 CREATE PUBLICATION pub3b FOR TABLE t3 WHERE (e 5);注意被发布的表必须配置复制身份replica identity默认是主键。没有主键的表可设置为REPLICA IDENTITY FULL但订阅端查找效率会明显下降只建议作为兜底方案。步骤 2订阅端创建 Subscription在订阅端先建好同名的目标表然后创建订阅会自动在发布端创建逻辑槽CREATE SUBSCRIPTION sub1 CONNECTION hostpublisher.example dbnamemydb PUBLICATION pub1;订阅端会先并行拷贝存量数据类似 COPY随后进入增量复制。列按名称匹配类型不要求完全一致如int可复用到bigint目标表还可以有额外的默认值列。步骤 3监控与冲突处理监控查询pg_stat_subscription视图查看每个订阅 worker 的运行状态见 logical-replication.sgml Monitoring 章节冲突日志新建订阅时可用conflict_log_destination table选项把冲突信息写入自动维护的冲突日志表便于结构化分析行过滤的智能转换当带行过滤的UPDATE使行进出过滤条件时PostgreSQL 会自动把UPDATE转换为DELETE或INSERT保证订阅端与发布端过滤条件定义的数据一致五、进阶场景故障切换与高可用生产环境中发布端宕机怎么办官方提供了逻辑复制故障切换方案为发布端配置一个物理备库创建订阅时指定failover true让逻辑槽同步到备库备库开启sync_replication_slots由 slotsync worker 周期性同步槽主库宕机后备库提升为新主订阅可无缝续接切换后建议用ALTER SUBSCRIPTION ... CONNECTION更新连接串验证槽是否切换就绪的关键查询SELECT slot_name, (synced AND NOT temporary AND invalidation_reason IS NULL) AS failover_ready FROM pg_replication_slots;六、关键源码与文档导读 内容路径逻辑复制官方文档SGML 源doc/src/sgml/logical-replication.sgml逻辑解码官方文档SGML 源doc/src/sgml/logicaldecoding.sgmlpgoutput 输出插件源码src/backend/replication/pgoutput/pgoutput.c逻辑复制后端实现apply/表同步/冲突处理src/backend/replication/logical/逻辑解码框架WAL 解码、重排序缓冲src/backend/replication/logical/decode.c表级初始数据同步 workersrc/backend/replication/logical/tablesync.c文本输出插件示例学习解码协议contrib/test_decoding/test_decoding.c总结PostgreSQL 逻辑复制 WAL 逻辑解码 复制槽 pgoutput 输出插件 发布/订阅协议。理解了这条链路你就能从容应对跨版本数据迁移、一库多发、多库汇聚和高可用故障切换等常见场景。✨【免费下载链接】postgresMirror of the official PostgreSQL GIT repository. Note that this is just a *mirror* - we dont work with pull requests on github. To contribute, please see https://wiki.postgresql.org/wiki/Submitting_a_Patch项目地址: https://gitcode.com/gh_mirrors/po/postgres创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考