一、概念
MySQL事件是一种用于在数据库服务器上执行预定任务的机制。它们类似于操作系统中的定时任务,可以根据指定的时间表或条件自动执行SQL语句或存储过程。MySQL事件通常用于执行数据维护、备份、数据同步等定期性任务。
以下是一些关于MySQL事件的重要概念:
- 事件调度器:MySQL事件是由事件调度器(Event Scheduler)负责管理和执行的。事件调度器是MySQL服务器的一个组件,负责按照预定的时间表执行事件。
- 事件定义:事件定义包括事件的名称、执行时间表、执行条件、执行语句等信息。事件定义通过SQL语句创建,并存储在数据库中的
mysql.event表中。 - 执行时间表:执行时间表指定了事件何时执行的规则,可以是一次性执行、每天、每周、每月等周期性执行,也可以是在特定日期和时间执行。
- 执行语句:事件可以包含一个或多个SQL语句或存储过程,在执行时按照定义的时间表依次执行这些语句。
- 执行权限:为了创建、修改或删除事件,用户需要具有
EVENT权限。
通过使用MySQL事件,可以自动化执行一些常见的数据库管理任务,减少人工干预,提高数据库的可靠性和稳定性。然而,需要谨慎使用事件,避免对数据库性能和稳定性造成不利影响。
二、常见操作
事件调度器操作
查看事件调度器是否开启
-- 查看事件调度器是否开启:on表示已开启
show variables like '%event_scheduler%';
开启和关闭事件调度器
-- 开启和关闭事件调度器
set global event_scheduler = ON;
set global event_scheduler = off;
更改配置文件:进入 my.ini 文件修改
# 事件调度器启动状态
event_scheduler = on
查看事件
show events
创建事件
使用 create event 语句创建一个事件
create
[definer = user]
event
[if not exists]
event_name
on schedule schedule_body
[on completion [not] preserve]
[enable | disable | disable on slave]
[comment 'comment']
do event_body;
definer:可选,用于定义事件执行时检查权限的用户。if not exists:可选,一般都加上,用于判断要创建的事件是否存在。event_name:定义指定的事件名,是用来唯一标识事件的名称。在同一个数据库中,事件名称必须是唯一的。on schedule schedule_body:schedule_body 用于定义执行的时间和时间间隔。on completion [not] preserve:可选,指定事件是否循环执行,默认为一次执行,即 not preserve。enable | disable | disable on slave:可选,指定事件的一种属性,enable 表示启动,disable 表示关闭或者下线,disable on slave 表示从属性上禁用,默认启动comment ‘comment’:可选,添加事件的注释。do event_body:必选,event_body 用于指定事件启动时所要执行的代码,可以是任何有效的sql 语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用 begin … end 复合结构。
时间调度用例
# 每10分钟执行一次
on schedule every 10 minute
# 从 2024-01-23 08:00:00 开始,每1小时执行一次
on schedule every 1 hour
starts '2024-01-23 08:00:00'
# 从现在起30分钟后开始,四周后结束,这段期间内每12小时执行一次
on schedule every 12 hour
starts current_timestamp + interval 30 minute
ends current_timestamp + interval 4 week
删除事件
使用 drop event 语句删除该事件。
drop event [if exists] event_name;
启动与关闭事件
使用 alter event 语句对事件进行修改。
# 启动事件
alter event event_name enable;
# 关闭事件
alter event event_name disable;
三、测试
CREATE TABLE `info` (
`id` bigint NOT NULL COMMENT '主键',
`name` varchar(128) DEFAULT NULL COMMENT '名称',
`short_name` varchar(32) DEFAULT NULL COMMENT '简称',
`code` varchar(128) DEFAULT NULL COMMENT '代码',
`credit_code` varchar(64) DEFAULT NULL COMMENT '信用代码',
`type_code` varchar(32) DEFAULT NULL COMMENT '字典',
`classify_code` varchar(32) DEFAULT NULL COMMENT '分类字典',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='信息表';
CREATE EVENT IF NOT EXISTS face_sales_data_task1
ON SCHEDULE EVERY 1 MINUTE
STARTS '2024-01-23 23:57:00'
ON COMPLETION PRESERVE
DO
BEGIN
INSERT INTO a.info (id, name, short_name, code, credit_code, type_code, classify_code)
SELECT id, name, short_name, code, credit_code, type_code, classify_code
FROM c.info
ON DUPLICATE KEY UPDATE name = VALUES(name), short_name = VALUES(short_name), code = VALUES(code), credit_code = VALUES(credit_code), type_code = VALUES(type_code), classify_code = VALUES(classify_code);
END;
select * from c.info;
四、性能问题
当MySQL事件执行时,会对MySQL服务的性能产生一定影响。这种影响通常取决于事件的复杂性、执行频率以及数据库服务器的负载情况。以下是一些可能的影响:
- 资源占用:事件的执行会占用一定的CPU和内存资源,特别是对于复杂的事件或需要大量数据处理的事件。这可能会导致数据库服务器的资源利用率升高,对其他数据库操作产生竞争。
- 锁定和并发:事件执行期间可能会涉及到表的锁定和数据操作,特别是在更新或插入大量数据时。这可能会影响其他会话的并发访问,导致部分查询或更新操作等待事件执行完成。
- IO操作:事件执行可能会产生大量的IO操作,包括读取和写入数据。特别是对于频繁执行的事件,可能会导致磁盘IO负载增加,影响其他IO密集型操作的性能。
- 日志记录:事件的执行过程会被记录到MySQL的日志中,包括二进制日志和慢查询日志等。这可能会增加日志文件的大小,对日志记录和分析产生影响。
- 数据库响应时间:如果事件的执行时间较长,可能会导致数据库响应时间延长,影响用户对数据库的访问体验。
为了减轻事件执行对MySQL服务性能的影响,可以考虑以下几点:
- 优化事件的SQL语句,确保事件执行的效率和性能。
- 合理设置事件的执行频率,避免频繁执行对数据库性能的影响。
- 在数据库服务器负载较低的时段执行事件,避免与其他重要操作产生竞争。
- 监控事件执行的性能和影响,及时调整事件的执行策略。
虽然MySQL事件执行会对数据库服务的性能产生一定影响,但通过合理的优化和管理,可以最大程度地减少这种影响。