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. ...
随机推荐
- zuul filter
前言 过滤器是Zuul的核心组件,这篇文章我们来详细讨论Zuul的过滤器.下面话不多说,来看看详细的介绍吧. 过滤器类型与请求生命周期 Zuul大部分功能都是通过过滤器来实现的.Zuul中定义了四种标 ...
- cookie和session基础以及在Django中应用
看了会视频,终于搞懂了~ 1.cookie cookie:保存状态 cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上cookie,这样服务器 ...
- let和const注意点
let 一.块级作用域 下面的代码如果使用var,最后输出的是10. var a = []; for (var i = 0; i < 10; i++) { a[i] = function () ...
- HTTP/1.1 持久连接 persistent connection
首先:HTTP的长连接和短连接本质上是TCP长连接和短连接. 1. 在HTTP1.0中,默认的是短连接,没有正式规定 Connection:Keep-alive 操作:在HTTP1.1中所有连接都是K ...
- 在eclipse中查看你用的tomcat的路径
在eclipse中查看你用的tomcat的路径 打开eclipse,选择window->Preferences->Server->Runtime Environments选择你的 ...
- leetcode 127 单词接龙
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换过程中的中 ...
- Java使用HtmlUnit抓取js渲染页面
需求: 需要采集js渲染的页面,有些网站的页面是js渲染的 实现: 基于HtmlUnit实现: public static void getAjaxPage() throws Exception{ W ...
- Spring @Transactional at interface
java - Where should I put @Transactional annotation: at an interface definition or at an implementin ...
- Java poi 的使用
poi可操作老旧版本的excel 下载jar包,http://archive.apache.org/dist/poi/release/bin/poi-bin-3.17-20170915.tar.gz ...
- 爬虫_python3_requests_2
pip install requests 进行简单的操作 发送一个get请求 # 发送请求 import requests response = requests.get('http://httpbi ...