Почему разрыв mysql-соединения (ошибка "Потерянное соединение с MySQL-сервером во время запроса" )

Когда я запускаю большие запросы (запросы, возвращающие много строк), я получаю ошибку Lost connection to MySQL server during query, и я не вижу, что я делаю неправильно. Я использую "новый" драйвер mysql из mysql.com(а не "старый" MySQLdb) и версию mysql, которая поставляется вместе с MAMP. Python 2.7. Таблица не повреждена, analyze table nrk2013b_tbl; возвращает статус ok. Вот пример, который ломается:

#!/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()

Ответ 1

Мне также пришлось переключиться на 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.

Ответ 4

Расширение христианского ответа. Тайм-аут для запросов на чтение (select) устанавливается net_write_timeout. Это "запись" с точки зрения сервера.

Ответ 5

Я тоже сталкивался с подобными проблемами. В моем случае это было решено, получив курсор таким образом:

cur = connection.cursor(buffered=True)