数据库开启CDC功能。
一、更改数据库参数
在主节点上执行以下修改参数,并重启数据库:
gs_guc reload -N all -I all -c "wal_level=logical"
gs_guc reload -N all -I all -c "wal_sender_timeout = 180s"
gs_guc reload -N all -I all -c "max_replication_slots = 20"
gs_guc reload -N all -I all -h "host replication all 0.0.0.0/0 md5"
gs_om -t restart
- wal_level:更改wal 日志方式为logical。参数可选值minimal、replica、logical。
- max_replication_slots:solts 最大数量。flink-cdc 默认一张表占用一个slots。参数默认值为10。
- max_wal_senders:wal 发送最大进程数。该参数值应与max_replication_slots 参数值设置相同。参数默认值为10。
- wal_sender_timeout:中断那些停止活动超过指定毫秒数的复制连接,可以适当设置大一点。参数默认值60s。
- wal_level 参数必须更改,其它参数可根据需要选择性更改。
二、创建CDC同步用户并授权
登录数据库,创建数据库用户并授权。
根据实际规划,设置用户名和密码,为新创建的同步用户授予相应权限,包括复制流权限、登录数据库权限、当前库下所有表查询权限。
[gbase@c1 ~]$ gsql -r -d postgres -p 15400
gsql ((single_node GBase8cV5 S5.0.0B17 build 32f8156d) compiled at 2023-12-05 19:52:51 commit 0 last mr 408 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
postgres=# # 新创建的同步用户CDCUSER
postgres=# CREATE USER cdcuser WITH PASSWORD 'Database@123';
NOTICE: The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
postgres=# # 将复制流权限赋予cdcuser 用户
postgres=# ALTER ROLE cdcuser REPLICATION;
ALTER ROLE
postgres=# # 将 gbase 数据库的登录权限赋予 cdcuser 用户
postgres=# GRANT CONNECT ON DATABASE gbase TO cdcuser;
GRANT
postgres=# # 切换库并将当前库 cdctest 下所有表查询权限赋予用户
postgres=# \c gbase
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "gbase" as user "gbase".
gbase=# GRANT SELECT ON ALL TABLES IN SCHEMA cdctest TO cdcuser;
GRANT
发布表
设置发布开关。将复制槽的active 更新设置为true,以便可修改发布表。
gbase=# UPDATE pg_publication SET puballtables=true WHERE pubname IS NOT NULL;
UPDATE 0
创建发布dbz_publication,并添加所有表到dbz_publication(包括之后创建的表)。
gbase=# CREATE PUBLICATION dbz_publication FOR ALL TABLES;
CREATE PUBLICATION
查询哪些表已经发布
gbase=# SELECT * FROM pg_publication_tables;
更改表复制标识
更改表复制标识,包含更新和删除之前的值。以test 表为例:
gbase=# ALTER TABLE test REPLICA IDENTITY FULL;
ALTER TABLE
查看表复制标识。
gbase=# SELECT RELREPLIDENT FROM pg_class WHERE relname='test';
relreplident
--------------
f
d
(2 rows)
返回为 f 标识,说明设置成功。