Postgres使用CDC监控数据变化

1、wal_level设置为logical

修改postgresql.conf文件,将其中的wal_level值修改为logical,重启服务,验证show wal_level的值应该为logical。

2、创建插槽

SELECT* FROM pg_create_logical_replication_slot('slot_test', 'test_decoding');

以后数据的变化都可以从该插槽中读取

-- pg新建用户
CREATE USER ODPS_ETL WITH PASSWORD 'odpsETL@2021';
-- 给用户复制流权限
ALTER ROLE ODPS_ETL replication;
-- 给用户数据库权限
grant CONNECT ON DATABASE test to ODPS_ETL;
-- 设置发布开关
update pg_publication set puballtables=true where pubname is not null;
-- 把所有表进行发布
CREATE PUBLICATION dbz_publication FOR ALL TABLES;
-- 查询哪些表已经发布
select * from pg_publication_tables;
-- 给表查询权限
grant select on TABLE aa to ODPS_ETL;
-- 给用户读写权限
grant select,insert,update,delete ON  ALL TABLES IN SCHEMA public to bd_test;
-- 把当前库所有表查询权限赋给用户
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ODPS_ETL;
-- 把当前库以后新建的表查询权限赋给用户
alter default privileges in schema public grant select on tables to ODPS_ETL;
-- 更改复制标识包含更新和删除之前值
ALTER TABLE test0425 REPLICA IDENTITY FULL;
-- 查看复制标识
select relreplident from pg_class where relname='test0425';
-- 查看solt使用情况
SELECT * FROM pg_replication_slots;
-- 删除solt
SELECT pg_drop_replication_slot('zd_org_goods_solt');
-- 查询用户当前连接数
select usename, count(*) from pg_stat_activity group by usename order by count(*) desc;
-- 设置用户最大连接数
alter role odps_etl connection limit 200;

 

3、读取变化

两种读取方式

SELECT* FROM pg_logical_slot_peek_changes('slot_test', NULL, NULL);不会影响插槽数据

SELECT* FROM pg_logical_slot_get_changes('slot_test', NULL, NULL);读取后插槽数据就不存在了