暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

MySQL Event功能解读其注意事项

原创 CuiHulong 2024-08-27
1260

MySQL中的事件(Event Scheduler)是一个非常有用的特性,可以用来调度执行SQL语句。它类似于如Linux的crontab作业或Windows的计划任务,可以定义一段SQL代码在特定的时间运行,或者按照某个时间间隔周期性地执行。
Event 的好处不含而欲:

  • 自动化管理:自动化执行重复性的数据库任务,如数据清理、报表生成等。
  • 减轻外部依赖:减少了对外部脚本或应用程序的依赖,降低了系统的复杂性。
  • 性能优化:通过合理安排任务的执行时间,可以提高数据库的整体性能。
  • 集中管理:所有与数据库相关的任务都在数据库内部进行管理和调度,便于集中监控和维护。

反之,事件调度器的性能和精确度可能受到MySQL服务器负载的影响。在高负载的情况下,事件可能不会严格按时执行。

参数

MySQL中的event_scheduler系统变量有三种可能的设置:ON、OFF和DISABLED。
其中:

参数值 说明
ON 表示事件调度器是启动的,并会按计划执行事件。
OFF 表示事件调度器当前是关闭的,但可以在运行时启用。
DISABLED 表示事件调度器完全禁用,并且不能在运行时修改这个状态。这个设置只能在服务器启动时通过配置文件或启动参数进行设置。
[mysqld]
event_scheduler=OFF # 或者 ON, 但不应该设置为 DISABLED

#sql
SET GLOBAL event_scheduler = ON;  -- 启动事件调度器
SET GLOBAL event_scheduler = OFF; -- 关闭事件调度器

Event调度语法:
调度策略有两种方式,单次和周期性循环执行,

  • 单次执行的关键字AT,后面可以接指定的执行时间字符串,比如 AT SCHEDULE TIMESTAMP ‘2024-10-01 01:00:00’ 表示在这个时间准时执行一次。
  • 周期性执行的关键字EVERY,比如EVERY 10 SECOND则表示每隔10秒执行一次任务。时间单位有如下:
interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

除此之外,结合调度策略,允许在特定时间范围内执行,指定开始和结束时间。

mysql> CREATE EVENT my_event ON SCHEDULE EVERY 1 DAY STARTS '2024-01-01 01:00:00' ENDS '2024-12-31 23:00:00';

高可用实现主从复制下Event设置不生效

在MySQL中,创建事件支持一些属性的设置。如下语句:

CREATE [DEFINER = user] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] 。。。

这里有一个不常用的属性“DISABLE ON SLAVE”是为副本上的事件状态设置的,表示该事件是在复制源服务器上创建并复制到副本上的,但不会在副本上执行。就是说使用DISABLE ON SLAVE就不会在主节点,从节点执行。只会单存的进行复制事件到从节点。如果源发生故障,从节点上不会丢失事件理,更新状态就可以继续使用。

下面在主节点创建一个事件,每分钟执行一次,同时使用DISABLE ON SLAVE属性:

#1.事件记录表 CREATE TABLE events_list( `id` bigint(20) NOT NULL AUTO_INCREMENT , `server_id` int, event_name varchar(20) not null, `create_time` datetime DEFAULT CURRENT_TIMESTAMP , PRIMARY KEY (`id`) ); #2.每分钟事件 DELIMITER // CREATE EVENT event_minute ON SCHEDULE EVERY 1 minute DISABLE ON SLAVE DO BEGIN INSERT INTO events_list(server_id,event_name,create_time) VALUES(1,'event_now', now()); END ;// DELIMITER ; #3查看主库事件状态: mysql> SELECT ORIGINATOR,EVENT_NAME,STATUS FROM INFORMATION_SCHEMA.EVENTS; +------------+--------------+--------------------+ | ORIGINATOR | EVENT_NAME | STATUS | +------------+--------------+--------------------+ | 129 | event_minute | SLAVESIDE_DISABLED | +------------+--------------+--------------------+ 1 row in set (0.00 sec) #4.主节点执行事件Enable,可以正常执行; mysql> ALTER EVENT event_minute ENABLE ; Query OK, 0 rows affected (0.01 sec) mysql> SELECT ORIGINATOR,EVENT_NAME,STATUS FROM INFORMATION_SCHEMA.EVENTS; +------------+--------------+---------+ | ORIGINATOR | EVENT_NAME | STATUS | +------------+--------------+---------+ | 129 | event_minute | ENABLED | +------------+--------------+---------+ 1 row in set (0.00 sec) #5.从节点事件状态,还是SLAVESIDE_DISABLED。无法执行: mysql> SELECT ORIGINATOR,EVENT_NAME,STATUS FROM INFORMATION_SCHEMA.EVENTS; +------------+--------------+--------------------+ | ORIGINATOR | EVENT_NAME | STATUS | +------------+--------------+--------------------+ | 129 | event_minute | SLAVESIDE_DISABLED | +------------+--------------+--------------------+ 1 row in set (0.00 sec)

查看从节点虽然binlog里记录的启动,但实际是SLAVESIDE_DISABLED 状态:

shell > mysqlbinlog --no-defaults --base64-output=decode-rows -vv mysql-bin.000001
# at 7388
#240825 12:10:21 server id 129  end_log_pos 7523 CRC32 0xe87b3234 	Query	thread_id=52	exec_time=0	error_code=0	Xid = 149
SET TIMESTAMP=1724559021/*!*/;
ALTER  EVENT  event_minute ENABLE
/*!*/;

备注:通过DISABLE ON SLAVE达到了仅复制事件语句,但启用还是需要手动执行Alter Enable方式启动才可以。从节点启用也是要手动执行Alter Enable方式。

注意事项

在使用MySQL事件(Event)时,需要注意以下关键点:

  • 资源消耗:事件的执行会占用数据库资源,因此应避免在高峰期安排大量事件执行。
  • 事件调度器的性能和精确度可能受到MySQL服务器负载的影响。在高负载的情况下,事件可能不会严格按时执行。
  • 错误处理:需要确保事件中的SQL语句能够正确处理可能出现的错误或异常情况。
  • 安全性:注意事件执行的权限和安全性,确保不会因事件执行而引入安全风险。
  • 复制:只允许主库上执行。以防数据不一致。
  • 事件存储: 事件被存储在MySQL的mysql.event表中。如果发生系统故障,这个表可能会受到影响。需要做好备份。
  • 监控和维护:定期检查事件的状态和执行情况,通过mysql的错误日志监控每次执行事件的情况。
  • 版本兼容性: 注意不同版本的MySQL在事件功能上可能存在差异。在升级MySQL时,确保检查新版本对事件的支持和任何潜在的更改。

总结

总之,MySQL的事件调度器是一个强大的工具,可以帮助自动化和管理数据库中的各种任务。然而,在使用时需要注意其对系统资源的影响以及高可用,安全性和错误处理的问题。整体上,建议尽量避免使用Event功能。

最后修改时间:2024-08-28 10:26:33
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论