mysql触发器-表数据实时同步

Posted hkronline-syncnavigator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql触发器-表数据实时同步相关的知识,希望对你有一定的参考价值。

今天遇到一个需求,是同一个实例里面的两个库中的几张表需要做单向同步,刚开始想直接使用Otter&Canal的架构去做同步。但是因为这个架构依赖的是binlog进行同步的,但是阿里云RDS对于binlog是有做定时清理操作的。所以如果用canal去通过binlog同步的话 一旦RDS的binlog 清理了 将无法同步,并且无法找回之前的数据。所以考虑到只是同步极少数的表,就用了mysql的触发器。

mysql的触发器只支持行级触发器不支持语句级触发器,行级触发器又分为单行触发器以及多行触发器。

单行触发器类似于:

create trigger tri_name after insert|delete|update on table_name for each row trigger_sql

多行触发器类似于:
DELIMITER $
create trigger cif_ofs_supplier_attribute_Insert after insert
on cif.ofs_supplier_attribute for each row
begin
INSERT INTO ofs.ofs_supplier_attribute(id,supplier_id,common_flag,is_deleted,gmt_created,gmt_modified) VALUES(new.id,new.supplier_id,new.common_flag,new.is_deleted,new.gmt_created,new.gmt_modified)
END$;
DELIMITER ;

其中DELIMITER 定好结束符为”$$”, 然后最后又定义为”;”, MYSQL的默认结束符为”;”.   after 代表是在触发之后操作,before代表在触发之前操作

触发器语句中使用了两种特殊的表:old 表和 new 表

old 表用于存储 DELETE 和 UPDATE 语句所影响的行的副本,

在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。old 表和触发器表通常没有相同的行。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 new 表和触发器表中。new 表中的行是触发器表中新行的副本。

1.插入操作(Insert)

new表有数据,old表无数据

2.删除操作(Delete)

new表无数据,old表有数据

3.更新操作(Update)

new表有数据(新数据),old表有数据(旧数据)

表同步多行触发器例子:

inserted (插入):
DELIMITER $
create trigger cif_ofs_rel_supplier_role_Insert after insert
on cif.ofs_rel_supplier_role for each row
begin
INSERT INTO ofs.ofs_rel_supplier_role(id,supplier_id,role_code,is_deleted,gmt_created,gmt_modified) VALUES(new.id,new.supplier_id,new.role_code,new.is_deleted,new.gmt_created,new.gmt_modified);
END$;
DELIMITER ;

update(更新)
DELIMITER $
create trigger cif_ofs_rel_supplier_role_update after update
on cif.ofs_rel_supplier_role for each row
begin
update ofs.ofs_rel_supplier_role set id=new.id,supplier_id=new.supplier_id,role_code=new.role_code,is_deleted=new.is_deleted,gmt_created=new.gmt_created,gmt_modified=new.gmt_modified where id=old.id;
END$;
DELIMITER ;

delete(删除)
DELIMITER $
create trigger cif_ofs_rel_supplier_role_delete after delete
on cif.ofs_rel_supplier_role for each row
begin
delete from ofs.ofs_rel_supplier_role where id=old.id;
END$;
DELIMITER ;

 
查看触发器:
查看触发器方式有多种:

1.show triggers;

2.SELECT * FROM information_schema.`TRIGGERS`;

3.使用Navicat查看,选中对应的表 右键设计表结构 查看

 

删除触发器:
drop trigger trigger_name
---------------------
作者:噜噜噜的博客
来源:CSDN
原文:https://blog.csdn.net/qq_22543991/article/details/82344282
版权声明:本文为博主原创文章,转载请附上博文链接!

以上是关于mysql触发器-表数据实时同步的主要内容,如果未能解决你的问题,请参考以下文章

基于MYSQL触发器实现表间数据同步

MySQL触发器实现两表数据同步(详解)

MySQL创建触发器实现统一主机下两个数据库的表同步

Navicat写MySQL触发器,用来同步表

mysql中,怎么用触发器同步两个表?

mysql 触发器学习(可以将mysql数据同步到redis)