MySQL 使用事件(Events)完成计划任务(MySQL 使用事件Events完成计划任务)
MySQL 使用事件
MySQL 使用事件Events完成计划任务事件可以指定单次或以一定的间隔执行 sql 代码。通常是将复杂的 sql 语句使用存储过程封装好,然后周期性地调用存储过程完成一定的任务。
事件无需建立服务端连接,而是通过一个独立的事件调度器线程完成初始化。事件没有输入参数也没有返回值,这是因为没有连接也就不存在输入和输出了。启用后,可以通过服务端日志查看执行的指令,但是很难知道具体来自哪个事件。也可以查询 information_schema.events 表了解事件的状态,例如最近一次执行的时间。
与存储过程类似,事件也需要考虑类似的问题。首先,事件增加了 mysql 服务端额外的工作。虽然事件本身的负荷很小,但是事件调用的 sql 语句可能对性能产生严重的影响。另外,事件也会有存储过程那样基于语句的复制带来的那一类问题。事件比较好的应用是做诸如周期性的维护任务、重建缓存、数据统计、保存监测和诊断的状态值等任务。
下面的例子创建了一个事件,调用存储过程每周对指定的数据库运行数据表优化:
|
create event optimize_somedb on schedule every 1 week do call optimize_tables( 'somedb' ); |
可以指定事件是否需要重复执行。在某些情况下是没问题的,但是有些情况则不行。以上面的例子为例,你也许是想在所有的副本上运行 optimize table 指令。但是,需要知道的是如果是全部副本都同时执行这个操作的话,这会影响整个服务端性能(例如锁表)。 而且,周期性事件可能会花很长事件才能完成,甚至有可能下一个事件还没结束新的事件就又开始执行了。mysql 不会阻止这样的情况,因此需要自己写代码实现相同任务的互斥。可以使用加锁的方式达到这一目的:
|
create event optimize_somedb on schedule every 1 week do begin declare continue handler for sqlexception begin end ; if get_lock( 'somedb' , 0) then do call optimize_tables( 'some_db' ); end if; do release_lock( 'somedb' ); end |
看起来“多余”的 continue handler 可以保证即便是发生了异常也会释放锁。
虽然事件与连接无关,但是却是与线程有关的。mysql 服务端有一个主事件调度线程,可以通过在服务端配置中开启:
|
set global event_handler := 1; |
一旦启用,这个线程会执行指定调度的事件。可以通过查看服务端的错误日志来了解事件执行的信息。
虽然事件调度器是单线程的,但是事件本身是可以并发执行的。每次事件执行的时候服务端会创建新的进程。在事件内部,可以调用 connection_id()获取一个唯一的值(虽然实际没有连接),实际返回的就是线程 id。进程和线程在事件执行完后会销毁。可以通过 show processlist 查看,在 command 列中会显示为 connect。
虽然,进程创建了实际执行事件的线程,但线程在事件完成后会销毁,并不会放入缓存中,因此 threads_created 这个状态计数器并不会看到增加。
结语:事件与应用程序、或操作系统级的定时任务相比,由于没有了 sql 连接建立的过程,因此效率会更高,而且开销不大。适用于需要周期性运行的 sql 脚本任务,例如数据表优化、生成统计报表数据等等。但是,需要注意,事件本身可能存在并发问题,这个可以通过加锁解决。同时,如果事件需要重复执行,最好是不要执行过于复杂耗时的任务。
以上就是mysql 使用事件(events)完成计划任务的详细内容,更多关于mysql 用事件完成计划任务的资料请关注开心学习网其它相关文章!
原文链接:https://juejin.cn/post/6964969494766682143
- mysql自增长语句(mysql实现自增序列的示例代码)
- mysql server安装图解教程(mysql容器之间的replication配置实例详解)
- mysql多核cpu利用(mysql CPU高负载问题排查)
- mysql存储json的方式(MySQL中查询json格式的字段实例详解)
- linux系统登录mysql数据库(Linux手动部署远程的mysql数据库的方法详解)
- deepin数据库编程(deepin20.1系统安装MySQL8.0.23超详细的MySQL8安装教程)
- 图片如何存放在mysql中(将图片保存到mysql数据库并展示在前端页面的实现代码)
- 宝塔mysql怎么设置优化(宝塔面板mysql内存占用高如何优化)
- mysqlnull所占空间(详解mysql三值逻辑与NULL)
- mysql中date_format日期格式化
- mysql 安装阿里云(详解如何在阿里云服务器安装Mysql数据库)
- centos7可以装mysql吗(详解腾讯云CentOS7.0使用yum安装mysql及使用遇到的问题)
- windows 安装解压版 mysql5.7.28 winx64的详细教程(windows 安装解压版 mysql5.7.28 winx64的详细教程)
- mysql主从复制忽略问题(MySQL复制问题的三个参数分析)
- mysql主机双向复制配置(浅析MySQL并行复制)
- mysqldump备份缺点(MySQL5.7 mysqldump备份与恢复的实现)
- 2019年外媒秋季新番动画角色CP排行榜,桐人和爱丽丝落榜(2019年外媒秋季新番动画角色CP排行榜)
- 新一小兰领衔 盘点动漫中的那些 远距离恋爱情侣(盘点动漫中的那些)
- 大事件 合肥四中火了(大事件合肥四中火了)
- 翼龙贷组织出借人调研 感受鄱阳 借 来的致富路(翼龙贷组织出借人调研)
- 2023新国风戏曲教育寒假集训班汇报演出《戏娃闹元宵》图文报道(2023新国风戏曲教育寒假集训班汇报演出戏娃闹元宵图文报道)
- 九儿《狐踪谍影》出演热血女特警,戏份杀青受关注(九儿狐踪谍影出演热血女特警)
热门推荐
- php如何获取当前日期(php实现获取近几日、月时间示例)
- opencv轮廓模糊识别(Opencv+Python实现图像运动模糊和高斯模糊的示例)
- reacthooks基础使用(React 小技巧教你如何摆脱hooks依赖烦恼)
- 阿里云服务器扩容了怎么恢复(一条命令解决阿里云服务器系统盘空间不足问题)
- mysql集群是用什么搭建的(MySQL5.7 集群配置的步骤)
- 设置404错误页面的几个建议
- dedecms搜索功能怎么设置详细(DEDECMS自定义联动类别调用及修改方法)
- 新手在阿里云快速搭建网站(阿里云快速搭建一个静态网站的方法步骤)
- docker 容器相关问题(docker空间爆满导致的进入容器失败的解决方案)
- xampp安装后启动apache弹出对话框(XAMPP下使用顶级域名绑定虚拟主机的配置方法和示例)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9