zoukankan      html  css  js  c++  java
  • trigger、procedure和event如何同步

    最近遇到一个需求涉及存储过程,被突然问题到如何同步问题问到了,赶紧补课学习一下。

    首先,先看一下trigger、procedure和event的定义都是什么?

    trigger: 触发器是一个被指定关联到一个表的数据对象,当对个表的特别事件出现时,它被激活。

    procedure:是一组为了完成特定功能的SQL语句集。

    event:定时任务,类似Linux的crontab。

    其次,mysql的同步中可以设定不同的binlog_format,包括statment、row和mix。

    statment:语句级,记录原始SQL语句。

    row:行级,记录受到影响的行的真实修改情况。

    mix:上面两种的混合,基础使用语句级,当会导致数据不一致的时候会采用行格式。

    最后,分别在statement和row两种格式下,看看trigger、procedure和event是如何记录binlog的。

    1、statement+trigger

      binlog会把create trigger记录下来,并推给slave,然后记录正常的sql语句,不会记录trigger中的任何sql。

    2、row+trigger

      binlog会把create trigger记录下来,然后会将正常的sql和trigger的sql的所有执行结果记录下来,并推送给slave。

    3、statement+procedure

      binlog中会把create procedure记录下来,然后不会记录call语句,而是将procedu中的sql用语句级记录下来,推送给slave。

    4、row+procedure

      binlog会将create procedure记录下来,然后不会记录call procedure,而是会把所有执行的记过记录在binlog中,然后推送给slave。

    5、statement+event

      binlog会将create event记录下来,并会将event中的操作记录成语句级,推送给slave。

    6、row+event

      binlog会将create event记录下来,并将event中的所有操作按照行格式记录下来,推送给slave。

    这期间的问题:

    1、由于create都是语句级的,从库会自动更改binlog_format。

    2、从库如果binlog_format是statement但是主库是row的话,同步会报错,需要将从库也改成row才会恢复。

    以上这2点很容易造成同步中断,故不建议在mysql中使用以上3种设置,如果要用最好使用statement格式。

  • 相关阅读:
    从验证谈起
    今天感触
    弱点
    经济平衡一些看法
    关于灵魂
    关于博弈论中的一硬币正反问题的分析<二>
    java8新特性:对map集合排序
    junit单元测试不通过报documentationPluginsBootstrapper相关异常
    Maven打包报错:[WARNING] The POM for xxx is missing, no dependency inform
    理解maven命令package、install、deploy的联系与区别
  • 原文地址:https://www.cnblogs.com/billyxp/p/3675811.html
Copyright © 2011-2022 走看看