内容提要
本文介绍了PostgreSQL中逻辑复制的详细信息,与物理流复制进行了比较,并讨论了其工作原理、用例、使用时机、限制和注意事项。逻辑复制通过发布者-订阅者模型,在数据库服务器之间复制特定的表、行或列。逻辑复制支持选择性复制、跨不同主要版本的数据复制、实时数据整合和双向复制等功能。
延伸解读
逻辑复制与物理复制的核心差异
逻辑复制基于发布-订阅模型,只复制指定的表、行或列,而物理复制在块级别复制整个数据库。逻辑复制的订阅者可以执行写操作,且不要求与发布者相同的系统配置,这为跨版本升级和双向复制提供了可能。但逻辑复制需要表有主键或副本标识,且不复制DDL,因此更适合选择性数据分发而非全库灾备。
使用逻辑复制时需警惕的运维风险
逻辑复制会增加主库负载,因为需要将WAL解码为逻辑变更记录。若订阅者停机,主库会保留WAL日志,导致磁盘空间增长。此外,大事务会按提交顺序应用,可能造成小事务延迟。监控时需关注pg_replication_slots中的active状态和subscriber_lag,以及pg_stat_replication中的发送、接收和重放延迟,及时排查网络或资源问题。
DDL变更与初始同步的实操要点
在逻辑复制中执行DDL需注意顺序:添加列应先改订阅者再改发布者,删除列则相反,否则复制会中断。初始同步速度可通过调整订阅者侧的max_logical_replication_workers和max_sync_workers_per_subscription来提升,但需确保不超过max_worker_processes。对于大表,可拆分到不同发布中;大索引可在同步期间移除,之后用CREATE INDEX CONCURRENTLY重建。PostgreSQL 16支持二进制格式初始拷贝,能显著改善性能。
Q&A
PostgreSQL逻辑复制和物理流复制主要区别是什么?
逻辑复制基于发布者-订阅者模型,可复制特定表、行或列,支持跨大版本、选择性复制,订阅者可写;物理流复制复制整个数据库的块/页级WAL记录,要求相同大版本,副本只读。
逻辑复制支持跨不同PostgreSQL大版本吗?
支持。逻辑复制允许在不同主要版本之间复制数据,有助于以最小停机时间执行大版本升级。
逻辑复制有哪些主要限制?
表必须有主键或设置副本标识;不复制DDL更改(如索引创建、表空间变更、vacuum、列类型修改);不复制角色、序列等其它数据库对象;不解决冲突;可能增加主库负载和磁盘空间使用。
在逻辑复制中,更新和删除操作如何标识行?
需要主键(默认副本标识)、唯一索引(非空列)或全列作为副本标识。主键发布旧主键值和新列值;唯一索引发布旧索引值(若更新)和所有列值;全列发布所有列的新旧值,但会导致过多日志和I/O。
如何加快逻辑复制初始数据同步速度?
在订阅端增加max_logical_replication_workers和max_sync_workers_per_subscription;大表分开发布;大索引初始同步时移除,后用CREATE INDEX CONCURRENTLY重建;监控磁盘和CPU。PostgreSQL 16支持二进制格式复制初始数据,性能显著提升。
逻辑复制延迟可能由哪些因素引起?
网络不稳定、发布端或订阅端硬件资源不足(CPU、内存、磁盘I/O)、发布端大事务(按提交顺序应用,小事务可能滞后)。
如何监控逻辑复制的状态和延迟?
在发布端查询pg_replication_slots(检查active、confirmed_flush_lsn、subscriber_lag等)和pg_stat_replication(查看sending_lag、receiving_lag、replaying_lag、total_lag)。确保active为't',否则检查日志。
如何向现有的逻辑复制中添加新表?
若发布使用FOR ALL TABLES或FOR TABLES IN SCHEMA,新表自动包含;否则需执行ALTER PUBLICATION ADD TABLE,然后ALTER SUBSCRIPTION REFRESH PUBLICATION更新订阅。