利用navicat设定mysql定时任务(事件)时发现的BUG

起因

项目上需要用到定时任务去更新某些表的内容,所想着网上查一下,试着弄一下。开始很顺利,但等我按着步骤弄完后,等到保存事件时却发现老是报错,保存不上。
报错如下:

You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near 'STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO call update_yhdz()' at line 4

我的事件定义如下:(这个事件是我用navicat premium 15的事件创建工具自动生成的,事件的意思就是从现在开始,每10秒钟执行一次update_yhdz这个函数)

CREATE EVENT `ibase3`.`U1`
ON SCHEDULE
EVERY '10'  
STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO call update_yhdz();

一、排查过程

一开始,我不知道究竟错在哪里,于是稍微改了一下创建模式,从每10秒一次,变成某个固定时间执行,且执行一次

CREATE EVENT `ibase3`.`U1`
ON SCHEDULE
AT ‘2023-09-20 18:00:00’
ON COMPLETION PRESERVE
DO call update_yhdz();

意思为在2023年九月二十号下午6点执行一次。这次保存没问题。
但很快发现另一个问题:我任务是下午5点58分设定的,可是到了6点,居然不执行了。

排查了一大圈,都没发现什么问题,于是想着是不是自己设置的时间字符串有问题,于是又将时间改回了CURRENT_TIMESTAMP,这回是系统定义的字符串,准没问题了吧。

跟预想的一样,事件能成功执行,但我瞟了一眼时间,差点没把自己气晕!系统时间显示是早上10点多!因为mysql在另一个服务器上,我只是在本机远程访问,忽略了两边机器时间不同步!

二、最后发现问题

但是前面说的设定定时任务的保存还是没解决,于是我又仔细对比了一下网上的某个帖子:https://blog.youkuaiyun.com/qq_39390545/article/details/109851072
别人的语句:

CREATE EVENT demo_event4 
ON SCHEDULE 
EVERY 10 MINUTE 
STARTS '2020-11-20 12:00:00' 
ON COMPLETION PRESERVE 
DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, '陈哈哈', NOW())

我的语句(navicat premium 15生成):

CREATE EVENT `ibase3`.`U1`
ON SCHEDULE
EVERY '10'  
STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO call update_yhdz();

很明显,别人的“every 10” 后面是带单位的,而我的没有单位。
由于navicat 15的事件创建器中的sql预览不能改它自动生成的代码,所以我复制了出来,在查询窗口中加上“SECOND”以后,如果所想的一样,事件可以成功创建,同时也按我设定一样,每10秒执行了一次我给定的函数。

结论:是navicat premium 15的事件创建器的BUG,它自动生成的创建事件代码有语法问题,导致事件创建时报语法错误。

知道这个情况后,我真的哇的一声哭出来了,搞了一个多小时呢。

Navicat for MySQL 中,可以通过 MySQL事件调度器(Event Scheduler)实现定时任务和自动处理功能。以下是详细的设置步骤和操作说明。 ### 开启 MySQL 事件调度器 首先需要确保 MySQL事件调度器已开启。可以通过以下 SQL 查询确认: ```sql SHOW VARIABLES LIKE '%event_scheduler%'; ``` 如果结果显示 `event_scheduler` 的值不是 `ON`,则需要手动开启它。可以使用以下命令临开启: ```sql SET GLOBAL event_scheduler = ON; ``` 为了确保 MySQL 启动事件调度器始终处于开启状态,可以在 MySQL 配置文件(如 `my.cnf` 或 `my.ini`)中添加以下行: ```ini [mysqld] event_scheduler = ON ``` 然后重启 MySQL 服务以使更改生效[^1]。 ### 创建存储过程 接下来,创建一个存储过程来定义你希望定执行的 SQL 操作。例如,更新某个字段: ```sql DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `ManGeTest`() BEGIN -- 执行 SQL 放在这 UPDATE role SET rname='靓仔' WHERE rname='man哥'; END$$ DELIMITER ; ``` 这段代码创建了一个名为 `ManGeTest` 的存储过程,并在其中定义了一条更新语句[^1]。 ### 创建事件 创建完存储过程后,下一步是创建一个事件来定调用这个存储过程。你可以根据需求设置事件的执行间计划。 #### 示例:每 10 秒执行一次 ```sql CREATE EVENT IF NOT EXISTS `update_role_event` ON SCHEDULE EVERY 10 SECOND DO CALL ManGeTest(); ``` 上述代码创建了一个名为 `update_role_event` 的事件,该事件每 10 秒调用一次 `ManGeTest` 存储过程[^1]。 #### 示例:每天特定间执行 如果你想让事件在每天的特定间执行,比如凌晨 2 点,可以这样设置: ```sql CREATE EVENT IF NOT EXISTS `daily_backup_event` ON SCHEDULE EVERY 1 DAY STARTS '2023-10-01 02:00:00' DO BEGIN CALL BackupDatabase(); -- 假设你已经有一个备份数据库的存储过程 END; ``` 在这个例子中,事件 `daily_backup_event` 将每天凌晨 2 点执行一次,并调用 `BackupDatabase` 存储过程[^2]。 ### 使用 Navicat 设置定时任务 除了通过 SQL 语句直接创建事件外,Navicat 提供了图形化界面来简化这一过程。 1. **连接到数据库**:打开 Navicat 并连接到你的 MySQL 数据库。 2. **导航到事件**:在左侧的对象树中选择目标数据库,然后点击顶部菜单中的“对象” -> “事件”。 3. **新建事件**:点击工具栏上的“新建事件”按钮。 4. **配置事件属性**: - 在“定义”选项卡中,输入要执行的 SQL 语句或调用存储过程。 - 在“计划”选项卡中,设置事件的执行频率(如每天、每周等)。 5. **保存并启用事件**:完成配置后,点击“保存”按钮以保存事件,并确保事件处于启用状态。 ### 自动备份数据库示例 如果你的需求是定期备份数据库,可以结合存储过程和事件调度器来实现。下面是一个完整的示例脚本: ```sql -- 开启事件调度器 SET GLOBAL event_scheduler = ON; -- 创建备份数据库的存储过程 DELIMITER $$ CREATE PROCEDURE `BackupDatabase`() BEGIN SET @backup_dir = '/path/to/your/backup/directory/'; SET @dbname = (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'your_database_name'); SET @filename = CONCAT(@backup_dir, @dbname, '_', DATE_FORMAT(NOW(), '%Y-%m-%d-%H%i%S'), '.sql'); SET @command = CONCAT('mysqldump -u your_username --password=your_password ', @dbname, ' --result-file=', @filename); PREPARE stmt FROM @command; EXECUTE stmt; DEALLOCATE PREPARE stmt; END$$ DELIMITER ; -- 创建每日执行的备份事件 CREATE EVENT IF NOT EXISTS `daily_backup_event` ON SCHEDULE EVERY 1 DAY STARTS '2023-10-01 02:00:00' DO BEGIN CALL BackupDatabase(); END; ``` 此脚本将每天凌晨 2 点执行一次数据库备份操作,并将备份文件保存到指定路径。 ### 总结 通过上述方法,可以在 Navicat for MySQL利用 MySQL事件调度器实现定时任务和自动处理功能。无论是简单的数据更新还是复杂的数据库备份,都可以通过创建存储过程和事件来高效管理。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值