一、背景

我们MySQL的表A的数据量已经达到1.6亿,由于一些历史原因,需要把表A的数据转移到一个新表B,但是因为这是线上产品,所以宕机时间需要尽量的短,在不影响数据持续入库的情况下,我希望能通过作业(定时器Events)的形式慢慢搬迁这些数据。

在MySQL作业的执行过程中有一个问题是让人比较郁闷的,就是如果频率很快,快到作业还没有执行完成的话,作业就会被重复执行,这点跟SQL Server的不一样的,如果想达到类似SQL Server作业的串行效果,只有当作业执行完毕,下一个迭代才会开始。后来经过一些设计可以解决了MySQL作业重复执行的问题,你可以参考:MySQL表数据迁移自动化

二、使用过程

(一)  查看当前是否已开启事件计划(调度器)有3种方法:

1)     SHOW VARIABLES LIKE 'event_scheduler';

2)     SELECT @@event_scheduler;

3)     SHOW PROCESSLIST;

(二)  开启事件计划(调度器)开关有4种方法:

1)     SET GLOBAL event_scheduler = 1;

2)     SET @@global.event_scheduler = 1;

3)     SET GLOBAL event_scheduler = ON;

4)     SET @@global.event_scheduler = ON;

键值1或者ON表示开启;0或者OFF表示关闭;

提醒:虽然这里用set global event_scheduler = on语句开启了事件,但是每次重启电脑。或重启mysql服务后,会发现,事件自动关闭(event_scheduler=OFF),所以想让事件一直保持开启,最好修改配置文件,让mysql服务启动的时候开启时间,只需要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 即可,如下:

(三)  关于事件计划的权限:

单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。Event权限的设置保存在mysql.user表和mysql.db表的Event_priv字段中。(FLUSH PRIVILEGES;)

当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。

SELECT HOST,USER,Event_priv FROM mysql.user;

(Figure1:user表的Event_priv权限)

获取当前登陆的用户和数据库:SELECT CURRENT_USER(), SCHEMA();

从Figure1可以知道bfsql@%是没有Event_priv权限的,在该用户下创建事件的时候会出现下面的错误:

Error Code: 1044

Access denied for user 'bfsql'@'%' to database 'blog'

如果出现上面的错误,执行下面的SQL就可以给bfsql@%赋予创建Event的权限:

UPDATE mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='bfsql';

如果你这个时候再次执行创建Event的SQL,还是会出现上面的错误,因为你需要执行:

FLUSH PRIVILEGES;最后,你可以通过SHOW GRANTS FOR 'bfsql'@'%';查看所有权限;

(四)  创建事件:

1)     创建事件的语法如下:

CREATE EVENT [IF NOT EXISTS] event_name

ON SCHEDULE schedule

[ON COMPLETION [NOT] PRESERVE]

[ENABLE | DISABLE]

[COMMENT 'comment']

DO sql_statement

2)     创建事件的示例如下:

DELIMITER $$

CREATE EVENT IF NOT EXISTS e_blog

ON SCHEDULE EVERY 30 SECOND #每隔30秒执行一次

#ON SCHEDULE AT '2016-01-17 15:30:00' ON COMPLETION NOT PRESERVE ENABLE DO #特定时间执行

ON COMPLETION PRESERVE

DO BEGIN

CALL MoveBlogData();

END$$

DELIMITER ;

DO sql_statement字段表示该event需要执行的SQL语句或存储过程。这里的SQL语句可以是复合语句,使用BEGIN和END标识符将复合SQL语句按照执行顺序放在之间。

(五)  事件开启与关闭:

开启某事件:ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE;

关闭某事件:ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE;

三、其它知识点

对于我们线上环境来说,使用event时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得将新主库上的定时器打开。

四、参考文献

mysql events_mysql定时器Events相关推荐

  1. mysql添加定时器

    今天做项目的时候做一个签到,设了一个键判断是否签到.然后想到用mysql的定时器进行0点清零. 需要mysql5.1支持  select version(); 然后开始添加储存过程. delimite ...

  2. mysql 创建定时器

    mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job.废话少说,下面创建表: create table mytable ( id int auto_incremen ...

  3. 19、mysql中定时器的创建和使用

    mysql中可以使用定时器,用来进行计划的调度,在mysql中定时器通过事件的形式存在,接下来介绍一下定时器的使用 创建定时器 CREATE EVENT IF NOT EXISTS 计划名-- 计划频 ...

  4. mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

    为什么80%的码农都做不了架构师?>>>    由于项目需要创建定时器(evevt),所以就百度了一下,发现基本都是来源于一个模板,有些功能还不全,现在自己总结一下. 注:mysql ...

  5. mysql开启定时器_MySQL定时器开启、调用实现代码

    创建测试表 复制代码 代码如下: CREATE TABLE t ( v VARCHAR(100) NOT NULL ) ENGINE INNODB DEFAULT CHARSET=utf8; 创建定时 ...

  6. MySQL show binlog events命令查看binlog日志内容

    格式:show binlog events [IN 'log_name'] [FROM pos] [LIMIT offset, count] log_name:指定某个binlog文件名.也可以不指定 ...

  7. Navicat for MySQL工具创建mysql数据库定时器

    步骤1: 步骤二: 效果图:

  8. 【MySQL】玩转定时器

    1.前置条件,你需要将服务器和mysql的时间都设置成东八区,php.ini和my.cnf配置(参考上篇文章) 2.进入mysql客户端,推荐Navicat for mysql 3.首先查看是否开启了 ...

  9. mysql 定时器停止_mysql事件【定时器】

    1.创建一张表 1 create tablemytable (2 id int auto_increment not null,3 name varchar(100) not null default ...

最新文章

  1. 贪心 ---- 2020牛客多校第3场[Clam and Fish+贪心]
  2. [Android ] linux命令英文缩写的含义(方便记忆)
  3. c语言strcpy错误,C语言中的Printf和Strcpy错误。
  4. Ubuntu 16.04卸载一些不必要的预装软件
  5. leetcode270. 最接近的二叉搜索树值
  6. 集合竞价选股(附源码)
  7. 创建专属聊天室练习(客户端与服务端通信|客户端界面交互)
  8. 直播预告| 基于神经网络模型的开放领域对话系统研究
  9. JS设计模式 - 工厂模式
  10. Matlab coder生成C++代码
  11. ACM—数论—费马大定理 (数学史上著名的定理)
  12. 金蝶K3开发-工业单据显示物料图片
  13. iOS调用系统通讯录获取姓名电话号码
  14. 美通企业日报 | 无锡国际生命科学创新园开园;本特勒与恒大汽车博世实现合作...
  15. Launcher进程启动流程
  16. 数据通信网络的基本概念
  17. sha256加密时报错 [TMA] Error: input is invalid type
  18. (附源码)python+mysql+基于python的学生成绩管理系统 毕业设计071143
  19. 数字化转型巨浪拍岸,成长型企业如何“渡河”?
  20. ad19pcb设置恢复默认_电脑主板BIOS设置详解BIOS知识大全

热门文章

  1. raft算法mysql主从复制_Raft算法赏析
  2. 【程序人生】不想一辈子做底层码农?快来看看这十条箴言
  3. 【PAT笔记】PAT中的散列思想
  4. Java 必知必会的 20 种常用类库和 API
  5. 更新代码到gitlab上
  6. HTTP Status 405 - HTTP method POST is not supported by this URL
  7. struts2自定义拦截器并配置拦截器使其生效
  8. UML图系列——用例图
  9. Elasticsearch之type底层结构及弃用原因
  10. 微信二维码支付快速入门