我正在批量插入并收到错误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变量。
谢谢,
答案 0 :(得分:14)
MySQL为各个阶段使用不同的超时变量。
connection_timeout
wait_timeout
net_read_timeout
和net_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';
答案 1 :(得分:1)
我了解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的回答。
答案 2 :(得分:0)
当您使用与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)提取所有数据,则您的连接将中止。
来自doc的报价:
当服务器正在写入客户端时,net_write_timeout是控制何时中止的超时值
2019-08-14T15:20:26.465498Z 28440查询从员工选择的* *
2019-08-14T15:21:26.584634Z 28440 [注]与数据库的连接28440中止了:'员工'用户:'xxxx'主机:'localhost'(写入通信数据包时超时)