【问题标题】:Why is MySQL Event Scheduler Stuck Opening Tables?为什么 MySQL 事件调度程序卡在打开表?
【发布时间】:2020-11-23 04:05:55
【问题描述】:

我正在使用 MySQL 8.0.21 从 Windows 10 上的 MySQL 社区安装程序更新到 version2004 并且由于某种原因,如果我在事件调度程序中创建一个事件,它每秒调用一次过程(不管那个 SP 实际做了什么,我都会解释我的测试用例) - 我的 CPU 已达到极限,当我查看 MySQL Workbench 中的活动连接时,它会堆积 ton 的工作线程停在“Opening Tables”状态。我的电脑死机了,我必须编辑要禁用的事件,在任务管理器中停止 MySQL 进程并重新启动服务。

测试用例

在设置全新服务器期间,我使用了所有默认设置,除了我启用了常规日志并使用了新的 8.0+ mysql_sha2_password 加密(虽然我将用户更改为 phpmyadmin 的 mysql_native_password 以便可能恢复它,我是老实说不确定)

  • 我创建了一个名为“Test”的新架构
  • 我创建了一个名为 “TestTable”只有一列称为“column1”INT
  • 然后我创建一个存储过程“TestProc”,它执行“SELECT COUNT(*) FROM TestTable;" 调整 Priv., DEFINER::Definer 是 root@localhost 和 读取 SQL
  • 最后我创建了一个名为“TestEvent”的事件 "CALL TestProc()s" 每 1 秒重复一次,在完成时保留,并且 定义者是 root@localhost
  • 在触发事件之前重启服务器。

另外,如果我启用或创建事件,它将毫无问题地运行,重要的是要注意,当事件调度程序保持开启时问题开始,并且事件保持启用,然后重新启动服务器从任务管理器中的服务。立即将 CPU 插孔提升到最大并且活动连接显示线程堆积而未完成。 感谢任何线索,我没有发现 实际 错误,也不知道从哪里开始调试。我试过跳过授权表(但显然这不是最佳的,而且没有用)。

我在查看 MySQL 8.0+ 文档时确实找到了提示

“如果重复事件未在其调度间隔内终止,则结果可能是该事件的多个实例同时执行。如果不希望出现这种情况,您应该建立一种机制来防止同时发生实例。例如,您可以使用GET_LOCK() 函数,或行或表锁定。”来自

但是,在分析时似乎没有任何锁,我也不应该只为这个测试用例(或我的实际程序)手动实现这样的锁


更新


到目前为止,尽管这是一个相当小众的错误,但我确实相信这正是它的本质,并且我已将其发布在 MySQL 错误论坛上。 参考帖在这里:

【问题讨论】:

  • 请贴出您的TestProc源代码和TestEvent源代码进行分析。
  • 我刚刚添加了一张照片,我还设置了每 5 秒发生一次。 - 问题仍然存在,它只是以较慢的速度消耗 CPU,所以我可以在它更容易滞后之前重新启动我的服务器。
  • 请考虑保留 5 秒的重复秒数并使用 1 分钟的 END 时间,以便我们可以按照 www.mysqlservertuning.com 的要求探索“我们需要的数据” - 免费分析。
  • 我确实需要这个事件无限期地持续下去......
  • 我还发现了几个月前我在 DBA stack Exchange 上发表的一篇旧帖子,询问了同样的问题,但没有得到回复。 dba.stackexchange.com/questions/241261/…

标签: mysql mysql-event


【解决方案1】:

答案实际上是一个可重现的错误 - Bug#: 100449

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2014-12-21
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多