【发布时间】: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