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

Когда я запускаю большие запросы (запросы, возвращающие много строк), я получаю сообщение « Lost connection to MySQL server during query ошибки 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 запрос результатом меньшего результата 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() 

  • О курсоре и итераторе mysql
  • cc1: ошибка: непризнанная опция командной строки «-Wno-null-conversion» при установке python-mysql на mac 10.7.5
  • Репликация GROUP_CONCAT для pandas.DataFrame
  • Проблемы с соединением Python: MySQLdb
  • конвертировать список в строку для вставки в мой sql в одной строке в python scrapy
  • правильный способ создания соединения с БД доступен во многих модулях python
  • 5 Solutions collect form web for “Почему разрыв mysql-соединения (ошибка «Потерянное соединение с MySQL-сервером во время запроса»)”

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

    Попробуйте увеличить net_read_timeout (возможно, значение по умолчанию 30 секунд в вашем сценарии слишком мало)

    Ref:

    net_read_timeout

    и вообще:

    B.5.2.3 Потерянное соединение с сервером MySQL

    Похож на ошибку в MySQL Connector / Python: http://bugs.mysql.com/bug.php?id=74483

    Должен быть исправлен в 2.0.3 , который еще не выпущен.

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

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

     cur = connection.cursor(buffered=True) 
    Python - лучший язык программирования в мире.