关键字:
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.环境介绍:

- 数据库版本:V009R001C002B0011
- 同步服务版本:V002R002B20240914
2.目标要求:
源端和目标端所创数据库、模式、表名、触发器如下:
| 源端 | 目标端 | |
|---|---|---|
| 数据库 | sourcedb | targetdb |
| 模式名 | test04 | test04 |
| 表名 | yt08 | yt08 |
| 触发器 | zzz01 | zzz01 |
| 同步服务名 | kes_mysql_master_02 | kes_mysql_slave_02 |
要求:禁止通过KFS插入的数据触发目标端触发器zzz01。
4.2 操作步骤
1.停止目标端同步程序(本说明默认前提是开启了同步服务)

2.在flysync.ini文件中添加禁用会话级触发器参数:
property=replicator.session.enable.trigger=false
3.更新目标端同步服务:

4.启动目标端同步程序

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

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是否创建成功,且目标端是否同步创建:


9.在源端表yt08中插入数据547,sql语句如下:
insert into yt08 values(547);
10.查看源端和目标端test04模式下的表yt08是否同步插入数据547,源端是否成功触发触发器zzz01创建表yt09,目标端是否未触发触发器zzz01重复创建表yt09导致同步服务报错。
4.3 结果展示
1.源端和目标端表yt08同步插入数据547后,结果查询如下:
(1)源端

(2)目标端

2.源端插入数据547后触发触发器zzz01,创建表yt09,结果查询如下:

3.目标端同步创建表yt09,结果查询如下:

4.源端和目标端同步服务状态:
(1)源端:状态正常,未报错

(2)目标端:状态正常,未报错

以上结果说明,目标端触发器zzz01被成功禁用,没有重复创建表yt09导致目标端同步服务报错。
5.源端如下:

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





