MySQL的定时任务主要通过履行SQL语句来实现。可使用CRON表达式或事件调度器(如InnoDB事件调度器)来设置定时任务。
1、 使用CRON表达式可以通过使用`CREATE EVENT`语句来创建一个事件,然后在触发器中定义履行的SQL语句。例如
```sql
CREATE EVENT event_name
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTE DO
BEGIN
INSERT INTO table_name (column1, column2)
VALUES ('value1', 'value2');
END;
```
这个例子将在每5分钟履行一次INSERT语句。
2、 使用事件调度器MySQL的InnoDB存储引擎支持事件调度器。可以通过以下步骤创建一个定时任务
- 打开MySQL命令行并登录到数据库;
- 创建一个表来存储事件(例如,`CREATE TABLE events (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
scheduled_time DATETIME NOT NULL,
handler_name VARCHAR(255),
handler_class VARCHAR(255),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;`);
- 在`handler_name`和`handler_class`字段中指定要履行的处理程序名称和类名(例如,`SET @handler = 'com.example.MyHandler'`);
- 将处理程序添加到脚本文件中,并确保它包括`run()`方法;
- 在MySQL命令行中运行以下命令来创建事件
```bash
CREATE EVENT event_name
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
DO
BEGIN
SET @handler = 'com.example.MyHandler';
execute @handler.run();
END;
```
3、 定时任务的其他选项还可使用MySQL的内置函数和系统变量来控制定时任务的行动。例如,可使用`date_sub()`函数来调剂时间间隔,或使用`set`语句来更改处理程序的行动。
如何写mysql的定时任务
mysql的定时任务一般用event(事件)来完成,触发器无法完成。
一、通过mysql的命令行客户端来完成
1、set global event_scheduler =1; //开启event_scheduler
执行这个语句如果出现,可在mysql的配置文档中设置[mysqld]段中添加 event_scheduler=ON
如果重启mysql;这种情况下依然出错,Error Code: 1290. The MySQL server is running with the --event-scheduler=DISABLED
or --skip-grant-tables option so it cannot execute this statement,这个错误是说启动服务器时如果指定了--skip-grant-tables选项,则event_scheduler则自动被设置为DISABLED。命令行或配置文件的设置都会被覆盖。建议重现安装mysql或是修改启动参数(在系统服务中指定)。
查看event_scheduler状态show status like '%event%'; 或SELECT @@event_scheduler;
2、CREATE PROCEDURE Mypro() //创建存储过程
BEGIN
update userinfo SET endtime = now() WHERE id = '155';
END;
3、创建event My_enevt,每隔三十秒执行一次
create event if not exists e_test
on schedule every 30 second
on completion preserve
do call Mypro();
4、关闭事件
alter event e_test ON COMPLETION PRESERVE DISABLE;
5、开启事件
alter event e_test ON COMPLETION PRESERVE ENABLE;
语法
CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION
[NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT 'comment'] DO sql_statement;
schedule: AT TIMESTAMP [+ INTERVAL INTERVAL] | EVERY INTERVAL [STARTS TIMESTAMP]
[ENDS TIMESTAMP] 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要实现定时执行sql语句就要用到Event
具体操作如下
先看看看event 事件是否开启
show variables like '%sche%';
如没开启,则开启。需要数据库超级权限
set global event_scheduler =1;
创建存储过程 update_a(注就是你要执行的sql语句)
mysql> create procedure update_a() update a set a.y_avg=(select avg(b.youhao) from b where a.a_id=b.a_id);
创建一个定时任务event e_updateA
mysql> create event if not exists e_updateA
-> on schedule every 60 second---设置60秒执行一次
-> on schedule at date_add(now(),interval 1 minute) ---在一分钟后执行
-> on completion preserve
-> do call update_a();---执行update_a()存储过程
创建Event之后,sql语句就定时执行一次。
关闭事件任务
mysql> alter event e_updateA ON
-> COMPLETION PRESERVE DISABLE;
开启事件任务
mysql> alter event e_updateA ON
-> COMPLETION PRESERVE ENABLE;
如还有问题再联系我
评论(0)