【问题标题】:What is MySQL's wait_timeout, net_read_timeout and net_write_timeout variable?MySQL 的 wait_timeout、net_read_timeout 和 net_write_timeout 变量是什么?
【发布时间】:2015-12-19 09:48:30
【问题描述】:

我正在批量插入并收到错误Mysql2::Error: Lost connection to MySQL server during query:

我在互联网上搜索了这个错误以及大多数要求增加net_read_timeout值的博客/文章。

我在互联网上搜索了net_read_timeout,但没有找到任何以易于理解的语言描述它的文章/博客。 在 MySQL 网站上,net_read_timeout 被描述为"The number of seconds to wait for more data from a connection before aborting the read"。我完全被这个说法弄糊涂了,不明白。

我也想知道 net_write_timeout 和 wait_timeout 变量。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    MySQL 对不同阶段使用不同的超时变量。

    • 连接建立后使用connection_timeout
    • 当它等待下一个查询时,它使用wait_timeout
    • 当它在特定时间内没有收到查询时,它使用net_read_timeoutnet_write_timeout
    • 等等……

    通常net_read_timeout 应该不是问题,但是当您遇到一些网络问题时,尤其是在与服务器通信时,可能会引发此超时,因为您发送到数据库 MySQL 的不是用于查询的单个数据包等待整个查询被读取,但由于网络问题,它没有收到其余的查询。在完全获取查询结果之前,MySQL 不允许客户端与服务器通信。

    您无法正确更改这两个变量,毕竟它们是会话变量。

    也可以从 MySQL Doc 中阅读

    net_read_timeout:

    在中止读取之前等待来自连接的更多数据的秒数。当服务器从客户端读取时,net_read_timeout 是控制何时中止的超时值。当服务器写入客户端时,net_write_timeout 是控制何时中止的超时值。另见 slave_net_timeout。

    net_write_timeout:

    在中止写入之前等待将块写入连接的秒数。另见 net_read_timeout。

    您可以使用检查 MySQL 本身的默认变量

    > mysql show variables like '%timeout';

    【讨论】:

    • 我将 wait_timeout 设置为 30 秒并执行查询“select sleep(40)”,它会休眠 40 秒,然后我应该会收到 wait_timeout 错误,但我仍然没有收到等待超时错误。
    • 你能给我举个例子,说明如何手动引发 wait_timeout、net_read_timeout 和 net_write_timeout 异常,以便我更好地理解。
    • 这有点奇怪,你试过我的答案的查询吗?
    • 是的,我试过了,它只显示不同变量的超时值,仅此而已。你能给我举个例子来手动引发 wait_timeout 和 net_read_timeout 错误吗?
    【解决方案2】:

    我了解 wait_timeout 设置。 mysql 默认的 wait_timeout 是 28800 秒,即 8 小时。现在来了解 wait_timeout 的工作原理,执行以下 sql 语句。

    设置 wait_timeout = 10;

    执行上述语句后,如果mysql服务器10秒内没有收到任何sql语句,则会自动关闭连接。

    要对其进行测试,请等待 10 秒,然后执行任何 sql 查询,它会出现“查询执行期间 mysql 关闭连接”之类的错误

    将很快更新我对 net_read_timeout 和 net_write_timeout 的回答。

    【讨论】:

    • 我有一个类似的问题,我的网站不断下降,因为数据库中发生了如此多的插入,我该如何改进?
    【解决方案3】:

    当您使用非缓冲连接到 mysql 数据库时会发生这种情况,并且在执行查询后,您没有使用数据。 客户端 python 连接非缓冲 SSDictCursor

    connection = pymysql.connect(host='localhost',
                                 user='xxxx',
                                 password='xxxx',
                                 db='employees',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.SSDictCursor)
    sql = " select * from employees"
    cursor = connection.cursor()
    cursor.execute(sql)
    cursor.fetchone()
    

    什么都不做,你的连接将超时 或者 如果没有在 60 秒内(net_write_timeout)获取所有数据,您的连接将被中止。
    引用文档: 当服务器写入客户端时,net_write_timeout 是控制何时中止的超时值

    2019-08-14T15:20:26.465498Z 28440 查询 select * from employees

    2019-08-14T15:21:26.584634Z 28440 [Note] Aborted connection 28440 to db: 'employees' user: 'xxxx' host: 'localhost' (写入通信包超时)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 2014-08-25
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多