GaussDB逻辑复制槽介绍
DRS任务报错初始化逻辑复制槽失败问题解决方法:
使用 DRS 创建以 GaussDB 为源的增量任务时,首先要到源 GaussDB 中创建逻辑复制槽,可能会出现 Initialize logical replication stream failed 报错导致同步任务无法启动。
分析报错信息,原因是初始化逻辑复制槽失败。DRS启动任务后,DRS增量抓取在源端数据库创建逻辑复制槽时由于长事务阻塞,或者创建逻辑复制槽的过程中数据库未找到一致性位点,等待创建超时。
参考以下SQL在源数据库查询是否存在长事务:
-- 查看源库是否有长事务
select datname, pid, xact_start, state, query from pg_stat_activity where xact_start < current_timestamp - interval '300 second'
如果源库存在长事务,则需要等长事务结束,或使用 select pg_terminate_backend(pid) 杀掉长事务,长事务结束后重试任务即可。
如果没有长事务可以重试任务,若多次重试仍然报错,可以调大drs建槽的超时时间,运维面添加参数:
参数名:sync.relay.replicator.createSlotOptions
参数值:&socketTimeout=900&connectTimeout=30
除此之外,也可能是源端实例复制槽数量达到上限,可通过以下SQL进行排查:
-- 查询所有复制槽信息
select * from pg_replication_slots;
-- 查询当前实例允许创建复制槽最大数量(默认值为20)
select setting as number from pg_settings where name = 'max_replication_slots';
逻辑复制槽拓展知识:
1.逻辑复制相关介绍
为实现通过数据迁移工具定期向异构数据库(如Oracle数据库等)进行数据同步的功能,GaussDB通过逻辑复制,通过解析Xlog生成逻辑日志,再写入到目标数据库中,实现在不同数据库间的数据复制及同步。
逻辑复制分为逻辑解码与数据复制两部分:
· 逻辑解码:逻辑解码会输出以事务为单位组织的逻辑日志,为逻辑复制提供事务解码的基础能力。
· 数据复制:逻辑日志可通过第三方工具(当前主要是DRS)转化为SQL语句,在对端数据库进行回放,以达到数据库间同步数据的功能。
由于逻辑日志是以事务为单位的,在事务提交后才能输出,且逻辑解码是由用户驱动的;因此为了防止事务开始时的xlog被系统回收,或所需的事务信息被VACUUM回收,GaussDB新增了逻辑复制槽,用于阻塞xlog的回收。一个逻辑复制槽表示一个更改流,这些更改可以在其他数据库中以它们在原数据库上产生的顺序重新执行。每个逻辑复制槽都由其对应逻辑日志的获取者维护。
2.逻辑复制槽使用注意事项
· 逻辑解码特性需提前设置GUC参数wal_level为logical,该参数需要重启生效
· 仅限初始用户和拥有REPLICATION权限的用户进行操作。三权分立关闭时数据库管理员可进行逻辑复制操作,三权分立开启时不允许数据库管理员进行逻辑复制操作
· 逻辑复制槽名称必须小于64个字符,一般推荐使用小写字母、数字以及“_”字符
· 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除,否则会阻塞wal日志回收
· 一个逻辑复制槽只能解码一个数据库的修改,如果需要解码多个数据库,则需要创建多个逻辑复制槽
· 多路逻辑复制同步时,源端数据库需为每条逻辑复制链路创建独立逻辑复制槽
· 请确保在创建逻辑复制槽过程中未启动长事务,启动长事务会阻塞逻辑复制槽的创建
· 不活跃的逻辑复制槽将阻塞WAL日志回收和系统表元组历史版本清理,导致磁盘日志堆积和系统表扫描性能下降,因此不再使用的逻辑复制槽请及时清理
3.逻辑复制槽相关操作
# 获取逻辑复制槽列表
SELECT * FROM pg_get_replication_slots();
# 创建逻辑复制槽
SELECT * FROM pg_create_logical_replication_slot('slot_dbm', 'mppdb_decoding');
# 读取逻辑复制槽
SELECT * FROM pg_logical_slot_peek_changes('slot_dbm', NULL, 4096);
# 读取白名单参数,包含需要进行解码的schema和表名
select * from pg_logical_slot_peek_changes('slot_dbm', NULL, 4096, 'white-table-list', 'public.t1,public.t2');
# 读取白名单参数,
select a.datname,b.rolname,string_agg(a.pri_t,',') from
(select datname
,(aclexplode(COALESCE(datacl, acldefault('d'::"char",datdba)))).grantee as grantee
,(aclexplode(COALESCE(datacl, acldefault('d'::"char", datdba)))).privilege_type as pri_t
from pg_database where datname not like 'template%') a,pg_roles b where (a.grantee=b.oid or a.grantee=0) and b.rolname='user1' group by a.datname,b.rolname;
# 清除逻辑复制槽
select t1.relname,t2.nodeoids from pg_class t1, pgxc_class t2, pg_namespace t3 where t1.relfilenode = t2.pcrelid and t1.relnamespace=t3.oid and t1.relname = 'p_table' and t3.nspname ='root';
# 删除逻辑复制槽
SELECT * FROM pg_drop_replication_slot('slot_dbm');
4.DRS链路逻辑复制槽命名规则
HCS场景:
复制槽名默认格式是 drs_nodeid ,其中nodeid中的中划线改成下划线。
举例:HCS环境下DRS创建的复制槽名为 drs_f9d5bed8_0ed8_4582_aa4f_7bee3c0bbd92,则对应的DRS任
务的nodeid是f9d5bed8-0ed8-4582-aa4f-7bee3c0bbd92,然后可以在运维面通过nodeid搜索对应任务。
轻量化场景:
复制槽名默认格式是 drs_taskid,其中taskid中的中划线改成下划线。
- 点赞
- 收藏
- 关注作者
评论(0)