2014-10-22 33 views
10

Khi tôi chạy các truy vấn lớn (truy vấn trả về nhiều hàng), tôi gặp lỗi Lost connection to MySQL server during query và tôi không thể thấy những gì tôi làm sai. Tôi sử dụng trình điều khiển mysql "mới" từ mysql.com (không phải là MySQLdb cũ) và phiên bản mysql được đóng gói với MAMP. Python 2.7. Bảng không bị hỏng, analyze table nrk2013b_tbl; trả lại trạng thái ok. Dưới đây là một ví dụ mà phá vỡ:Tại sao kết nối mysql ngắt kết nối (lỗi "Mất kết nối với máy chủ MySQL trong khi truy vấn")

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

Điều này dẫn đến lỗi tôi nhận được hầu hết thời gian:

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 

Line 20 là rows = cur.fetchall()

Nếu tôi giới hạn truy vấn dẫn đến kết quả ít SELECT id FROM nrk2013b_tbl WHERE main_news_category = 'Sport' LIMIT 10 tất cả đều tốt. Nhưng tôi muốn làm việc với các bộ kết quả lớn hơn. Đối với một số giải quyết vấn đề đặc biệt tôi đã di chuyển giới hạn và chia nhỏ dữ liệu tôi muốn thành các lô nhỏ hơn, nhưng điều này tiếp tục nảy sinh như một vấn đề.

Để mất kết nối-thời gian chờ, và max_allowed_packet, vv vào tài khoản, tôi có điều này my.cnf file: File: /Applications/MAMP/conf/my.cnf

[mysqld] 
max_allowed_packet = 64M 
wait_timeout = 28800 
interactive_timeout = 28800 
connect-timeout=31536000 

này dường như không thực hiện bất kỳ sự khác biệt (tôi thậm chí không chắc chắn nếu mysql nhận ra các cài đặt này). Khi tôi chạy truy vấn từ thiết bị đầu cuối hoặc từ Sequel Pro, nó hoạt động tốt. Nó chỉ là thông qua các mysql.connector python tôi nhận được những lỗi này.

Bất kỳ ý tưởng nào?

PS: Tôi đã tạm thời cho phép điều này và thay đổi thành PyMySQL thay vì mysql.connector của Oracle. Bằng cách thay đổi điều này, các vấn đề dường như biến mất (và tôi tự kết luận rằng vấn đề nằm trong đầu nối mysql oracle).

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

Điều đó có vẻ hoàn hảo, tôi dường như không thể làm cho nó hoạt động được. Khi tôi chạy các truy vấn từ thiết bị đầu cuối hoặc từ Sequel Pro, nó hoạt động tốt. Đó là chỉ khi tôi làm điều đó thông qua các mysql.connector python nó phá vỡ. – Eiriks

Trả lời

12

Tôi cũng phải chuyển sang PyMySQL. Tôi đang chạy pip 1.5.6, Python 2.7.8 và đã thử kết nối mysql 2.0.1

Tôi đã có thể chạy truy vấn từ bên trong Sequel Pro mà không có vấn đề gì, nhưng truy vấn Python của tôi sẽ thất bại với lỗi được mô tả trong câu hỏi sau khi chỉ trả lại một tập con các kết quả.

Chuyển sang PyMySQL và mọi thứ hoạt động như mong đợi.

https://github.com/PyMySQL/PyMySQL

Trong virtualenv:

pip install pymysql 

Trong mã:

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 

Chắc chắn là một lỗi trong mysql-connector-python.

3

Hãy thử tăng của bạn net_read_timeout (có thể là một giá trị mặc định của 30secs là quá nhỏ trong kịch bản của bạn)

Ref:

net_read_timeout

và nói chung:

B.5.2.3 Lost connection to MySQL server

+0

Cảm ơn bạn đã đề xuất. Dường như không tạo ra bất kỳ sự khác biệt nào. Tôi vẫn nghĩ rằng điều này đã làm với các kết nối, không mysql chính nó hoặc các thiết lập của nó. Các truy vấn hoạt động tốt từ terminal & Sequel Pro. Nó chỉ thông qua các kết nối oracle này không hoạt động. – Eiriks

0

Mở rộng câu trả lời của Christian. Thời gian chờ cho các truy vấn đọc (chọn) được đặt bởi net_write_timeout. Nó là một "viết" từ quan điểm của máy chủ.

0

Tôi cũng gặp sự cố tương tự. Trong trường hợp của tôi nó đã được giải quyết bằng cách nhận con trỏ theo cách này:

cur = connection.cursor(buffered=True) 
Các vấn đề liên quan