python-3.x 接口错误:2013:在查询过程中与MySQL服务器失去连接

gg58donl  于 2023-05-19  发布在  Python
关注(0)|答案(3)|浏览(181)

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

谁能解释一下这段代码有什么问题,为什么我会得到这个错误。请解释我如何解决这个问题?

6l7fqoea

6l7fqoea1#

Mysql documentation,这里是这个问题的原因.
通常它表示网络连接故障,如果此错误经常发生,则应检查网络状况。如果错误消息中包含“during query”,则可能是您遇到的情况。
他们所述的解决方法是:
net_read_timeout从默认值30秒增加到60秒或更长时间
如何在Python中做到这一点:
如果您使用的是SQLAlchemy,请在连接引擎函数中添加timeout参数,这样就可以了。
这里有一个例子

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抓取的。

zc0qhyus

zc0qhyus2#

如果您在对特定表执行事务控制操作(提交和回滚)后遇到MySQL数据库问题,并且无法执行任何进一步操作或删除表,则可以采取以下几个步骤来解决问题:
1.重新启动MySQL服务:尝试重新启动MySQL服务或服务器。这可以帮助解决可能妨碍进一步操作的任何临时问题或锁定。重新启动后,尝试再次执行必要的操作。
1.检查活动事务:验证是否存在可能导致问题的活动事务。可以在MySQL中使用SHOW PROCESSLIST命令查看活动进程和事务。如果发现任何长时间运行或卡住的事务,可能需要使用KILL命令终止它们。
1.增加超时设置:如果问题仍然存在并且遇到超时错误,可以尝试在MySQL中增加超时设置。例如,您可以修改MySQL配置文件(通常是my.cnf或my.ini)中的wait_timeout和interactive_timeout变量,或者通过运行SQL语句,如SET GLOBAL wait_timeout = 3600;.
1.优化表:如果遇到问题的表很大或者有性能问题,可以尝试对其进行优化。使用OPTIMIZE TABLE命令重建表的索引并优化其存储。这可以帮助解决任何损坏或碎片化问题。
1.使用FORCE选项删除表:如果无法使用常规DROP TABLE语句删除表,可以尝试使用带有FORCE选项的DROP TABLE语句。此选项强制删除表,即使存在外键约束或其他依赖项。请谨慎使用此选项,因为如果使用不当,可能会导致数据丢失。
如果存在your_table_name FORCE;如果上述步骤都无法解决问题,则可能需要咨询数据库管理员或MySQLMaven,以调查并解决您面临的特定问题。

lnvxswe2

lnvxswe23#

参考以下表格:https://dev.mysql.com/doc/refman/5.7/en/error-lost-connection.html
B.5.2.3失去与MySQL服务器的连接
此错误消息可能有三种原因。
通常它表示网络连接故障,如果此错误经常发生,则应检查网络状况。如果错误消息中包含“during query”,则可能是您遇到的情况。
有时,当数百万行作为一个或多个查询的一部分被发送时,会出现“查询期间”形式。如果您知道正在发生这种情况,则应尝试将net_read_timeout从默认值30秒增加到60秒或更长时间,以足以完成数据传输。
更罕见的情况是,它可能发生在客户端尝试初始连接到服务器时。在这种情况下,如果connect_timeout值仅设置为几秒,则可以通过将其增加到10秒来解决问题,如果连接距离很长或速度很慢,则可能需要更长时间。您可以通过使用SHOW GLOBAL STATUS LIKE 'Aborted_connects'来确定是否遇到了这种更不常见的原因。服务器每中止一次初始连接尝试,它将增加1。您可能会看到“正在阅读授权包”作为错误信息的一部分;如果是这样,这也表明这是您需要的解决方案。
如果不是上述原因,则可能遇到BLOB值大于max_allowed_packet的问题,这可能导致某些客户端出现此错误。有时候你可能会看到一个ER_NET_PACKET_TOO_LARGE错误,这表明你需要增加max_allowed_packet。
请尝试使用以下命令增加连接超时:

`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 )`

希望这能帮上忙。

相关问题