mysql v4.2.5.3 不支持event多行call

【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】5.7.25-OceanBase_CE-v4.2.5.3
【问题描述】此版本支持event,也支持在event里面写一行call,但是不支持多行的情况下设置变量,并调用存储过程
【复现路径】

-- 失败event
delimiter $$$
drop event if exists event_daytask;
create  event event_daytask on schedule
    every 8 HOUR
        starts '2018-06-01 00:30:00'
    on completion preserve
    enable
    do
    begin
set @beginstr=substr(replace(date_add(now(),interval -3 day),'-',''),1,8);
set @endstr=substr(replace(now(),'-',''),1,8);
call Balance_DayTask(@beginstr,@endstr);
end;


$$$
-- 成功event
delimiter $$$
drop event if exists event_daytask;
create  event event_daytask on schedule
    every 8 HOUR
        starts '2018-06-01 00:30:00'
    on completion preserve
    enable
    do
    begin
set @beginstr=substr(replace(date_add(now(),interval -3 day),'-',''),1,8);
set @endstr=substr(replace(now(),'-',''),1,8);
-- 不能多行包含call
-- call Balance_DayTask(@beginstr,@endstr);
end;


$$$
2 个赞

@论坛小助手

1 个赞

根据文档库中的信息,当前 OceanBase 数据库 MySQL 模式确实不支持 event 事件(参考:使用 MySQL 租户做常见数据库开发 → 连接方式介绍 → 客户端 → DBeaver/Navicat → 注意事项)。因此,在您的环境中遇到的问题是由于 OceanBase 社区版对 MySQL 的 event 功能支持有限所导致的。

具体分析:

  1. 单行或多行调用存储过程问题

    • 您提到在 event 中可以成功写入单行代码(如变量设置),但无法包含多行逻辑并调用存储过程。这与 OceanBase 对 event 的限制一致。
    • 根据文档说明,即使部分版本连接时可能提示 event 相关报错,这些报错可以直接忽略,但这并不意味着 event 的功能完全可用。
  2. 复现路径中的问题

    • 在失败案例中,您尝试通过 event 设置多个变量并调用存储过程,但由于 OceanBase 不支持 event,因此会报错或无法正常执行。
    • 在成功案例中,虽然没有调用存储过程,但仍然存在对 event 的限制。

解决方案建议:

由于 OceanBase 社区版目前不支持 event,您可以考虑以下替代方案:

  1. 使用外部调度工具

    • 使用操作系统级别的定时任务(如 Linux 的 cron)来定期调用存储过程。
    • 示例脚本:
      #!/bin/bash
      mysql -h <host> -P <port> -u<user> -p<password> -e "
      set @beginstr=substr(replace(date_add(now(),interval -3 day),'-',''),1,8);
      set @endstr=substr(replace(now(),'-',''),1,8);
      call Balance_DayTask(@beginstr,@endstr);
      "
      
    • 将上述脚本配置到 cron 中,按照需要的时间间隔执行。
  2. 使用 OCP 或其他管理工具

    • 如果您有 OCP(OceanBase Control Platform),可以通过其任务调度功能实现类似的功能。
  3. 升级或切换版本

    • 如果未来 OceanBase 社区版支持 event,可以考虑升级到支持该功能的版本。

总结:

您的问题合理,但基于当前 OceanBase 社区版的功能限制,event 并未被支持。建议采用外部调度工具或其他替代方案来实现类似功能。

检索到的文档如下:

  1. 使用 MySQL 租户做常见数据库开发
  2. 9000 ~ 9499
  3. OceanBase Sysbench 高性能部署和问题分析
  4. 0001 ~ 3999
  5. OceanBase 数据库社区版 V3.1.1
3 个赞

替代方案吧

对于 OceanBase 数据库 V4.2.5 版本,从 V4.2.5 BP2 版本开始 EVENT 支持执行 call 语句调用存储过程,设置开始时间或结束时间时支持了时间表达式和函数。

估计支持的还不是很好吧

1 个赞

不错

当前event支持功能并不是很完善,会随着后续版本发布完善下去