热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL5.6主从复制如何处理触发器,函数,存储过程,调度事件_MySQL

截图来自MySQL5.6的pdf版文档。说明:1)基于语句的复制时,trigger会在slave上执行,所以slave上也需要有trigger的定义,不然会导致主从数据不一致的;2)基于行的复制时,trigger不会在slave上执行。因

截图来自MySQL5.6的pdf版文档。

说明:

1)基于语句的复制时,trigger会在slave上执行,所以slave上也需要有trigger的定义,不然会导致主从数据不一致的;

2)基于行的复制时,trigger不会在slave上执行。因为复制的数据,不是sql语句。

截图来自MySQL5.6的pdf版文档。

说明:

基于行的复制时,存储过程,函数,触发器都只在master上执行,然后将执行之后的数据传给 slave 。不会将它们的sql语句发给slave. slave上看到的只有修改的行数据,不会有 存储过程、函数、触发器的调用语句。

截图来自MySQL5.6的pdf版文档。

说明:

说的基本和第一幅截图一样。

基于语句的复制,trigger会在master和slave上都执行。

基于行的复制,trigger只会在master上执行,然后将数据行传给slave. 因为如果基于行的复制,salve上也执行trigger的话,会导致执行两次,导致主从数据不一致。

截图来自MySQL5.6的pdf版文档。

说明:

1)对于存储过程,如果不是 确定性的,或者该存储过程不对数据进行修改,那么它就会导致在复制时,主从数据的不一致。这里指基于statement的复制。对于基于row的复制,不会导致主从不一致。

2. trigger 的局限:

carete trigger 语法:

Syntax:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

1)trigger 只能在表中的数据进行: insert, update, delete 时进行某种处理,也就是说他不能对表上的 DDL 语句进行某种处理!!!!

2)MySQL triggers activate only for changes made to tables by SQL statements. They do not activate for changes in views, nor by changes to tables made by APIs that do not transmit SQL statements to the MySQL Server. 通过视图修改和通过API修改的表的数据时,不会触发trigger

---------------------------------------- 分割线 ------------------------------------------------

下面的内容转自:http://www.linuxidc.com/Linux/2012-06/63141.htm

MySQL5.5 主从复制 (触发器,函数,存储引擎,事件处理)说明

mysql5.5 对触发器,函数,存储引擎,事件进行主从复制情况.

一、MySQL主从复制有三种模式.

1.binlog_format = row : 日志中会记录成每一行数据被修改的形式(记录页面),然后在 slave 端再对相同的数据进行修改。

2.binlog_format = statement : 每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。

3.binlog_format = mixed : 这个模式是在5.1.8版本之后, 才有的. mixed是row和statement的混合模式.

二、触发器的主从复制.

A .当binlog_format = statement 或 binlog_format = mixed (使用混合模式用的是statement 方式) 这种模式下复制情况

1. 主从复制的时候,主从触发器都受到definer从句的约束.只有主从上都有这个用户才能正常运行这个触发器.

2. 主服务器上SQL语句传到从服务器上,从服务器再执行SQL语句去触发从服务器的触发器(这里要说明是:主服务器不会把触发后的SQL传递给从服务器).

这里可以看到,传递是原始的SQL语句.

B .当binlog_format = row 或 binlog_format = mixed(使用混合模式用的是row方式) 这种模式下复制情况

1. 主服务器把被修改的页面复制给从服务器,并且这个修改的页面的值是触发后的改变值.

2. 因为这个页面的值是触发后改变的值, 所以在从服务器上可以不需要这个触发器.

3. 删除从服务器上的触发器.一样的可以得到跟主服务器一样的值.

三、存储过程的主从复制

1. 主服务器上的存储过程同样收到definer从句的约束.但是,在复制的时候,从服务上不需要有存储过程

A. 当binlog_format = statement 或binlog_format = mixed (使用混合模式用的是statement 方式) 这种模式下复制情况

可以看到通过系统函数转换后的值复制给从服务器,不需要在从服务器上建立。(注:其实这里是错误的!和文档中的明显不一致,参见最后的总结。)

B .当binlog_format = row 或 binlog_format = mixed(使用混合模式用的是row方式) 这种模式下复制情况(传的都是数据)

四、函数主从复制

A . 当binlog_format = statement 或binlog_format = mixed (使用混合模式用的是statement 方式) 这种模式下复制情况

1. 主从复制的时候,主从触发器都受到definer从句的约束.只有主从上都有这个用户才能正常运行这个函数

2. 主服务器上SQL语句复制从服务器上,从服务器再执行SQL语句再去调用从服务器的函数(主服务器不会把函数的返回值传给从服务器的)

B. 当binlog_format = row 或 binlog_format = mixed(使用混合模式用的是row方式) 这种模式下复制情况(传的都是数据)

1.主服务器会直接把修改过的页面复制给从服务器,从服务器不需要有对应的函数

五、事件主从复制

当事件有用函数,触发器,存储过程时.跟上面的操作情况是一样的.

但有一点不同的是.

在主服务器上建立一个event,当然,在从服务器上也会创建一个event..(默认情况下主event复制到从服务器的event是关闭着的)

1.主服务器上的event

2.从服务器上的event

如果在从服务器,开启事件.不仅主服务器复制过来的SQL语句执行一遍,从服务器上的EVENT也会执行.

===============分割线=============

总结:

MySQL5.6文档的说明和上面转帖的博文,说的是不太相符的。不相符的地方在 存储过程的说明上。我们还是应该以文档为准。博文毕竟良莠不齐。

在基于row的复制时:

不管是 存储过程,函数,还是触发器,都是将 执行之后的数据行,传给slave。slave上看到的都是数据,不会有它们的调用语句。slave上可以没有它们的定义。

在基于statement 的复制时:

1)存储过程、函数、触发器 都会在slave上执行。所以基于statement复制时,slave也必须有它们的定义。而且存储过程、函数必须是确定性的或者它们不修改表的数据。不然就会导致基于statement的复制,主从数据不一致。

2)存储过程和函数在定义时,有 确定性函数和非确定性函数的分别;比如 uuid(),md5()这些函数肯定都是非确定性函数,因为它们每次执行的值是不确定的。所以在master和slave上分别执行会导致数据不一致。所以在基于语句复制的环境中,函数都必须是 确定性的(DETERMINISTIC)。不然就只能采用row复制格式了。

3)在基于statement复制时,trigger中定义的sql语句在执行时,不会传给slave,而仅仅传调用trigger的语句本身。所以不会导致定义在trigger中的sql执行两次。也就是说不会既将调用trigger的语句传给slave,又将在trigger执行时,在trigger中运行的那些sql语句传给slave. 因为这样会导致那些 sql 执行两次。

4)上面存储过程、函数、触发器在复制时的区别,也说明了,基于row格式的复制要优于基于statement格式的复制,基于row的复制明显要健壮很多。

同时也说明:触发器、存储过程能不用最好就不要用了。

5)最后,虽然有文档的说明,实际使用时最好先通过自己的测试,来确认一下,到底 存储过程、函数、触发器是在基于statement的复制中是如何处理的。

基于row的复制,很定是没有问题的。最好是采用基于row的复制,最好不用触发器,存储过程,非确定性函数。

推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
author-avatar
罗丝012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有