默认\u套接字\u超时和mysql.connect \u超时之间的确切关系?

sczxawaw  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(310)

网上有很多文章和stackexchange上的答案,它们建议使用这样的行(甚至更长的超时),以避免在长时间运行的进程中出现mysql超时错误(例如但不限于“mysql server已经消失”):

ini_set('mysql.connect_timeout', 300);
ini_set('default_socket_timeout', 300);

然而,我找不到一个很好的解释,究竟这些解决问题。在许多情况下,它们似乎是没有明确基础的货物崇拜节目。我很好奇这些设置对mysql连接生命周期的影响到底有多大:官方文档对它们的应用和测量时间含糊不清。
据我所知 mysql.connect_timeout 只与mysql的原始连接有关。因此,此设置似乎与最初成功建立连接后的连接失败问题无关。设置 default_socket_timeout 可能与以后的连接问题更相关,但不清楚究竟什么会触发超时。它是否也仅在连接时相关,还是整个套接字生存期的超时?什么触发了超时?交通不畅?缺少特定类型的流量?
准确地理解它们是如何与mysql连接交互的对于能够合理地解释错误行为非常重要。

dw1jzc5e

dw1jzc5e1#

这两种设置都与在长时间运行的进程中获取“mysql已经消失”无关。mysql以前没有办法限制查询的最大运行时间,因为它们可以永远运行,而且在i/o事件期间不会检查phps max execution time,所以它不会停止这一点。
要限制sql查询运行时,您可以在5.7中使用新的mysql功能:

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”。

try {
    $pdo->query("SELECT 1");
} catch (PDOException $e) {
    if (stripos($pdo->getMessage(), "mysql gone away")) {
        // reconnect
    }
}

这样你就可以在mysql离开时重新连接。

相关问题