我有一些游戏,其中用户的健康状况和其他属性每隔几分钟就会使用 MySQL 事件更新一次。我遇到了一个问题,最终事件不再运行,事件中的 SQL 不会被执行。
我不确定如何修复它,所以我尝试重新启动 MySQL,这修复了它一段时间。我将 MySQL 设置为每天晚上在 cron 中重新启动,但这不是一个很好的解决方案。有时 MySQL 无法重新启动并挂起。
编辑:我的数据库中使用事件的所有表都是 InnoDB。
可能是您的事件未完成并持有许多锁。最终,额外的作业将“堆积”,每个作业都试图获取锁,但似乎没有做任何工作。如果您使用 MyISAM 表,则尤其如此,因为它们具有表级锁定,而不是行级锁定。
考虑配置 pt-stalk(Percona Toolkit 的一部分)来捕获“show processlist”的定期快照和其他重要细节。然后,您可以追踪事情何时“停止工作”,并回溯到问题开始的时间。
为了防止作业“堆积”,请使用 GET_LOCK 函数:
SELECT GET_LOCK('THIS_IS_A_NAMED_LOCK', 0) INTO @got_lock;
IF @got_lock = 1 THEN
select 'do something here';
SELECT RELEASE_LOCK('THIS_IS_A_NAMED_LOCK') INTO @discard;
END IF;
如果您使用的是 InnoDB,请确保在事件中发出 START TRANSACTION 和 COMMIT 命令,以确保您不会创建长时间运行的事务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)