免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5218 | 回复: 3
打印 上一主题 下一主题

MySQL Replication中的Event Scheduler小结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-10 16:27 |只看该作者 |倒序浏览
技术背景:
    项目中,由于数据量很大,整个系统架构自身来实现"分区表", 基础数据系列表每天都生成一套表,而各类基础表创建,视图关系映射,
过期数据和表的清除都依赖于数据库的调度分别放在早上1点和3点运行,因为项目存在两个版本oracle 和MySQL, 前者依赖于oracle jobs, 后者依赖于
MySQL Event Scheduler. 对于MySQL版本的架构采用的是主从架构,而Event在MySQL Replication的过程中遇到一些小问题。


问题列表:
1, 注意当在slave不创建Event,但是如果Master 上的event时间到了,它们自动删除,而这个删除操作也会被记录到binlog中,
这样slave会出现错误,因为它不存在这个events. 如果手动删除events,则加上SET sql_log_bin =0;
2,  Event本身的schedule的设置,最好用字符串来表示时间,如果用now(),如果是两台server的时区不相同,那样就纠结了。
3,  Event在Replication中的运行策略,因为Event在Master上作的修改会被复制到Slave上,如果Slave 的Event再运行,这就会出问题的, 的有以下3种情况
   3.1  要运行的Event只在Master上创建,这种情况如果把slave提升为master时,要创建event.
        3.1.1 : 用set sql_log_bin=0, 这样创建event的sql就不会被记录到binlog中,不过,这样对于以后恢复有影响,所以这样做后,最好做个全备。
        3.1.2 : event会在slave上创建,但马上将其drop掉。有点笨的方法

   3.2 直接禁用Slave上的event, 在my.cnf配置 event_scheduler=0;  但是整个mysql 实例都不能运行event. 因为满足要求,我们项目就用的这个。
提升slave时,也方便,直接set global event_scheduler=ON便可,同时修改my.cnf.
   3.3 Event提供了一机制,创建的时候可以设置DISABLE ON SALVE, 其实这个值是默认,当我们用在slave上用show events查看时,在
Slave字段上显示的是DISABLE ON SALVE, 但是在Master上显示还是ENABLE。提升Slave为Master的时候,只要修改状态就可以了
后面会做测试。【个人觉得这种方式最优】


示例:演示上面3.3的处理方法
1 演示Master创建event, 同时Slave也会创建,但默认状态是DISABLE ON SALVE,所以Slave的event是不会执行的。

1.1 确认Master和Slave的event_scheduler=ON, 如果不是可执行set global event_scheduler =ON;
mysql> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
1 row in set (0.00 sec)

2 在测试数据库test中(可复制), 在Master上创建测试表test.t_event, 测试存储过程p_event.
在Master创建一个event: e_replication,用于调用p_event, 每次向t_event表中插入一条数据。
测试说明:如果Master和Slave的t_event表中的数据行数相同,则说明只有maser的event运行,slave的event没有运行。

2.1.1 创建event, 每一分钟执行一次event, 也就是每一分钟向t_event插入一数据
mysql> CREATE EVENT `e_replication` ON SCHEDULE EVERY 1 MINUTE STARTS sysdate() + interval 2 minute DO call p_events();
Query OK, 0 rows affected (0.00 sec)

2.1.2 查看Master上的e_replication创建情况, 可见已成功,且Status是ENABLED
mysql> show events\G
*************************** 1. row ***************************
Db: test
Name: e_replication
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: MINUTE
Starts: 2012-04-10 11:25:38
Ends: NULL
Status: ENABLED
1 row in set (0.00 sec)

2.1.3 查看Slave上的Event也因复制,创建成功,且状态Status是SLAVESIDE_DISABLED,说明默认不运行此Event.
mysql> show events\G
*************************** 1. row ***************************
                  Db: test
                Name: e_replication
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: MINUTE
              Starts: 2012-04-10 11:25:39
                Ends: NULL
              Status: SLAVESIDE_DISABLED
1 row in set (0.00 sec)

2.1.4 检测master和slave上的t_event是一样的,说明正常复制,且slave上的event没有运行,符合我们要求。
mysql> select * from t_event;
+----+---------------------+
| id | time |
+----+---------------------+
| 44 | 2012-04-10 11:25:38 |
| 45 | 2012-04-10 11:26:38 |
| 46 | 2012-04-10 11:27:38 |
| 47 | 2012-04-10 11:28:39 |
| 48 | 2012-04-10 11:29:38 |
+----+---------------------+
5 rows in set (0.00 sec)

mysql> select * from t_event;
+----+---------------------+
| id | time |
+----+---------------------+
| 44 | 2012-04-10 11:25:38 |
| 45 | 2012-04-10 11:26:38 |
| 46 | 2012-04-10 11:27:38 |
| 47 | 2012-04-10 11:28:39 |
| 48 | 2012-04-10 11:29:38 |
+----+---------------------+
5 rows in set (0.00 sec)

3 如果要把Slave提升为Master,这样就得修改Slave上的event的Status.

3.1为了方便测试先把Master上的e_replication事件drop.但此操作不被记录到binlog中,这样Slave上的event还是存在,但不运行
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

mysql> drop event e_replication;
Query OK, 0 rows affected (0.00 sec)

mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

3.2 修改slave上的e_replication为enable, 查看到已清空的t_event表中又有了数据,则数据slave上的event被“激活了”。
mysql> select * from t_event;
Empty set (0.00 sec)

mysql> alter event e_replication enable;
Query OK, 0 rows affected (0.00 sec)

//有数据了

mysql> select * from t_event;
+----+---------------------+
| id | time |
+----+---------------------+
| 90 | 2012-04-10 12:15:53 |
+----+---------------------+
1 row in set (0.00 sec)
// 可见Status从 Status: SLAVESIDE_DISABLED到 Status: ENABLED
mysql> show events\G                    
*************************** 1. row ***************************
                  Db: test
                Name: e_replication
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: MINUTE
              Starts: 2012-04-10 12:02:53
                Ends: NULL
              Status: ENABLED
1 row in set (0.00 sec)

mysql> select * from t_event;
+----+---------------------+
| id | time |
+----+---------------------+
| 90 | 2012-04-10 12:15:53 |
+----+---------------------+
1 row in set (0.00 sec)

评分

参与人数 2可用积分 +12 收起 理由
枫影谁用了 + 10 赞一个!
小版主杀手 + 2 很给力!

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2012-04-10 16:39 |只看该作者
good job!

论坛徽章:
0
3 [报告]
发表于 2012-04-11 13:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2012-04-11 13:49 |只看该作者
回复 3# kerlion
这个项目的db端处理的东西很多,当初就这样设置的。
另一个项目用过,第三方的qurartz,程序调度不错。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP