【问题标题】:For MYSQL 5.7.31 - Which Timeout variable should be changed for a transport connection: Connection timed out对于 MYSQL 5.7.31 - 应该为传输连接更改哪个超时变量:连接超时
【发布时间】:2020-11-16 07:56:27
【问题描述】:

我在 Linux ubuntu 上使用带有 C# 的 mysql 5.7.31

当我以编程方式删除一个大表或删除一个数据库时,我得到这个超时

Stack=MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command execution.
 ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered attempting to read the resultset.
 ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Reading from the stream has failed.
 ---> System.IO.IOException: Unable to read data from the transport connection: Connection timed out.
 ---> System.Net.Sockets.SocketException (110): Connection timed out
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at MySql.Data.MySqlClient.TimedStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
   at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
   at MySql.Data.MySqlClient.MySqlStream.LoadPacket()
   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()

为了解决这个问题我已经尝试过

  1. 我将此添加到我的连接字符串中

连接超时=60

  1. 我将此添加到我的 mysqld.cnf,重新启动并检查它是否显示变量。日志文件显示它在 42 秒后超时。

connect_timeout=60000 交互超时=60000 wait_timeout=60000

我认为问题是“无法从传输连接中读取数据:连接超时。”

但不确定需要更改哪个变量来解决此问题?

谢谢

【问题讨论】:

  • 增加数字甚至更高,直到你没有超时
  • 我将它设置为 60 秒,日志说它在 40 秒后超时。所以显然我所做的更改并没有影响系统。
  • dot net 也有超时,但是你应该检查进程列表中是否有进程正在阻塞,因为 drop 应该很快并且增加 60 秒以上
  • 我的猜测是我所做的更改对于传输异常超时不正确。我更改的变量是否正确?
  • tzhe ysql 连接器的超时时间与服务器的超时时间相同,如果您不知道是哪个罪魁祸首,请将 n 双方的超时时间增加到 35000000 看看是什么出来,但逐渐增加所有超时时间,你会发现哪个正在阻止连接。同样,当您启用通用锁定时,您会看到删除实际需要多长时间。

标签: mysql


【解决方案1】:

connect_timeout 仅在客户端和服务器在初始客户端连接期间执行握手时使用。如果客户端遇到Lost connection to MySQL server... 之类的错误,增加此值会有所帮助。默认值为 10 秒。

我从来没有理由调整这个变量,因为如果客户端无法在 10 秒内连接,它可能被防火墙或路由阻止,或者 MySQL 服务器根本没有运行或正在侦听另一个港口。在这些情况下,增加超时将无济于事。

wait_timeout 帮助客户端在查询之间长时间空闲。如果查询执行了很长时间,则不认为客户端处于空闲状态。空闲时间在查询完成时开始。默认值为 8 小时(28800 秒)。如果您的应用 SQL 语句执行期间超时,则此变量不相关。

interactive_timeout 就像 wait_timeout,但用于“交互式”客户端。此类别中的唯一客户端是mysql command-line client。您可以忽略此超时变量,除非您正在使用 mysql CLI。

您可能需要调整 net_read_timeoutnet_write_timeout。但我不认为其中任何一个都是必要的。

提示:在 Linux 上使用 XFS 作为 MySQL 数据目录的文件系统。删除表或模式要快得多,无论它们有多大。 XFS 也为其他工作提供了更好的性能,而不仅仅是删除表。

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 2022-01-21
    • 2014-07-24
    • 2011-03-29
    • 2018-07-15
    • 2019-03-14
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多