2014-10-22 2 views
10

Когда я запускаю большие запросы (запросы, возвращающие многие строки), я получаю ошибку 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() 
+0

FYI: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_connect_timeout – Shaeldon

+1

Это выглядит идеально, я просто не могу заставить его работать. Когда я запускаю запросы с терминала или из Sequel Pro, он работает нормально. Только когда я это делаю через python mysql.connector, он ломается. – Eiriks

ответ

12

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

3

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

Ref:

net_read_timeout

и вообще:

B.5.2.3 Lost connection to MySQL server

+0

Спасибо за предложение. Кажется, не имеет никакого значения. Я все еще думаю, что это связано с коннектором, а не с самим mysql или его настройками. Запросы отлично работают с терминалом & Sequel Pro. Это просто через разъем oracle, это не работает. – Eiriks

0

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

0

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

cur = connection.cursor(buffered=True) 
Смежные вопросы