创建RDS MySQL定时任务

当您需要在RDS MySQL中执行定时和周期性任务,例如定时发送统计报告、定时同步数据或定期清理过期数据等时,您可以使用事件调度(Event Scheduler)功能,根据预定计划自动执行数据库中定义的事件。

前提条件

创建具备目标数据库EVENT权限的RDS MySQL账号,即高权限账号、普通账号(读写)或普通账号(仅DML)。

步骤一:开启Event Scheduler

请首先确认Event Scheduler已被启用,随后再进行定时任务的创建。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏中单击参数设置

  3. 可修改参数页搜索event_scheduler,并确保运行参数值设置为ON

  4. 如果修改了该参数值,请单击提交参数,并在弹出的窗口中,选择立刻生效,并单击确定

步骤二:创建定时任务

通过DMS控制台创建

  1. 单击页面右上角的登录数据库,进入DMS的快捷登录页面,使用RDS MySQL账号登录数据库实例,详情请参见通过DMS登录RDS数据库

    说明

    登录数据库实例时,管控模式选为自由操作。DMS管控模式的更多信息请参见管控模式

  2. SQLConsole窗口中执行如下SQL创建测试表students。

    说明

    如果使用数据库中已经存在的表,可以跳过此步骤,并在后续的事件语句中使用相应的SQL语句。

    CREATE TABLE students (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `name` varchar(64) NOT NULL COMMENT 'name',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  3. SQL窗口的可视化操作区域单击可编程对象,并在事件上单击鼠标右键,选择新建(事件)

    image.png

  4. 新建(事件)页签,设置事件参数。

    本文以事件名称test01,调度方式循环时间间隔10分钟,事件语句以为测试表students插入数据为例。事件参数的详细说明请参见表事件参数说明

    事件语句示例:

    begin
    INSERT INTO students(name) VALUES('zhangsan');
    end

    事件参数说明

    分类

    参数

    说明

    事件基本信息

    事件名称

    事件的名称。

    状态

    事件的状态:

    • 开启:事件处于可执行状态。

    • 禁用:事件处于暂时停止执行状态。

    • 从库禁用:只有主库可以执行事件。

    到期删除

    • 固定时间的事件执行后是否删除该事件。

    • 循环事件到结束时间后是否删除该事件。

    注释

    填写事件的详细注释。

    执行时间定义

    调度方式

    • 固定时间:在固定时间执行一次事件。选择此选项需要设置固定时间

    • 循环时间:每隔一段时间执行一次事件。 选择此选项需要设置间隔开始时间结束时间

      说明
      • 间隔:由时间单位的数量时间单位组成,表示多久循环一次。

      • 开始时间:循环事件的开始时间。不选中表示即时开始。

      • 结束时间:循环事件的结束时间。不选中表示无限循环。

    事件语句

    事件中需要执行的SQL语句。

    请将/**event body**/替换为具体的SQL语句。

  5. 单击保存,在弹出的提交变更窗口确认SQL语句无误后,单击直接执行

    您可以在可编程对象页签的事件下查看新增的定时任务。您也可以在SQL窗口执行SHOW EVENTS;,查看定时任务的详细信息。

    说明

    使用SHOW EVENTS;查询时,如果事件的状态为ENABLED,表示事件已启用。

通过SQL语句创建

创建语法

CREATE
    [DEFINER = user]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    DO event_body;

schedule:
    {
        AT timestamp [+ INTERVAL interval] ...
      | EVERY interval
          [STARTS timestamp [+ INTERVAL interval] ...]
          [ENDS timestamp [+ INTERVAL interval] ...]
    }

interval:
    quantity {
        YEAR
      | QUARTER
      | MONTH
      | DAY
      | HOUR
      | MINUTE
      | WEEK
      | SECOND
      | YEAR_MONTH
      | DAY_HOUR
      | DAY_MINUTE
      | DAY_SECOND
      | HOUR_MINUTE
      | HOUR_SECOND
      | MINUTE_SECOND
    }

示例

例如,每天凌晨2点,删除user_order表中30天前的数据,其中user_order表的create_time字段记录了每一行数据的写入时间。

DELIMITER $$
CREATE EVENT IF NOT EXISTS delete_old_user_orders
ON SCHEDULE
    EVERY 1 DAY
    STARTS TIMESTAMP(CURRENT_DATE, '02:00:00') + INTERVAL 1 DAY -- 次日凌晨2点开始
COMMENT --每日删除30天前的订单数据
DO
BEGIN
    -- 删除逻辑(create_time为时间字段)
    DELETE FROM user_order 
    WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
    
    -- 可选:记录操作日志(需先创建log表)
    -- INSERT INTO task_log (message) VALUES ('Deleted old user_orders');
END$$
DELIMITER ;

步骤三:查看定时任务执行结果

查看事件的执行结果时,可以通过检查事件中的SQL语句的执行情况来判断。

  • 如果SQL语句执行成功,则可以通过检查相关表来验证结果。

  • 如果SQL语句执行失败,您可以通过查看错误日志来获取更多详细信息。

您可以开启SQL洞察和审计,通过日志记录来查看定时任务的执行结果。

说明

通过执行SQL语句SELECT * FROM information_schema.events;,可以确认现存的定时任务及其相关信息,例如定时任务的创建时间、最后修改时间、最近一次执行时间以及是否处于启用状态等。

步骤四:删除定时任务

通过DMS控制台删除

说明

如果您在创建循环事件时,设置了到期删除结束时间,那么循环事件到期后会自动删除,无需手动删除。

  1. 可编程对象页签的事件下,右键单击目标事件,选择删除(事件)

  2. 在弹出的窗口,单击直接执行

说明

您也可以在SQL窗口,执行DROP EVENT <事件名称>;命令,删除对应的事件。

通过SQL语句删除

执行DROP EVENT <事件名称>;命令,删除对应的事件。

相关文档

什么是数据管理DMS

常见问题

Q:RDS MySQL定时任务执行的语句是否会被记录在SQL审计日志中?

A:会被SQL审计日志记录。由于定时任务由数据库内部执行,因此客户端IP会显示为%

说明

客户端IP显示为%并不一定是定时任务执行记录,也有可能源自存储过程内部的SQL。

Q:创建RDS MySQL定时任务时,系统是否会检查相关表对象是否存在?

A:不会。如果在执行过程中发现表不存在或因其他原因导致SQL执行失败,可以查看错误日志以获取详细信息。

Q:如何检查RDS MySQL中的定时任务及其最近一次执行时间?

A:可以执行以下SQL,查询information_schema.events表来确认现存的定时任务及其相关信息,例如定时任务的创建时间、最后修改时间、最近一次执行时间以及是否处于启用状态等。

SELECT * FROM information_schema.events;