大きなクエリ(多くの行を返すクエリ)を実行すると、_Lost connection to MySQL server during query
_エラーが表示され、何が問題なのかわかりません。私はmysql.comの「新しい」mysqlドライバー(「古い」MySQLdbではない)と、MAMPにバンドルされているmysqlバージョンを使用しています。 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
_で問題ありません。しかし、私はより大きな結果セットで作業したいと思っています。アドホックな問題解決のために、制限を移動し、必要なデータを小さなバッチに分割しましたが、これは問題として浮上しています。
Connect-timeoutや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:これを一時的にあきらめて、Oracle mysql.connectorではなくPyMySQLに変更しました。これに変更することで、問題は消えたように見えます(そして、私は問題がOracle 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()
_
また、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秒はシナリオでは小さすぎます)
参照:
そして一般的に:
私も同様の問題に遭遇しました。私の場合、カーソルを次のようにして解決しました:
cur = connection.cursor(buffered=True)
MySQL Connector/Pythonのバグのようです: http://bugs.mysql.com/bug.php?id=7448
まだリリースされていない 2.0. で修正する必要があります。
クリスチャンの答えを拡張します。読み取りクエリ(選択)のタイムアウトは net_write_timeout によって設定されます。サーバーから見た「書き込み」です。