定时任务是我们开发、运维人员经常用到的,比如cron,job,schedule,events scheduler等都是为了方便我们重复执行某项工作而无需人工参与而设计,这里我要说的是MySQL数据库本身的定时任务,即events scheduler的风险案例。

一、现象描述

这里有一个从库出现数据不同步现象,具体报错如下:

             Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_SQL_Errno: 1032
Last_SQL_Error: Could not execute Delete_rows event on table bs.dg_sale; Can't find record in 'dg_sale', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000079, end_log_pos 159513315

这个现象出现是由于主键问题导致数据删除失败,进而引发数据同步错误。

二、原因分析

出现上述错误比较常见的是从库做了一些删除操作,然后数据同步的时候通过主键寻找条件删除的时候无法执行删除操作,进而导致主从错误。

通过对比主库数据和从库数据发现表数据记录数都是0,然后自增值不同,从库始终没有外部账户访问,这里就有点懵逼了吧?没错,还有一种情况可能导致从库被操作,那就是定时任务。通过排查发现,果然主库设有几个events事件,其中有个定时任务就设计到这个表的多次查询、删除、插入等操作。

正常情况下主库创建event schedule,从库自动的将event disable掉,如果切换需要手动enable event scheduler,如果搭建主从实现创建好的定时任务复制到从库,从库的scheduler可能会被激活,导致主从的scheduler都被执行。

三、处理过程

1.查看从库状态和错误代码信息。

2.检查主库、从库表数据信息、表结构信息。

show slave status \G

show create table  bs.dg_sale \G

select count(1) from bs.dg_sale;

3.分析产生错误的binlog信息。

主库:

show binlog events  in 'mysql-bin.000079' from 159512534 limit 10;

mysqlbinlog  --base64-output='decode-rows' --start-position=159512534 --stop-position=159512838 -vv  mysql-bin.000079 >binlog.txt

4.查看主库/从库events scheduler信息

show variables like 'event_scheduler';

show events;

select EVENT_SCHEMA,EVENT_NAME,STATUS ,EXECUTE_AT,INTERVAL_VALUE from events;

这里看到events scheduler

5.禁用从库的events scheduler

set global event_scheduler=0;或者在主创建的时候加入DISABLE ON SLAVE

在从库my.cnf配置文件中加入set global event_scheduler=0

6.重新完成数据同步

四、总结和知识扩展

含有scheduler事件的风险项:

1)主从切换的时候,新主库需要enable scheduler events

2)含有scheduler 的数据库搭建从库,需要特别注意从库的scheduler events需要被disable

1.创建mysql events scheduler

语法:

CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body; schedule:
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...] interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

实例:

CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;

2.删除mysql events scheduler

语法:

DROP EVENT [IF EXISTS] event_name

3.更改mysql events scheduler

语法:

ALTER
[DEFINER = { user | CURRENT_USER }]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
[DO event_body]

实例:

ALTER EVENT no_such_event
ON SCHEDULE
EVERY '2:3' DAY_HOUR;

五、案例回放测试

名称 主库 备库
IP地址 192.168.1.1 192.168.1.2
OS RHEL6.6 RHEL6.6
MySQL 5.7.21-20 5.7.21-20
     

 1.部署主从(略)

 2.检查主从scheduer是否开启(mysqladmin var |grep event_scheduler)

主:

从:

3.主库创建schedure相关信息

(root:localhost:Fri Jul 27 14:32:52 2018)[dbtest]>create table t(id int primary  key,name varchar(30));

CREATE EVENT ev_test
ON SCHEDULE EVERY 1 MINUTE STARTS '2018-07-27 15:58:00' ON COMPLETION PRESERVE ENABLE DO
BEGIN
insert into t values(1,'N1'),(2,'N2'),(3,'N3');
END

4.主从数据检查

show slave status \G

select * from t;

主从状态正常,数据正常。

这里发现并无异常,原因主从状态本身存在的情况下,在主库新建scheduler,从库的scheduler event会被默认设置为disable

主库:

(root:localhost:Fri Jul 27 16:29:12 2018)[dbtest]>show events;

从库:

(root:localhost:Fri Jul 27 16:29:49 2018)[dbtest]>show events;

5.调整从库的schedule为enable状态

(root:localhost:Fri Jul 27 16:31:37 2018)[dbtest]>alter event ev_test enable;
Query OK, 0 rows affected (0.00 sec)
此时从库的scheduer也会被执行,如果因为时间等原因的关系,从库先执行了scheduler events,主库再执行然后传输binlog到从库再次执行会导致主从数据不一致,进而导致复制失败,这也就是为什么含有scheduer event的主从架构需要特别注意的原因了。

MySQL案例08:MySQL Scheduler Events带来的风险的更多相关文章

  1. mysql案例~关于mysql的配置文件个人见解

    mysql 设置参数解读一  mysql的参数分为几类     1 session级别可以设置     2 global级别可以设置     3 session+global级别可以设置     4 ...

  2. mysql案例分析

    工作中,需要设计一个数据库存储,项目的需求大致如下: (1)对于每个用户,需要存储一个或多个库, 每个库, 由一个用户标识来标识,这里成为clientFlag. (2) 对于每一个库,结构如下: 1) ...

  3. MySQL案例-mysqld got signal 11

    背景:MySQL-5.7.12, debian 8核16G虚拟机, 业务方反馈在某一个时间点, 出现了大量的数据库报错, 之后恢复正常; 场景:开发查看日志后, 发现在某个时间点, 应用断开了所有与数 ...

  4. Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket

    https://blog.csdn.net/a123demi/article/details/78234023  : Springboot集成mybatis(mysql),mail,mongodb,c ...

  5. 【MySQL案例】error.log的Warning:If a crash happens thisconfiguration does not guarantee that the relay lo(转)

    标签: 1.1.1. If a crash happens thisconfiguration does not guarantee that the relay log info will be c ...

  6. python进阶08 MySQL基础补充

    python进阶08 MySQL基础补充 本次课程都是基于三张表格的使用 一.子查询 #如何找到‘张三’的成绩 #思路:先找到张三的学号,在拿这个张三的学号到成绩表里面去匹配,得出成绩 #如何用一条查 ...

  7. 【MySQL案例】error.log的Warning:If a crash happens thisconfiguration does not guarantee that the relay lo

    1.1.1. If a crash happens thisconfiguration does not guarantee that the relay log info will be consi ...

  8. MySQL AND 和 OR 联合使用带来的坑

    MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 M ...

  9. 【夯实Mysql基础】MySQL在Linux系统下配置文件及日志详解

    本文地址 分享提纲: 1. 概述 2. 详解配置文件 3. 详解日志 1.概述 MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下:在Linux下叫my.cnf,该文件位于 ...

随机推荐

  1. zepto中的touch库与fastclick

    1. touch库实现了什么和引入背景 click事件在移动端上会有 300ms 的延迟,同时因为需要 长按 , 双触击 等富交互,所以我们通常都会引入类似 zepto 这样的库.zepto 中tou ...

  2. Django model转字典的几种方法

    平常的开发过程中不免遇到需要把model转成字典的需求,尤其是现在流行前后端分离架构,Json格式几乎成了前后端之间数据交换的标准,这种model转dict的需求就更多了,本文介绍几种日常使用的方法以 ...

  3. Java NIO系列教程(五) 通道之间的数据传输

    在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. transferFro ...

  4. 几句话的事儿,LogBack急速使用

    1.说说logback 在java的世界里面好像从来只有log4j,因为它是在太有名气了.说实话,我也没觉得它那里不好,至少在我自己的项目里,它工作的好好的.但是主流有一种声音,在慢慢的放弃它,最始作 ...

  5. SQL - 先安装SQL2008 R2后安装AD导致无法正常登陆数据库(无法启动MSSQLSERVER)

    分析原因:安装AD后,系统改为使用域用户登陆,原先安装SQL时设置的“本地用户”信息已经修改,当前(域)用户没有权限访问MSSQLSERVER实例文件夹或整个SQL文件夹. 解决方法: 1.打开“服务 ...

  6. CentOS总结归纳之基本操作(linux系管与运维一)

    原创作品,转载请在文章明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10170009.html 使用命令关闭和重启系统: 一.条件:只有root用户才 ...

  7. C++基于范围的for循环性能测试(针对std::vector)

    1.代码如下: void output1(int x){ if (x == 10000000) { std::cout << x << std::endl; } }const ...

  8. EF Codefirst(二)数据注释

    CodeFirst通过分析我们在代码里编写的类,以及类之间的关系生成数据库表,以及表之间的各种关系.数据库的表会涉及到主键,外键,列是否为空,列类型等等. 我们要通过怎样的方式来暴露这些信息呢?   ...

  9. JavaScript中=、==、===以及!=、!==的区别与联系

    JavaScript中=.==.===以及!=.!==的区别与联系   在JavaScript中,“=”代表赋值操作:“==”先转换类型再比较,“===”先判断类型,如果不是同一类型直接为false. ...

  10. MRO + super面试题(详解)

    class Init(object): def __init__(self, v): print("init") self.val = v class Add2(Init): de ...