为什么 MySQL 事件计划程序在打开表时卡住了?
Why is MySQL Event Scheduler Stuck Opening Tables?
我正在使用 MySQL 8.0.21 从 MySQL 社区安装程序 Windows 10 更新到版本 2004 并且出于某种原因如果我在事件调度程序中创建一个事件,它每秒调用一次过程(不管 SP 实际做了什么,我都会解释我的测试用例)——我的 CPU 达到最大值,当我查看活动时MySQL Workbench 中的连接,它堆积了 吨 的工作线程,这些线程在“正在打开 Tables” 状态下停止。我的电脑死机了,我必须编辑要禁用的事件,停止任务管理器中的 MySQL 进程并重新启动服务。
测试用例
在设置全新服务器期间,我使用了所有默认设置,除了我启用了常规日志并且我使用了新的 8.0+ mysql_sha2_password 加密(尽管我将 USER 更改为 mysql_native_password phpmyadmin 这样可能会还原它,老实说我不确定)
- 我创建了一个名为“测试”的新架构
- 我创建了一个 Table
“TestTable”只有一个名为“column1”的列 INT
- 然后我创建了一个存储过程“TestProc”,它执行“SELECT COUNT(*) FROM
TestTable;" Adjusts Priv.'s, DEFINER::Definer is root@localhost and
读取 SQL
- 最后我创建了一个名为“TestEvent”的事件
“CALL TestProc()s”每 1 秒重复一次,在完成时保留,并且
定义者是 root@localhost
- 在触发事件之前重新启动服务器。
此外,如果我启用或创建事件,它将 运行 没有问题,重要的是要注意问题开始时事件调度程序保持打开状态,并且事件保持启用状态,然后服务器从任务管理器中的服务重新启动。 CPU 立即达到最大和活动连接显示线程堆积而未完成。
感谢任何线索,我发现没有 actual 错误,我也不知道从哪里开始调试了。我试过跳过 grant tables(但显然这不是最优的,也没有用)。
我在查看 MySQL 8.0+ 文档时确实找到了提示
"如果重复事件没有在其调度间隔内终止,结果可能是事件的多个实例同时执行。如果这是不可取的,您应该建立一种机制来防止同时发生实例。例如,您可以使用 GET_LOCK() 函数,或行或 table 锁定。”来自
然而,在分析时似乎没有任何锁,我也不需要为这个测试用例(或我的实际程序)手动实现这样的锁
更新
到目前为止,尽管这是一个相当小众的错误,但我确实相信这就是问题所在,并且我已将其发布在 MySQL 错误论坛上。 Reference post is here:
答案实际上是一个可重现的错误 - Bug#: 100449
我正在使用 MySQL 8.0.21 从 MySQL 社区安装程序 Windows 10 更新到版本 2004 并且出于某种原因如果我在事件调度程序中创建一个事件,它每秒调用一次过程(不管 SP 实际做了什么,我都会解释我的测试用例)——我的 CPU 达到最大值,当我查看活动时MySQL Workbench 中的连接,它堆积了 吨 的工作线程,这些线程在“正在打开 Tables” 状态下停止。我的电脑死机了,我必须编辑要禁用的事件,停止任务管理器中的 MySQL 进程并重新启动服务。
测试用例
在设置全新服务器期间,我使用了所有默认设置,除了我启用了常规日志并且我使用了新的 8.0+ mysql_sha2_password 加密(尽管我将 USER 更改为 mysql_native_password phpmyadmin 这样可能会还原它,老实说我不确定)
- 我创建了一个名为“测试”的新架构
- 我创建了一个 Table “TestTable”只有一个名为“column1”的列 INT
- 然后我创建了一个存储过程“TestProc”,它执行“SELECT COUNT(*) FROM TestTable;" Adjusts Priv.'s, DEFINER::Definer is root@localhost and 读取 SQL
- 最后我创建了一个名为“TestEvent”的事件 “CALL TestProc()s”每 1 秒重复一次,在完成时保留,并且 定义者是 root@localhost
- 在触发事件之前重新启动服务器。
此外,如果我启用或创建事件,它将 运行 没有问题,重要的是要注意问题开始时事件调度程序保持打开状态,并且事件保持启用状态,然后服务器从任务管理器中的服务重新启动。 CPU 立即达到最大和活动连接显示线程堆积而未完成。 感谢任何线索,我发现没有 actual 错误,我也不知道从哪里开始调试了。我试过跳过 grant tables(但显然这不是最优的,也没有用)。
我在查看 MySQL 8.0+ 文档时确实找到了提示
"如果重复事件没有在其调度间隔内终止,结果可能是事件的多个实例同时执行。如果这是不可取的,您应该建立一种机制来防止同时发生实例。例如,您可以使用 GET_LOCK() 函数,或行或 table 锁定。”来自
然而,在分析时似乎没有任何锁,我也不需要为这个测试用例(或我的实际程序)手动实现这样的锁
更新
到目前为止,尽管这是一个相当小众的错误,但我确实相信这就是问题所在,并且我已将其发布在 MySQL 错误论坛上。
答案实际上是一个可重现的错误 - Bug#: 100449