问题 为什么mysql连接器断开(“在查询期间丢失与MySQL服务器的连接”错误)


当我运行大型查询(查询返回多行)时,我得到了 Lost connection to MySQL server during query 错误,我看不出我做错了什么。我使用mysql.com的“新”mysql驱动程序(不是“旧的”MySQLdb),以及与MAMP捆绑在一起的mysql版本。 Python 2.7。表没有损坏, analyze table nrk2013b_tbl; 返回状态确定。这是一个打破的例子:

#!/usr/bin/python2.7
# coding: utf-8

import sys
import mysql.connector # version 2.0.1

connection = mysql.connector.connect(
                    unix_socket="/Applications/MAMP/tmp/mysql/mysql.sock",
                     user="dbUsernam",
                      passwd="dbUserPassword",
                      db="nrk",
                      charset = "utf8",
                      use_unicode = True)
cur = connection.cursor()
cur.execute("USE nrk;")


sql = """SELECT id FROM nrk2013b_tbl WHERE main_news_category = 'Sport'"""
cur.execute(sql)
rows = cur.fetchall()

print rows

sys.exit(0)

这导致我大部分时间都会遇到错误:

Traceback (most recent call last):
  File "train_trainer_test.py", line 20, in <module>
    remaining_rows = cur.fetchall()
  File "/Library/Python/2.7/site-packages/mysql/connector/cursor.py", line 823, in fetchall
    (rows, eof) = self._connection.get_rows()
  File "/Library/Python/2.7/site-packages/mysql/connector/connection.py", line 669, in get_rows
    rows = self._protocol.read_text_result(self._socket, count)
  File "/Library/Python/2.7/site-packages/mysql/connector/protocol.py", line 309, in read_text_result
    packet = sock.recv()
  File "/Library/Python/2.7/site-packages/mysql/connector/network.py", line 226, in recv_plain
    raise errors.InterfaceError(errno=2013)
mysql.connector.errors.InterfaceError: 2013: Lost connection to MySQL server during query

第20行是 rows = cur.fetchall()

如果我将查询限制为结果较少 SELECT id FROM nrk2013b_tbl WHERE main_news_category = 'Sport' LIMIT 10 一切都很好。但我确实希望使用更大的结果集。对于一些特殊的问题解决方案,我已经移动了限制并将我想要的数据分解为较小的批次,但这仍然是一个问题。

为了考虑connect-timeout和max_allowed_pa​​cket等,我有这个my.cnf文件: File: /Applications/MAMP/conf/my.cnf 

[mysqld]
max_allowed_packet = 64M
wait_timeout = 28800
interactive_timeout = 28800
connect-timeout=31536000

这似乎没有任何区别(我甚至不确定mysql是否识别这些设置)。当我从终端或Sequel Pro运行查询时,它工作正常。它只是通过python mysql.connector我得到这些错误。

有任何想法吗?

PS:我暂时放弃了,改为PyMySQL而不是Oracle mysql.connector。通过改变这一点,问题似乎消失了(我自己总结出问题是在oracle mysql连接器中)。

import pymysql
conn = pymysql.connect(
                    unix_socket="/Applications/MAMP/tmp/mysql/mysql.sock",
                     user="dbUsernam",
                      passwd="dbUserPassword",
                      db="nrk",
                      charset = "utf8",
                      use_unicode = True)
conn.autocommit(True) # this I 
cur = conn.cursor()

4503
2017-10-22 14:37


起源

供参考: dev.mysql.com/doc/refman/5.0/en/... - Shaeldon
这看起来很完美,我似乎无法让它发挥作用。当我从终端或Sequel Pro运行查询时,它工作正常。只有当我通过python mysql.connector这样做时才会中断。 - Eiriks


答案:


我也不得不切换到PyMySQL。我正在运行pip 1.5.6,Python 2.7.8,并尝试了mysql-connector 2.0.1

我能够在Sequel Pro中运行查询而没有任何问题,但是在返回结果的一部分后,我的Python查询将因问题中描述的错误而失败。

切换到PyMySQL,事情按预期工作。

https://github.com/PyMySQL/PyMySQL

在virtualenv:

pip install pymysql

在代码中:

import pymysql

connection = pymysql.connect(user='x', passwd='x',
                                 host='x',
                                 database='x')

cursor = connection.cursor()

query = ("MYQUERY")

cursor.execute(query)

for item in cursor:
    print item

绝对是mysql-connector-python中的一个bug。


12
2017-11-05 00:57





尝试增加你的 net_read_timeout (在您的方案中,默认值30secs可能太小)

参考:

net_read_timeout

一般来说:

B.5.2.3与MySQL服务器的连接丢失


3
2017-10-23 14:43



谢谢你的建议。但是似乎没有任何区别。我仍然认为这与连接器有关,而不是mysql本身或其设置。终端和Sequel Pro的查询工作正常。它只是通过oracle连接器,这不起作用。 - Eiriks


看起来像MySQL Connector / Python中的一个错误: http://bugs.mysql.com/bug.php?id=74483

应该修复 2.0.3,尚未发布。


1
2018-01-26 17:33



易于应用补丁,它也适用于我 - koriander


扩展Christian的答案。读取查询(选择)的超时设置为 net_write_timeout。它是从服务器的角度来看“写”。


0
2018-03-15 10:17





我也遇到过类似的问题。在我的情况下,通过以这种方式获取光标解决了这个问题:

cur = connection.cursor(buffered=True)

0
2017-10-07 16:12