暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

中电科金仓KFS支持禁用会话级触发器功能介绍与配置使用说明

原创 KFS补给站 2024-10-29
291

关键字:

KingbaseFlySync、KFS、同步程序、replicator、禁用会话级触发器

1.功能描述

禁用会话级触发器参数主要通过禁止KFS插入的数据(搬迁、同步、比对修复)触发目标端触发器,而不是通过关掉目标端的所有触发器来禁止触发目标端触发器。同时,该参数为全局参数,但是仅对目标端生效。

2.使用场景介绍

用于不能直接关掉目标端所有触发器的情况下。

3.配置使用方式及触发器禁用原理介绍

(1)配置使用方法
在目标端flysync.ini文件中添加以下参数:

property=replicator.session.enable.trigger=false

其中,false表示禁止通过KFS插入的数据触发目标端触发器,反之则为true
注:该参数只适用于目标端(slave)。

(2)触发器禁用原理
对于KES,触发器禁用原理如下:
① 首先,获取某个模式下带有触发器的表名,具体sql语句如下:

SELECT DISTINCT c.relname AS tablename FROM sys_class c
     JOIN sys_trigger tg ON c.oid = tg.tgrelid
     LEFT JOIN sys_description des ON tg.oid = des.objoid
     JOIN sys_namespace n ON n.oid = c.relnamespace
     FULL JOIN sys_proc pr ON tg.tgfoid = pr.oid
  WHERE (
    des.objoid IS NULL OR des.classoid = (
      ( 
        SELECT sys_class.oid
        FROM sys_class
        WHERE sys_class.relname = 'sys_trigger'))
  ) AND (c.relkind IN ('r', 'v', 'm', 'f', 'p')) and n.nspname='模式名';

② 然后,根据模式名.表名找到触发器名,具体sql语句如下;

SELECT tgname FROM pg_trigger WHERE tgrelid = ( SELECT pc.oid  FROM pg_class pc left join pg_namespace pn on pc.relnamespace = pn.oid 
               where pn.nspname = '模式名' and pc.relname= '表名') and tgisinternal is false;

③ 最后,执行禁用触发器sql:

ALTER TABLE 模式名.表名 DISABLE TRIGGER 触发器名

4.示例

4.1 前置条件

1.环境介绍:
图片.png

  • 数据库版本:V009R001C002B0011
  • 同步服务版本:V002R002B20240914

2.目标要求:
源端和目标端所创数据库、模式、表名、触发器如下:

源端 目标端
数据库 sourcedb targetdb
模式名 test04 test04
表名 yt08 yt08
触发器 zzz01 zzz01
同步服务名 kes_mysql_master_02 kes_mysql_slave_02

要求:禁止通过KFS插入的数据触发目标端触发器zzz01。

4.2 操作步骤

1.停止目标端同步程序(本说明默认前提是开启了同步服务)
图片.png

2.在flysync.ini文件中添加禁用会话级触发器参数:
property=replicator.session.enable.trigger=false

3.更新目标端同步服务:
图片.png

4.启动目标端同步程序
图片.png

查看目标端同步服务是否启动。如下图所示表示目标端同步服务已成功启动:
图片.png

5.在源端sourcedb数据库下创建模式test04,并查看目标端是否同步。sql语句如下:
create schema test04;

6.在源端test04模式下创建表yt08,并查看目标端是否同步。sql语句如下:
create table test04.yt08(id int);

7.在源端创建触发器zzz01,触发条件为insert,触发内容为在test04模式下创建表yt09。并查看目标端是否同步创建触发器zzz01。sql语句如下:

\set SQLTERM / 
create trigger zzz01
before insert on yt08
for each row
as
begin
     create table test04.yt09(id int);
end;
/
\set SQLTERM ;   

8.查询源端触发器zzz01是否创建成功,且目标端是否同步创建:

图片.png
图片.png
9.在源端表yt08中插入数据547,sql语句如下:
insert into yt08 values(547);

10.查看源端和目标端test04模式下的表yt08是否同步插入数据547,源端是否成功触发触发器zzz01创建表yt09,目标端是否未触发触发器zzz01重复创建表yt09导致同步服务报错。

4.3 结果展示

1.源端和目标端表yt08同步插入数据547后,结果查询如下:
(1)源端
图片.png
(2)目标端
图片.png

2.源端插入数据547后触发触发器zzz01,创建表yt09,结果查询如下:
图片.png
3.目标端同步创建表yt09,结果查询如下:
图片.png
4.源端和目标端同步服务状态:
(1)源端:状态正常,未报错
图片.png
(2)目标端:状态正常,未报错
图片.png
以上结果说明,目标端触发器zzz01被成功禁用,没有重复创建表yt09导致目标端同步服务报错。

5.源端如下:
图片.png
可以看到触发器zzz01被成功触发,成功创建表yt09。

补:
若目标端flysync.ini文件中未添加禁用会话级触发器参数,由于源端对表yt08插入数据后触发了触发器zzz01,创建了表yt09,且同步到目标端,此时目标端会因同步源端插入数据触发触发器zzz01,进而重复创建表yt09,导致目标端同步服务报错,报错信息如下:

图片.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论