在PostgreSQL 10 之前的流复制都是基于wal日志进行的物理复制,PostgreSQL 10版本中新增了一个逻辑复制的特性,逻辑复制是基于逻辑解析进行复制。它使用类似消息队列的发布者、订阅者的模型,利用复制槽的技术,发布者将wal日志解析成一定格式的数据流,订阅者对解析后的wal日志数据流进行回放应用,从而实现数据的同步。但是需要注意的是,PG的逻辑复制不是“SQL”复制,而是复制SQL操作的结果。
一、逻辑复制概念
逻辑复制的适用场景
- 将多个数据库的数据合并到一个数据仓库的数据库中,用于数据仓库的数据分析
- 逻辑复制不依赖版本限制,可以在不同大版本的PG数据库之间进行数据复制
- 捕获本机数据库的增量更新,发送给指定数据库或通知其他应用(数据订阅功能)
- 多个数据库之前共享部分数据
逻辑复制的优势
- 在进行发布时,可以选择发布 insert 、 delete 、 update,比如只发布insert、不发布update、delete
- 一个数据库可以有多个发布,保证发布不重名即可,可同规格pg_publication查看
- 允许一次性发布所有表
- 一个发布允许有多个订阅者
逻辑复制的缺陷
- 目前仅支持数据库表逻辑复制,其他对象如函数、视图不支持
- 仅仅支持复制DML操作,不支持Truncate和DDL操作
逻辑复制注意事项
- 逻辑复制的前提必须将数据库的wal_level设置为logical,同时保证有足够的 max_logical_replication_workers 、 max_wal_senders
- 逻辑复制的源数据库用户必须具有 replication 或 superuser 角色,并且保证订阅段可通过流复制协议连接到源数据库上(pg_hba.conf)
- 当发布包含delete、update操作时,表必须设置replica identity用来标识旧行(pk、uk、full),对于无主键/唯一键的表逻辑同步,只允许发布端进行insert操作,无法执行delete、upadte操作