更新时间:2024-04-11 GMT+08:00
为什么实时灾备任务不支持触发器(TRIGGER)和事件(EVENT)
数据库的触发器(TRIGGER)和事件(EVENT)操作会记录binlog,DRS通过解析binlog同步数据,如果业务侧写入与触发器、事件存在同样对象,就会发生重复执行导致数据不一致或者任务失败,所以在灾备场景下,触发器和事件是不支持的。
假如源库表user存在这样触发器,当表user写入数据时,触发器会同步往另一个log表中写入一条日志数据。
当源库业务侧写入了一条数据到user表。
触发器同步了这条数据到log表,此时binlog中会有两条数据,如下图,第一条就是业务插入user表的数据,第二条是触发器被触发,写入到log中的数据。
DRS同步数据的时候可能会出现以下情况:
- 如果先同步了插入的数据到目标库user表,这时候目标数据库的触发器被触发,目标库log表会自动写入,当同步第二条log表数据时,就无法将这条log表数据写到目标库了,数据冲突任务报错。
- 如果先同步log表中的数据,再同步user表的数据时,这时候目标数据库的触发器被触发,会导致log表多一条数据,发生数据不一致问题。
同理,事件(EVENT)也会记录binlog并在目标库再次执行,这也会导致上述问题。
DRS实时迁移支持触发器和事件,是因为DRS会在结束任务的时候去迁移触发器和事件,在结束任务成功的时候保证目标库和源库的对象一致。
父主题: 实时灾备