PostgreSQL支持逻辑复制,该方法复制数据库中的对象及其变化,类似于MySQL中的binlog机制。
启用逻辑复制
最简配置
把wal_level由replica更改为logical, 该设置项修改后需要重启PostgreSQL服务
wal_level = logical #默认是replica
创建publication
create publication pg_pub_demo for table person;
创建subscription
在另一个PostgreSQL实例中订阅刚才创建的Publication,复制的源schema和目的schema名称必须一致。
create subscription pg_sub_demo connection 'host=localhost dbname=postgres port=5432' publication pg_pub_demo;
如果是在同一个PostgreSQL实例中订阅,那么需要先创建一个新的database, 然后视情况创建schema与否, 再进行订阅。
create database test;
\c test;
create subscription pg_sub_demo connection 'host=localhost dbname=postgres port=5432' publication pg_pub_demo;
监控逻辑复制进度
slot和stats
查看当前打开的逻辑复制slots, 每一个订阅者(subscriptor)都需要使用一个slot, 如果slot不存在,会自行创建。也可以先创建好replication slot,然后在订阅时使用刚创建好的slot。
select * from pg_replication_slots;
select * from pg_stat_replication;
复制延迟
复制延迟监控,注意下述sql语句输出的是滞后的字节数(bytes)。
SELECT slot_name,
pg_wal_lsn_diff(
pg_current_wal_lsn(),
restart_lsn
) as restart_lag,
pg_wal_lsn_diff(
pg_current_wal_lsn(),
confirmed_flush_lsn
) as flush_lag
FROM pg_replication_slots;