ob数据库有没有定时运行sql的功能

【 使用环境 】 测试环境
【 OB or 其他组件 】OceanBase 4.2.1.7
【 使用版本 】
【问题描述】清晰明确描述问题
有没有类似与mysql数据库一样的event 定时器,如果有怎么开启这个功能

4 个赞

参考文档: EVENT-V4.3.5-OceanBase 数据库文档-分布式数据库使用文档

CREATE EVENT-V4.3.5-OceanBase 数据库文档-分布式数据库使用文档

2 个赞

OceanBase(OB)数据库 中,确实支持定时执行 SQL 的功能,其机制类似于 MySQL 的 Event Scheduler,但具体实现和使用方式会因 OceanBase 的部署模式(MySQL 模式 or Oracle 模式)而有所不同。


GPT说的

:white_check_mark: 一、OceanBase 是否支持类似 MySQL Event 的定时器?

答案:支持,但有限制和前提条件

OceanBase 在 MySQL 兼容模式 下支持 Event Scheduler,语法和 MySQL 非常相似,可以用来定时执行 SQL 语句。

但在 Oracle 模式 下,不支持 MySQL 风格的 Event,但可以使用 DBMS_SCHEDULERDBMS_JOB(Oracle 兼容包)来实现定时任务。


:white_check_mark: 二、MySQL 模式下:使用 EVENT 定时器

1. 是否默认开启 EVENT_SCHEDULER?

:x: 默认是关闭的,需要手动开启。

2. 如何开启 EVENT 功能?

步骤一:设置全局参数开启 Event Scheduler

-- 查看当前状态
SHOW GLOBAL VARIABLES LIKE 'event_scheduler';

-- 可能的值:
-- OFF     : 事件调度器关闭
-- ON      : 开启
-- DISABLED: 被禁用(需要重启才能开启)

-- 开启事件调度器(需要管理员权限)
SET GLOBAL event_scheduler = ON;

:warning: 注意:如果当前值是 DISABLED,说明实例启动时没有启用 Event 线程,必须通过修改配置项重启 OBServer 才能启用。


步骤二:通过配置文件或 OCP 启用(避免 DISABLED 状态)

如果你发现 event_scheduler 显示为 DISABLED,说明该功能在启动时被禁用。你需要:

  • 方法1:通过 OCP(OceanBase Cloud Platform)修改参数

    • 登录 OCP → 集群 → 参数管理 → 搜索 enable_event_scheduler
    • 将其设置为 True,并重启 OBServer 生效。
  • 方法2:直接通过 SQL 修改集群级配置(需 sys 租户权限)

ALTER SYSTEM SET enable_event_scheduler = TRUE TENANT = <your_tenant_name>;

:white_check_mark: 推荐在租户创建时或早期就开启此功能。


3. 创建 EVENT 示例(MySQL 模式)

DELIMITER $$

CREATE EVENT IF NOT EXISTS cleanup_old_logs
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP
DO
BEGIN
    DELETE FROM app_logs WHERE create_time < NOW() - INTERVAL 30 DAY;
END$$

DELIMITER ;

这个 EVENT 会每天执行一次,清理 30 天前的日志。


4. 常用 EVENT 管理命令

-- 查看所有事件
SHOW EVENTS;

-- 查看事件详细信息
SELECT * FROM information_schema.events;

-- 删除事件
DROP EVENT cleanup_old_logs;

-- 修改事件
ALTER EVENT cleanup_old_logs ENABLE;
ALTER EVENT cleanup_old_logs DISABLE;

:white_check_mark: 三、Oracle 模式下:使用 DBMS_SCHEDULER 或 DBMS_JOB

OceanBase 的 Oracle 模式支持 Oracle 风格的定时任务包:

示例:使用 DBMS_SCHEDULER

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'JOB_CLEAN_LOGS',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN DELETE FROM logs WHERE log_time < SYSDATE - 30; COMMIT; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2',  -- 每天凌晨2点执行
    enabled         => TRUE
  );
END;
/

支持复杂的调度策略(类似 cron),功能比 EVENT 更强大。


:white_check_mark: 四、注意事项

项目 说明
模式支持 MySQL 模式支持 EVENT;Oracle 模式支持 DBMS_JOB/DBMS_SCHEDULER
权限要求 创建 EVENT 需要有 EVENT 权限:
GRANT EVENT ON schema.* TO user;
持久性 EVENT 是数据库对象,保存在系统表中,重启后依然存在(只要开启了功能)
高可用影响 如果主副本切换,EVENT 会在新的主上继续运行(由租户元数据保证)
不支持 EVENT 的情况 租户为 Oracle 模式时,不能使用 MySQL 风格 EVENT

:white_check_mark: 总结

问题 回答
OceanBase 是否支持定时运行 SQL? :white_check_mark: 支持
是否有类似 MySQL 的 EVENT? :white_check_mark:MySQL 模式 下支持
如何开启 EVENT 功能? 1. 设置 enable_event_scheduler = TRUE
2. SET GLOBAL event_scheduler = ON;
3. 确保不是 DISABLED 状态
Oracle 模式怎么办? 使用 DBMS_SCHEDULERDBMS_JOB

:wrench: 推荐操作流程(MySQL 模式)

-- 1. 检查状态
SHOW GLOBAL VARIABLES LIKE 'event_scheduler';

-- 2. 开启(如果未开启)
SET GLOBAL event_scheduler = ON;

-- 3. 创建事件
CREATE EVENT my_event
ON SCHEDULE EVERY 5 MINUTE
DO
  UPDATE stats SET hit_count = 0;

-- 4. 验证
SHOW EVENTS;

如有使用 OCP 或 ODC 工具,也可以通过图形化界面管理 EVENT。

如需进一步帮助(例如排查 DISABLED 状态),可提供你的 OceanBase 版本和部署模式(MySQL/Oracle),我可以给出更具体的配置建议。

2 个赞

@论坛小助手

2 个赞

用shell的crontab加上数据库的过程,看看定时运行就行把

1 个赞
SHOW GLOBAL VARIABLES LIKE 'event_scheduler';

使用这个命令查是空值,是不是没有配置
配置方法是不是在配置文件中加入
event_scheduler = 1

1 个赞

没有这个功能嘛,有没有其他方法实现定时跑sql

1 个赞

有的 https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003381093

1 个赞

有限支持吧 具有前提条件的支持

1 个赞

学习一下,这个是肯定有。

我觉得这个应该有吧。就类似于Oracle的存储过程定时运行一样。还有就是物化视图也跟这个类似

不妨看看odc,管理更方便。
SQL 计划任务-V4.3.4-文档-分布式数据库使用文档