Replication and Triggers
参考官网: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的更多相关文章
- mysql 触发器的创建和使用
什么是触发器 触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.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 ...
- How to remove replication in SyteLine V2
以前曾经写了一篇<How to remove replication in Syteline>http://www.cnblogs.com/insus/archive/2011/12/20 ...
- PostgreSQL Replication之第十四章 扩展与BDR
在这一章中,将向您介绍一个全新的技术,成为BDR.双向复制(BDR),在PostgreSQL的世界里,它绝对是一颗冉冉升起的新星.在不久的将来,许多新的东西将会被看到,并且人们可以期待一个蓬勃发展的项 ...
- MySQL5.6 Replication主从复制(读写分离) 配置完整版
MySQL5.6 Replication主从复制(读写分离) 配置完整版 MySQL5.6主从复制(读写分离)教程 1.MySQL5.6开始主从复制有两种方式: 基于日志(binlog): 基于GTI ...
- PostgreSQL Replication之扩展与BDR
在这一章中,将向您介绍一个全新的技术,成为BDR.双向复制(BDR),在PostgreSQL的世界里,它绝对是一颗冉冉升起的新星.在不久的将来,许多新的东西将会被看到,并且人们可以期待一个蓬勃发展的项 ...
- MySQL 5.6 GTID Replication
一. MySQL 5.6引入了GTID的概念,那么GTID是何方神圣?其实也不复杂,就是一个全局事务标示符.使用GTID时,每次事务提交都会在binlog里生成1个唯一的标示符,它由UUID和事务ID ...
- 牛刀小试MySQL--基于GTID的replication
实验环境:两个MySQL实例 IP地址:10.0.0.201 端口:3306 (MySQL的Master) IP地址:10.0.0.201 端口:3307 (MySQL的Slave) 需要的参数 se ...
- MySQL5.6 GTID Replication
MySQL 5.6 的新特性之一,是加入了全局事务 ID (Global Transaction ID) 来强化数据库的主备一致性,故障恢复,以及容错能力.官方文档:http://dev.mysql. ...
随机推荐
- Windows下Apache+PHP+MySQL开发环境的搭建(WAMP)
准备工作: 1.下载apache服务器安装包,官网http://www.apache.org/,下载地址:http://httpd.apache.org/download.cgi 2.下载MySQL, ...
- 初识react中的状态量
react组件中的两类状态数据:props,state,官网API给出的使用规范,多读几遍,受益匪浅: 结论: 1. 对应任何可变的数据,理应只有一个单一“ 数据源 ” 2. 如果多个组件均需要这些数 ...
- log日志应用 自定义的log
package com.kxd.utils; import java.util.Hashtable; import android.util.Log; /** * The class for prin ...
- 【R语言进行数据挖掘】决策树和随机森林
1.使用包party建立决策树 这一节学习使用包party里面的函数ctree()为数据集iris建立一个决策树.属性Sepal.Length(萼片长度).Sepal.Width(萼片宽度).Peta ...
- sql server Cannot resolve the collation conflict between "Chinese_PRC_BIN" and "Chinese_PRC_CI_AS" in the equal to operation
今天查询二个db,出现这个错误,二种方法,一种是把db里的collation改成一样的:如果不方便可以直接在sql语句后面转一下: select * from table where crm_mscr ...
- 【Linux】Ubuntu18.04镜像下载,新功能介绍
一.Ubuntu18.04镜像下载 官方下载地址:http://releases.ubuntu.com/18.04/ 官方64位iso下载地址:http://releases.ubuntu.com/1 ...
- Js自学学习-笔记6-8
<!-- 第6-7课笔记 --> <!-- for循环 for(条件1:判断:变化)其实就是if嵌套 while do for循环简化版 可以用do while swith case ...
- 设置section的距离
在ios7中使用group类型的tableview时,第一个section距离navigationbar的距离很大,不符合这边的设计图.使用 myTableView . sectionHeaderHe ...
- ios UITableViewCell重用问题
在写sina 微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用 ...
- asyn_fifo
//Module Name:afifo_ctrl //Description:parameterized afifo module afifo_ctrl( clk_push, rst_push_n, ...