PostgreSQL逻辑复制--配置和监控

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;