Когда я запускаю большие запросы (запросы, возвращающие многие строки), я получаю ошибку Lost connection to MySQL server during query
, и я не вижу, что я делаю неправильно. Я использую «новый» драйвер mysql из mysql.com (а не «старый» MySQLdb) и версию mysql, которая поставляется вместе с MAMP. Python 2.7. Таблица не повреждена, analyze table nrk2013b_tbl;
возвращает статус ok. Вот пример, который ломает:Почему разрыв mysql ломается (ошибка «Потерянное соединение с сервером MySQL во время запроса»)
#!/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
все хорошо. Но я хочу работать с большими наборами результатов. Для решения некоторых специальных задач я переместил предел и разбил данные, которые я хотел на более мелкие партии, но это продолжает вызывать проблемы.
Для того, чтобы взять тайм-аут подключения-и 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. Изменяя это, проблемы, кажется, исчезают (и я заключаю для себя, что проблема находится в оракуле 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()
FYI: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_connect_timeout – Shaeldon
Это выглядит идеально, я просто не могу заставить его работать. Когда я запускаю запросы с терминала или из Sequel Pro, он работает нормально. Только когда я это делаю через python mysql.connector, он ломается. – Eiriks