创建定时事件
本配置将创建两个定时事件,一个将"api"替换为"brr",另一个将"brr"替换为"api",实现关键字的定时轮换。
1、 编辑MySQL配置文件,启用事件调度器:
- 文件名:my.cnf
- 路径:/yes/1panel/apps/mariadb/mariadb/conf/my.cnf
在配置文件 my.cnf 中添加以下内容:
socket = /run/mysqld/mysqld.sock
event_scheduler=ON2、 修改配置文件后,需要重启数据库服务使配置生效:
systemctl restart mysql或
systemctl restart mariadb在MySQL中执行以下SQL脚本,创建两个定时事件:
USE bbsxpvip;
DELIMITER $$
DROP EVENT IF EXISTS evt_api_to_bbr$$
CREATE EVENT evt_api_to_bbr
ON SCHEDULE
EVERY 1 DAY
STARTS TIMESTAMP('2025-11-12 13:00:00')
ON COMPLETION PRESERVE
ENABLE
DO
BEGIN
UPDATE bbs_post SET message = REPLACE(message,'api','brr') WHERE message LIKE '%api%';
UPDATE bbs_post SET message_fmt = REPLACE(message_fmt,'api','brr') WHERE message_fmt LIKE '%api%';
END$$
DROP EVENT IF EXISTS evt_bbr_to_api$$
CREATE EVENT evt_bbr_to_api
ON SCHEDULE
EVERY 1 DAY
STARTS TIMESTAMP('2025-11-11 08:30:00')
ON COMPLETION PRESERVE
ENABLE
DO
BEGIN
UPDATE bbs_post SET message = REPLACE(message,'brr','api') WHERE message LIKE '%brr%';
UPDATE bbs_post SET message_fmt = REPLACE(message_fmt,'brr','api') WHERE message_fmt LIKE '%brr%';
END$$
DELIMITER ;
-- 检查事件是否创建成功
SHOW EVENTS;这个脚本创建了两个事件:
- evt_api_to_bbr:每天13:00将"api"替换为"brr"
- evt_bbr_to_api:每天08:30将"brr"替换为"api"
主要:把脚本bbsxpvip 替换你的数据库名
执行以下SQL语句检查事件调度器是否已启用:
SHOW VARIABLES LIKE 'event_scheduler';预期结果:
| Variable_name | Value |
|---|---|
| event_scheduler | ON |
检查事件状态,执行以下SQL语句检查事件是否已创建:
SHOW EVENTS;应该能看到两个事件:evt_api_to_bbr 和evt_bbr_to_api
事件参数说明:
| 参数 | 说明 |
|---|---|
| ON SCHEDULE EVERY 1 DAY | 每天执行一次 |
| STARTS TIMESTAMP('...')` | 事件开始执行的时间 |
| ON COMPLETION PRESERVE` | 事件完成后保留事件定义 |
| ENABLE | 启用事件 |
替换逻辑说明:
| 事件 | 执行时间 | 操作 |
|---|---|---|
| evt_api_to_bbr | 每天13:00 | 将"api"替换为"brr" |
| evt_bbr_to_api | 每天08:30 | 将"brr"替换为"api" |
常见问题
1、事件调度器未启用
如果SHOW VARIABLES LIKE 'event_scheduler'显示为OFF:
- 检查配置文件是否正确添加了event_scheduler=ON
- 确认已重启数据库服务
- 尝试在MySQL中直接启用:SET GLOBAL event_scheduler = ON;
2、如果事件创建成功但未执行:
- 检查事件状态:SHOW EVENTS;
- 确认事件是否启用:状态应为ENABLED
- 检查MySQL错误日志
3、权限问题,创建事件需要EVENT权限:
GRANT EVENT ON database_name.* TO 'username'@'host';