【发布时间】:2019-01-27 15:28:42
【问题描述】:
在使用 MySql (Aurora) 时,我开始注意到奇怪的查询丢失了,而且工作人员只是永远挂起。经过一番调查,似乎在 AWS 中运行相同的代码是可以的,但在 Azure 上它只是永远挂起!
似乎原因是 Azure 只是简单地杀死了空闲的连接(如长时间运行的查询)。请注意,我可以在一个甚至没有负载均衡器的虚拟机上重现它。
这可以通过以下date && time mysql -h$SERVER -u$USER -D mydb -p$PASS -e "SELECT SLEEP(260);"重现
请注意,我用 240、250 对其进行了测试,但在 260 时它会死机。 但不只是死去,挂起,永远!看起来 Azure 甚至都懒得告诉套接字死掉所以 MySql 客户端挂起。
我们有从 NodeJs 和 Python 运行的查询,所以我需要一个在可能的情况下都适用的解决方案。
这里有一个很好的例子:https://imgur.com/gallery/FCV8ZWb(注意我必须在另一个会话中杀死 mysql 才能真正释放它)
【问题讨论】:
-
是否有类似stackoverflow.com/a/40913764/3968921 这样的配置参数可用于配置长时间运行查询的阈值。另外我认为你应该终止查询而不是关闭套接字连接。 Socket 可以被不同的查询重用。
-
@AnkitDeshpande 虽然它使查询失败并且没有挂起,但我希望能够真正修复它,而不仅仅是减轻挂起。
-
你在寻找什么样的修复,查询应该无限运行直到完成?
-
是的,有时我们的查询需要 4 分钟以上才能完成。
-
通常最好避免长时间运行的查询。尝试优化您的查询,您可能可以将其分解为多个批次。应该有一些阈值需要配置以允许查询运行长达 4 分钟。
标签: python mysql node.js azure