数据库关键字定时替换配置

事件调度器简介

MySQL事件调度器允许您在指定的时间间隔自动执行SQL语句,非常适合用于定期维护任务,如关键字替换、数据清理等。

应用场景

本配置将创建两个定时事件,一个将"api"替换为"brr",另一个将"brr"替换为"api",实现关键字的定时轮换。


配置事件调度器

1. 修改MySQL配置文件

编辑MySQL配置文件,启用事件调度器:

文件名:my.cnf
路径:/yes/1panel/apps/mariadb/mariadb/conf/my.cnf

在配置文件中添加以下内容:

my.cnf 配置复制代码

socket = /run/mysqld/mysqld.sock
event_scheduler=ON

2. 重启数据库服务

修改配置文件后,需要重启数据库服务使配置生效:

# 重启MySQL/MariaDB服务
sudo systemctl restart mysql
# 或
sudo systemctl restart mariadb

创建定时事件

执行SQL脚本

在MySQL中执行以下SQL脚本,创建两个定时事件:

完整的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"

验证配置

1. 检查事件调度器状态

执行以下SQL语句检查事件调度器是否已启用:

SHOW VARIABLES LIKE 'event_scheduler';

预期结果:

+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

2. 检查事件状态

执行以下SQL语句检查事件是否已创建:

SHOW EVENTS;

应该能看到两个事件:evt_api_to_bbrevt_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';