参考官网: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. Symbol.iterator 和 for of

    Symbol.iterator 和 for of 是es6的新特性 可以为对象设置 自己的迭代器 首先介绍我们的for of var arr = [1,2,3,8,33] for (var i of ...

  2. poj1717

    两次记忆化搜索,第一次找最小的gap,第二次找最少的次数. #include <iostream> #include <cstdio> #include <cstring ...

  3. php后端程序开发学习网站梳理

    博主只列举自己经常用到的: 看教学视频:慕课网,网易云课堂,百度传课 看博文和知识点:csdn 看源码:github 刷题:codewars 学习框架:thinkphp官网 下载相关资源:csdn 看 ...

  4. Random-数组

    1.能够使用Random生成随机数     1)import java.util.Random;         2)Random r = new Random();       3)r.nextIn ...

  5. arcgis jsapi接口入门系列(3):各种类型的图层添加

    这里说的tomcat切片,是指arcgis server切片后,把切片图片文件用tomcat发布(其他任意web服务器发布都行) //添加tomcat切片图层 addTomcatTileLayer: ...

  6. OpenCV中CvMat的初始化[转]

    一)cvCreateMat创建和分配数据CvCreateMat会创建CvMat,并为CvMat分配数据.cvCreateMat可以配合cvInitMatHeader来初始化CvMat对象.因为CvCr ...

  7. 更改shell

    chsh -s /usr/local/bin/bash  #更改自己的shell为bash

  8. Windwos下安装和使用MongoDB

    1)下载安装包下载路径:https://www.mongodb.com/download-center#community包名称:mongodb-win32-x86_64-3.4.10-signed. ...

  9. HDU 3033 I love sneakers! 我爱运动鞋 (分组背包+01背包,变形)

    题意: 有n<=100双鞋子,分别属于一个牌子,共k<=10个牌子.现有m<=10000钱,问每个牌子至少挑1双,能获得的最大价值是多少? 思路: 分组背包的变形,变成了相反的,每组 ...

  10. WPF中播放视频音频

    首先要在WPF中播放视频和音频,我们就需要用到MediaElement控件,下面我们示例播放音频和视频. 用MediaElement播放音频: 第一步:将你需要播放的音频(mp3)放在你WPF项目的D ...