事件调度程序或在 MySQL 中设置计时器

Mehvish Ashiq 2024年2月15日
  1. MySQL 事件及其重要性
  2. 在 MySQL 中 Event 调度程序或设置定时器
  3. 结论
事件调度程序或在 MySQL 中设置计时器

本教程将指导你创建一个 EVENT,也称为 MySQL 计时器。

我们将看到如何在 MySQL 中设置计时器以让 MySQL 操作数据(例如,UPDATE/INSERT/DELETE 数据)。它还将在提到的日期和时间进行备份(如果需要)。

我们将考虑不同的场景来研究 MySQL EVENT。此外,讨论它的重要性和好处。对于本文,我们使用的是 MySQL 版本 8.0.27,但你可以从他们的官方网站获得更新的版本(如果有)。

MySQL 事件及其重要性

MySQL EVENT 是用于安排某些操作的任务 - 例如,更新列、获取表或数据库备份。

你可以创建``事件将只执行一次或根据给定的时间间隔重复 - 例如,每分钟、每小时、每月或每年。

没有固定数量的语句来创建 EVENTEVENT 正文中可以有许多行。

如果 EVENT 有多于一行,则正文必须包含在 BEGINEND 块中。同样重要的是要知道预定的 EVENT 命令存储在数据库中并在预定的日期时间执行。

创建事件对于以下好处很重要:

  • 让每个人都在同一页面上
  • 设定你的目标
  • 管理日程并执行事件
  • 用于优化表格、更新数据
  • 为非高峰时间生成有用的报告
  • 让你优先处理你的任务
  • 节省你的金钱和时间

在 MySQL 中 Event 调度程序或设置定时器

延误对制作团队和品牌来说都是非常昂贵的。

安排事件或为特定字段(列)设置计时器,然后将它们转储到项目报告的单独文件中将节省他们的时间。这样,它会让他们专注于其他生产性任务。

MySQL 使用一个名为 event_scheduler 的线程来执行所有事件。如果 event_scheduler 的值是 ON,那么 EVENT 才会被执行;否则,它不会。

你必须使用以下命令将 event_scheduler 的值设置为 ON

SET GLOBAL event_scheduler = ON;

现在,如果你创建一个事件,你怎么知道它会被执行?使用以下命令查看。

SHOW PROCESSLIST;

让我们看看将 event_scheduler 的值设置为 ON 之前和之后的输出。

在第一个输出中,你不能执行 EVENT,但在第二个输出中,你可以。这是因为第二个屏幕截图的 event_schedulerON

输出:

事件调度程序或在 mysql 中设置计时器 - 显示进程列表部分 a

事件调度程序或在 mysql 中设置计时器 - 显示进程列表部分 b

你可以创建``事件用于不同的目的 - 例如,事件将只运行一次或每年运行一次,或者在给定的时间间隔内运行一次。让我们在示例代码的帮助下开始理解。

我们在 person 数据库中有一个 student 表,该表在当前时间有以下记录。

事件调度程序或在 mysql 中设置计时器 - 学生表中的当前数据

让我们创建以下事件来了解一次性事件。示例代码如下。

SET GLOBAL event_scheduler = ON;

CREATE EVENT IF NOT EXISTS ONE_TIME_EVENT
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
INSERT INTO person.student (id, FIRST_NAME, LAST_NAME, GENDER, EMAIL)
VALUES 
(7, 'Thomas', 'Christoper', 'Male', 'tchristopher@gmail.com');

在上面给出的代码中,我们将 event_scheduler 的值设置为 ON 以执行 EVENT

然后我们创建了一个 EVENT,将其命名为 ONE_TIME_EVENT,并将其安排在 CURRENT_TIMESTAMP。这个 EVENT 表示它将在 CURRENT_TIMESTAMP 上执行一次然后过期。

只有当它不存在时才会创建此 EVENT。这个 EVENT 的工作是 INSERTstudent 表中的一行。

创建并执行此 EVENT 后,检查 student 表以查看新记录(见以下截图)。

注意
可以为 EVENT 提供任何名称,但要提供唯一名称。如果你有很多活动,活动的独特名称将使你的工作变得轻松。

输出:

事件调度程序或在 mysql 中设置计时器 - 更新学生表中的数据

假设你必须创建一个将在 CURRENT_TIMESTAMP 的 20 秒后执行的事件。这个事件也只会执行一次。写下下面的代码就明白了。

CREATE EVENT IF NOT EXISTS ONE_TIME_EVENT_WITH_INTERVAL
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 20 SECOND
DO
INSERT INTO person.student 
VALUES 
(8, 'Suzu', 'Aly', 'Fmale', 'aly.suzu@yahoo.com');

输出:

你可以在 20 秒后在 student 表中看到新记录。

请记住,如果你在 20 秒之前检查它,你将不会在 student 表中看到这一新行。让二十秒过去,然后检查。

事件调度程序或在 mysql 中设置计时器 - 在学生表中 20 秒后更新数据

使用以下代码查看创建和安排了多少事件。

SHOW EVENTS FROM classicmodels;

输出:

事件调度程序或在 mysql 中设置计时器 - 事件列表

为什么上面的截图中没有列出任何 EVENT?因为我们所有的活动现在都过期了,根据这篇文章。

你可以使用 ON COMPLETION PRESERVE 子句跟踪所有事件,无论它们是否过期,如下所示。

CREATE EVENT TEST_PRESERVE_CLAUSE
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE
DO
INSERT INTO tests(test_name,test_date)
VALUES('Testing Preserve Clause',NOW());

如果你想创建一个从 CURRENT_TIMESTAMP 开始,每分钟执行一次,并在一个小时后到期的事件怎么办。它被称为重复事件。

你可以使用以下代码进行创建和练习。

CREATE EVENT RECURRING_EVENT
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
INSERT INTO Tests(test_name,test_date)
 VALUES('This is recurring event test',NOW());

在上面给出的代码中,我们使用 STARTSENDS 告诉 EVENT 开始和结束时间。当你认为现在不需要该事件时,你也可以删除该事件。

在以下代码中用你的 EVENT 名称替换 name

DROP EVENT [IF EXIST] name;

让我们以另一种情况为例,你创建了 EVENT 并将工作移交给另一个开发人员。没有 COMMENT 容易理解吗?当然不是。

CREATE EVENT 并通过添加 COMMENT 来练习,如下所示。

CREATE EVENT RECURRING_EVENT
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
COMMENT 'It will add a new record every minture for one hour'
DO
INSERT INTO Tests(test_name,test_date)
 VALUES('This is recurring event test',NOW());

我们已经在 EVENT 正文中仅使用一行来学习 EVENT。如果你有多条线路怎么办?让我们通过下面的示例代码来理解它。

delimiter |
CREATE EVENT IF NOT EXISTS EVENT_FOR_UPDATE_COLUMNS_AND_DUMP
ON SCHEDULE AT current_timestamp
DO BEGIN
UPDATE student SET GENDER = 'M' WHERE student.GENDER = 'Male';
UPDATE student SET GENDER = 'F' WHERE student.GENDER = 'Female';
Table student INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n';   
END |
delimiter ;

你将在提供的代码中的 EVENT 正文中看到三个查询。每当你在 EVENT 正文中包含多行时,请将它们包含在 BEGINEND 中,如上所述。

在本例中,我们创建了一个从 CURRENT_TIMESTAMP 开始的 EVENT。它将根据 UPDATE 语句更新 GENDER 列并将数据导出到 .CSV 文件中。

对于导出,你必须使用此路径 C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.csv(如果你在 C 驱动器中安装了 MySQL)。否则,你将收到以下错误。

Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

如果你已将 MySQL 安装在其他位置,请使用 EVENT scheduler,然后使用以下命令查找你的文件将被导出的路径。

SHOW VARIABLES LIKE "secure_file_priv";  

结论

我们在本教程中了解了 MySQL EVENT 调度程序。

我们学习了如何创建将按照提供的时间间隔执行一次的事件,根据给定的时间间隔仅执行一次。我们还探索了创建包含多行的事件、更新数据,然后将其导出到单独的文件中。

作者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook