杀死MySQL中的长时间运行进程

时间:2018-05-10 04:18:40

标签: mysql mariadb query-optimization kill mysql-slow-query-log

场景 - 您在从属计算机上运行了数百个报告。这些报告由MySQL的事件调度程序安排,或通过Python / R或Shell脚本调用。除此之外,有五十多个用户连接到运行随机查询的MySQL slave。这些人真的不知道如何撰写好的查询,这是公平的。他们不应该这样做。因此,每隔一段时间(每天阅读),您会看到一些由于读/写锁而被卡住的查询。你是如何解决这个问题的?

你做的是你不会杀死所写的任何东西。相反,您将终止所有读取查询。现在,这也很棘手,因为如果你杀死所有读取查询,你也会放弃OUTFILE查询,这些查询实际上是写查询(他们只是不写入MySQL,而是写入磁盘) )。

为什么必须进行杀戮(我只是在为MySQL发言,不要脱离这种情况)

我有两个字 - Slave lag。我们不希望这种情况发生,因为如果发生这种情况,所有用户,报告,消费者都会受到影响。

我已根据三个问题编写了以下内容来杀死MySQL中的进程

  • 查询运行了多长时间?
  • 谁正在运行查询?
  • 你想杀死write/modify个查询吗?

我故意没有做的是我没有保留已被杀死的过程的历史。人们应该这样做,以便分析并找出谁在运行所有错误的查询。但还有其他方法可以找到它。

我为此创建了一个程序。避风港花了很多时间在这上面。所以,请建议这是否是一个好的方法。

GitHub Gist

1 个答案:

答案 0 :(得分:1)

切换到MariaDB。版本10.0和10.1实现了多个限制和超时:https://mariadb.com/kb/en/library/query-limits-and-timeouts/

然后在用户编写和实际访问数据库之间编写API。在此图层中,添加适当的限制。