首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >default_socket_timeout和mysql.connect_timeout之间的确切关系是什么?

问default_socket_timeout和mysql.connect_timeout之间的确切关系是什么?
EN

Stack Overflow用户
提问于 2018-08-25 00:01:07
回答 1查看 1K关注 0票数 0

StackExchange上有许多文章和答案建议使用这样的行(甚至更长的超时),以避免在长时间运行过程中出现MySQL超时错误(例如,但不限于,"MySQL服务器已消失“):

代码语言:javascript
复制
ini_set('mysql.connect_timeout', 300);
ini_set('default_socket_timeout', 300);

然而,我找不到一个很好的解释来解释这些是如何解决问题的。在许多情况下,它们似乎是没有明确基础的货物狂热编程。我很好奇这些设置如何精确地影响MySQL连接生命周期:官方文档对它们的应用和测量都是含糊其辞的。

据我所知,mysql.connect_timeout只与MySQL的原始连接有关。因此,在最初成功建立连接后,此设置似乎与连接失败问题无关。设置default_socket_timeout可能与以后的连接问题更相关,但不清楚到底是什么触发了超时。它是否也只与连接相关,或者是整个套接字生命周期的超时?是什么触发了超时?交通不畅?缺少特定类型的流量?

准确地了解它们如何与MySQL连接交互对于能够合理地推断错误行为是很重要的。

EN

回答 1

Stack Overflow用户

发布于 2018-08-25 02:57:02

这两个设置都与在长时间运行的进程中获得"mysql已消失“无关。MySQL过去没有办法限制查询的最长运行时间,因此它们可以永远运行,而且因为在I/O事件期间不会检查phps的最大执行时间,所以它不会停止查询。

要限制SQL查询运行时,您可以在5.7中使用一个新的MySQL特性:

代码语言:javascript
复制
SELECT /*+ MAX_EXECUTION_TIME(1000) */ status, count(*) FROM articles GROUP BY status ORDER BY status;
SET SESSION MAX_EXECUTION_TIME=2000;
SET GLOBAL MAX_EXECUTION_TIME=2000;

我在这里写了一篇关于这方面的博客文章,详细介绍了:

https://tideways.com/profiler/blog/use-timeouts-to-prevent-long-running-select-queries-from-taking-down-your-mysql

但是要修复MySQL的消失,你需要在你的长时间运行的脚本中找到一个点,在你知道它有一段时间没有做一些事情的地方,并添加一个"ping“。

代码语言:javascript
复制
try {
    $pdo->query("SELECT 1");
} catch (PDOException $e) {
    if (stripos($pdo->getMessage(), "mysql gone away")) {
        // reconnect
    }
}

这样,无论何时mysql离开,您都可以重新连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52008064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档