参考官网:https://dev.mysql.com/doc/refman/5.7/en/replication-features-triggers.html

需要了解复制和触发器关系的背景:

程序变更的数据和账单对不上,但从程序上无法找到问题,于是开发人员想在数据库层记录通过触发器来记录每次变更的历史数据和新数据

创建触发器的语句

# 原始表t1
# 创建存储变更信息的表_trigger_t1,将去除AUTO_INCREMENT和自增键,因为每条信息都会变更很多次对应的同一主键值记录会插入多次;每个表只能有一个自增列且自增列是唯一键
CREATE TABLE `_trigger_t1` (
`id` int(20) unsigned NOT NULL ,
`col` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_col` (`col`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

# 记录最原始的记录
insert into _trigger_t1 select * from t1;
# 对新表添加自增列
alter table t1 ADD _record_id INT AUTO_INCREMENT PRIMARY KEY
FIRST;
#添加标识列
ALTER TABLE _trigger_t1 ADD _changeSign VARCHAR(20); #1 增加 2 修改 3删除
#添加变更时间
ALTER TABLE _trigger_t1 ADD _add_time DATETIME;
# 创建存储器
DELIMITER $$
CREATE TRIGGER tr_t1_delete AFTER DELETE
ON t1
FOR EACH ROW BEGIN
UPDATE _trigger_t1
SET _changeSign='delete',_add_time=CURRENT_TIMESTAMP()
WHERE id=old.id;
END$$
DELIMITER ; DELIMITER $$
CREATE TRIGGER tr_t1_update AFTER UPDATE
ON t1
FOR EACH ROW BEGIN
INSERT INTO _trigger_t1
(
`id`,
`col`,
`_changeSign`,
`_add_time`
)
VALUES
(
NEW.`id`,
NEW.`col`,
'update' ,CURRENT_TIMESTAMP()
);
END$$
DELIMITER ; CREATE TRIGGER tr_t1_insert AFTER INSERT
ON t1
FOR EACH ROW BEGIN
INSERT _trigger_t1
(
`id`,
`col`,
`_changeSign`,
`_add_time`
)
VALUES
(
NEW.`id`,
NEW.`col`,
'insert' ,CURRENT_TIMESTAMP()
);
END$$
DELIMITER ;

问题总结:

1、复制如果基于row模式,则在trigger在slave上失效,因为如果不这样设计,同一变更操作在master上记录一次等到复制到从库时在从库上又触发一次就会记录两次。

2、此次涉及的业务表较大,都是百万级别,共涉及到4张表,每个表上3个触发器,而且其中有的表上有外键约束,就导致每次变更原表时,速度慢了很多,后来就只能再删除触发器

3、一开始执行时建表错误,但trigger创建成果,这时候如果原表上变更记录就会调用触发器失败,以为触发器中的语句块中使用到的表不存在,从而导致变更原表失败

  这个影响很大,所以在变更前一定要先预估影响范围

Replication and Triggers的更多相关文章

  1. mysql 触发器的创建和使用

    什么是触发器 触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.2版本开始支持.该对象与编程语言中的函数非常类似,都需要声明.执行等.但是触发器的执行不是由程序调用,也不是由手工启动,而 ...

  2. How to create/restore a slave using GTID replication in MySQL 5.6

    MySQL 5.6 is GA! Now we have new things to play with and in my personal opinion the most interesting ...

  3. How to remove replication in SyteLine V2

    以前曾经写了一篇<How to remove replication in Syteline>http://www.cnblogs.com/insus/archive/2011/12/20 ...

  4. PostgreSQL Replication之第十四章 扩展与BDR

    在这一章中,将向您介绍一个全新的技术,成为BDR.双向复制(BDR),在PostgreSQL的世界里,它绝对是一颗冉冉升起的新星.在不久的将来,许多新的东西将会被看到,并且人们可以期待一个蓬勃发展的项 ...

  5. MySQL5.6 Replication主从复制(读写分离) 配置完整版

    MySQL5.6 Replication主从复制(读写分离) 配置完整版 MySQL5.6主从复制(读写分离)教程 1.MySQL5.6开始主从复制有两种方式: 基于日志(binlog): 基于GTI ...

  6. PostgreSQL Replication之扩展与BDR

    在这一章中,将向您介绍一个全新的技术,成为BDR.双向复制(BDR),在PostgreSQL的世界里,它绝对是一颗冉冉升起的新星.在不久的将来,许多新的东西将会被看到,并且人们可以期待一个蓬勃发展的项 ...

  7. MySQL 5.6 GTID Replication

    一. MySQL 5.6引入了GTID的概念,那么GTID是何方神圣?其实也不复杂,就是一个全局事务标示符.使用GTID时,每次事务提交都会在binlog里生成1个唯一的标示符,它由UUID和事务ID ...

  8. 牛刀小试MySQL--基于GTID的replication

    实验环境:两个MySQL实例 IP地址:10.0.0.201 端口:3306 (MySQL的Master) IP地址:10.0.0.201 端口:3307 (MySQL的Slave) 需要的参数 se ...

  9. MySQL5.6 GTID Replication

    MySQL 5.6 的新特性之一,是加入了全局事务 ID (Global Transaction ID) 来强化数据库的主备一致性,故障恢复,以及容错能力.官方文档:http://dev.mysql. ...

随机推荐

  1. poj2823滑动窗口

    这个是单调队列的入门题目.值得注意的一点是队列中的数的index是单调递增的,所以从队首删除的时候从前向后循环找到第一个index满足>= i - k + 1条件的元素作为队首元素就可以了,这也 ...

  2. sql创建作业--自动执行存储过程

    创建自动执行存储过程: 1.创建参数 2.删除已有同名的作业 3. 创建作业 4.创建作业步骤 5.连接服务器 6.创建作业调度 7.启动作业 ALTER PROCEDURE dbo.sx_pro_A ...

  3. spring 上传附件

    jsp: <form class='uk-form' action="savelead" method="post" enctype="mult ...

  4. codevs 1992 聚会

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 小S 想要从某地出发去同学k的家中参加一个party,但要有去有回.他想让所用的 ...

  5. (一)maven之创建一个maven项目

    为什么要使用Maven? 1.  maven使用的是本地仓库存储jar,所有项目都会共用仓库中的同一份jar. 2.  Spring core.jar必须同时引用版本兼容的common-logging ...

  6. navicate与mysql连接的中文乱码问题

    1. 在navicate中查看 show variables like'char%'; show variables like 'collation_%'; 2.在mysql中查看 通过对比可以发现两 ...

  7. openstack安装dashboard后访问horizon出错 End of script output before headers: django.wsgi

    在配置文件中增加如下的一句解决问题 /etc/apache2/conf-available/openstack-dashboard.conf WSGIApplicationGroup %{GLOBAL ...

  8. 关于ubuntu终端全屏的时候不能显示底部

    最近在win7的电脑上装了ubuntu,也就是双系统.打算之后工作就直接进入ubuntu,减少之前win7和虚拟机之间的切换.进入ubuntu后,发现一个奇怪的问题是,在终端全屏的时候,底部总是有几行 ...

  9. websocket 入门

    什么是websocket WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器. 为什么会出现 webs ...

  10. mysql dump 参数大全

    Mysqldump参数大全   摘自:https://www.cnblogs.com/qq78292959/p/3637135.html 参数 参数说明 --all-databases  , -A 导 ...