当我运行大型查询(查询返回多行)时,我收到Lost connection to MySQL server during query
错误,我看不出自己做错了什么。我使用" new"来自mysql.com的mysql驱动程序(不是" old" 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_packet等,我有这个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()
答案 0 :(得分:15)
我还必须切换到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中的错误。
答案 1 :(得分:3)
尝试增加net_read_timeout
(在您的方案中,默认值30秒可能太小)
价:
一般来说:
答案 2 :(得分:1)
看起来像MySQL Connector / Python中的一个错误:http://bugs.mysql.com/bug.php?id=74483
应该在尚未发布的2.0.3中修复。
答案 3 :(得分:1)
我也遇到过类似的问题。在我的情况下,它通过以这种方式获取光标来解决:
cur = connection.cursor(buffered=True)
答案 4 :(得分:0)
扩展克里斯蒂安的答案。读取查询(选择)的超时由net_write_timeout设置。从服务器的角度来看,这是一个“写”。