web-dev-qa-db-ja.com

mysqlコネクタが壊れる理由(「クエリ中にMySQLサーバーへの接続が失われました」エラー)

大きなクエリ(多くの行を返すクエリ)を実行すると、_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_pa​​cketなどを考慮に入れるために、次の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()
_
15
Eiriks

また、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のバグ。

16
sheldonkreger

net_read_timeout(おそらく、デフォルト値の30秒はシナリオでは小さすぎます)

参照:

net_read_timeout

そして一般的に:

B.5.2.3 MySQLサーバーへの接続が失われました

3
Cristian Porta

私も同様の問題に遭遇しました。私の場合、カーソルを次のようにして解決しました:

cur = connection.cursor(buffered=True)
1
user6938211

MySQL Connector/Pythonのバグのようです: http://bugs.mysql.com/bug.php?id=7448

まだリリースされていない 2.0. で修正する必要があります。

1
Che

クリスチャンの答えを拡張します。読み取りクエリ(選択)のタイムアウトは net_write_timeout によって設定されます。サーバーから見た「書き込み」です。

0
codebard