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()
FYI: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_connect_timeout – Shaeldon
Đ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