【问题标题】:InterfaceError: 2013: Lost connection to MySQL server during queryInterfaceError:2013:查询期间与 MySQL 服务器的连接丢失
【发布时间】:2022-01-18 21:01:50
【问题描述】:

当我尝试在 Google Cloud Platform 上使用 Python 连接到 MySql 数据库服务器时,我收到了错误消息。以下是实际代码。

import mysql.connector
import pandas as pd

cnx = mysql.connector.connect(user = 'xxxxxx', password='xxxxxx',
                              host='xxx.xxx.xxx.xx',
                              database='xxxxxxxxx')
cursor = cnx.cursor()
cnx.close()
if cur and con:                        
    cur.close() 
    con.close()
sql1 = "SELECT * FROM ms_trackevaluation_15_16.ms_skill"
cursor.execute(sql1)
rows = cursor.fetchall()
df1 = pd.read_sql(sql1, cnx)

以下是错误:

InterfaceError                            Traceback (most recent call last)
<ipython-input-2-30094be976fb> in <module>()
      4 cnx = mysql.connector.connect(user = 'xxxxx', password='xxxxx',
      5                               host='173.194.104.33',
----> 6                               database='xxxxx')
      7 cursor = cnx.cursor()
      8 cnx.close()

    /home/scrollstech_shravankumar/anaconda3/lib/python3.5/site-packages/mysql/connector/__init__.py in connect(*args, **kwargs)
        177         return CMySQLConnection(*args, **kwargs)
        178     else:
    --> 179         return MySQLConnection(*args, **kwargs)
        180 Connect = connect  # pylint: disable=C0103
        181 
    
    /home/scrollstech_shravankumar/anaconda3/lib/python3.5/site-packages/mysql/connector/connection.py in __init__(self, *args, **kwargs)
         93 
         94         if len(kwargs) > 0:
    ---> 95             self.connect(**kwargs)
         96 
         97     def _do_handshake(self):
    
    /home/scrollstech_shravankumar/anaconda3/lib/python3.5/site-packages/mysql/connector/abstracts.py in connect(self, **kwargs)
        714 
        715         self.disconnect()
    --> 716         self._open_connection()
        717         self._post_connection()
        718 
    
    /home/scrollstech_shravankumar/anaconda3/lib/python3.5/site-packages/mysql/connector/connection.py in _open_connection(self)
        205         self._socket = self._get_connection()
        206         self._socket.open_connection()
    --> 207         self._do_handshake()
        208         self._do_auth(self._user, self._password,
        209                       self._database, self._client_flags, self._charset_id,
    
    /home/scrollstech_shravankumar/anaconda3/lib/python3.5/site-packages/mysql/connector/connection.py in _do_handshake(self)
         97     def _do_handshake(self):
         98         """Get the handshake from the MySQL server"""
    ---> 99         packet = self._socket.recv()
        100         if packet[4] == 255:
        101             raise errors.get_exception(packet)
    
    /home/scrollstech_shravankumar/anaconda3/lib/python3.5/site-packages/mysql/connector/network.py in recv_plain(self)
        241                 chunk = self.sock.recv(4 - packet_len)
        242                 if not chunk:
    --> 243                     raise errors.InterfaceError(errno=2013)
        244                 packet += chunk
        245                 packet_len = len(packet)
    
    InterfaceError: 2013: Lost connection to MySQL server during query

谁能解释这段代码有什么问题以及为什么我会收到这个错误。请解释我该如何解决这个问题?

【问题讨论】:

  • 你能检查一下你的mysql服务器是否暴露了端口用于通信。默认情况下它的 3306 除非你已经修改它。似乎只是网络问题。
  • 我没有修改过。端口号与根服务器和我现在使用的服务器相同。
  • 然后在你的服务器中寻找防火墙,也许那是限制默认端口上的通信。

标签: mysql python-3.x pandas


【解决方案1】:

来自Mysql documentation,这是该问题的原因。

通常表示网络连接有问题,您应该检查 如果此错误频繁发生,则说明您的网络状况。如果 错误消息包括“查询期间”,这可能是您的情况 正在经历。

他们所说的解决方法是:

将net_read_timeout 从默认的 30 秒增加到 60 秒或更长时间

如何在 python 中做到这一点:

如果您使用的是 SQLAlchemy,请在连接引擎函数中添加超时参数,这样就可以了。

这是一个例子

from sqlalchemy import create_engine

engine = create_engine(self.writer_url, 
                       connect_args={'connect_timeout': 120},
                       pool_pre_ping=True)

pool_pre_ping 是从this answer 抓取的。

【讨论】:

    【解决方案2】:

    参考以下表格: https://dev.mysql.com/doc/refman/5.7/en/error-lost-connection.html

    B.5.2.3 与 MySQL 服务器的连接丢失

    此错误消息有三个可能的原因。

    通常表示网络连接有问题,如果经常出现此错误,请检查网络状况。如果错误消息包括“查询期间”,则可能是您遇到的情况。

    有时,当作为一个或多个查询的一部分发送数百万行时,会出现“查询期间”形式。如果您知道正在发生这种情况,您应该尝试将 net_read_timeout 从其默认的 30 秒增加到 60 秒或更长,足以完成数据传输。

    更罕见的是,当客户端尝试与服务器建立初始连接时,可能会发生这种情况。在这种情况下,如果您的 connect_timeout 值仅设置为几秒钟,您可以通过将其增加到 10 秒来解决问题,如果您的距离很长或连接速度较慢,可能会更长。您可以通过使用 SHOW GLOBAL STATUS LIKE 'Aborted_connects' 来确定您是否遇到这种更不常见的原因。对于服务器中止的每次初始连接尝试,它将增加一。您可能会在错误消息中看到“读取授权数据包”;如果是这样,这也表明这是您需要的解决方案。

    如果原因不是刚刚描述的那些,您可能会遇到大于 max_allowed_pa​​cket 的 BLOB 值的问题,这可能会导致某些客户端出现此错误。有时您可能会看到 ER_NET_PACKET_TOO_LARGE 错误,这确认您需要增加 max_allowed_pa​​cket。

    请尝试使用以下方法增加连接超时:

    `cnx = mysql.connector.connect(user = 'shravan2018', password='password',
                                  host='173.194.104.33',
                                  database='ms_trackevaluation_15_16',
                                  connect_timeout=1000 ,
                                  wait_timeout=28800 ,
                                  interactive_timeout=28800 )`
    

    希望这会有所帮助。

    【讨论】:

    • 我按照您的步骤进行操作,但出现此错误,“AttributeError: Unsupported argument 'interactive_timeout'”
    • 对不起。 mysql.connector.connect(*args,**kwargs) 不支持 'wait_timeout' 和 'interactive_timeout' 尝试去掉这两个参数。
    • 抱歉,再次遇到同样的错误“InterfaceError: 2013: Lost connection to MySQL server during query”。
    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2015-09-22
    相关资源
    最近更新 更多