在GCP上用Python连接MySQL查询时出现InterfaceError 2013错误求助
解决GCP上Python连接MySQL时的InterfaceError: 2013错误
先帮你揪出代码里直接导致错误的核心问题,再补充GCP环境下的额外排查方向:
1. 代码逻辑的致命错误
你当前的代码存在几个明显的顺序和变量问题:
- 连接被提前关闭:在创建
cursor后立刻调用了cnx.close(),直接切断了和MySQL服务器的连接,后续再用cursor执行查询自然会失败。 - 变量名不匹配:后面的
if cur and con:里的cur和con根本没定义,你实际用的变量是cursor和cnx,这段代码不仅无效,还会触发NameError。 - 查询顺序完全颠倒:你先关闭连接,再编写SQL语句并执行,逻辑完全混乱。
修复后的正确代码示例
import mysql.connector import pandas as pd # 第一步:先建立数据库连接 cnx = mysql.connector.connect( user='xxxxxx', password='xxxxxx', host='xxx.xxx.xxx.xx', database='xxxxxxxxx' ) try: # 第二步:创建游标、执行查询 cursor = cnx.cursor() sql1 = "SELECT * FROM ms_trackevaluation_15_16.ms_skill" cursor.execute(sql1) rows = cursor.fetchall() # 转换为DataFrame(补全你的后续逻辑) df1 = pd.DataFrame(rows, columns=[desc[0] for desc in cursor.description]) finally: # 第三步:最后统一关闭游标和连接,确保资源释放 if cursor: cursor.close() if cnx: cnx.close()
2. GCP环境下的额外排查方向
如果修复代码后仍然出现连接丢失错误,需要检查GCP相关配置:
- 防火墙规则验证:如果MySQL部署在GCP Cloud SQL或VM实例上,确保对应的防火墙规则允许你的客户端IP(或GCP内部服务IP)访问3306端口。
- MySQL超时参数调整:检查MySQL服务器的
wait_timeout和interactive_timeout参数,如果设置过短,闲置连接会被服务器主动断开。可以执行SHOW VARIABLES LIKE '%timeout%';查看,必要时修改配置文件(如my.cnf)并重启服务。 - 使用连接池优化:对于频繁的数据库操作,建议用连接池管理连接,避免反复创建/断开导致的不稳定。mysql-connector自带连接池支持:
from mysql.connector.pooling import MySQLConnectionPool pool = MySQLConnectionPool( pool_name="mypool", pool_size=5, user='xxxxxx', password='xxxxxx', host='xxx.xxx.xxx.xx', database='xxxxxxxxx' ) # 从池中获取连接 cnx = pool.get_connection() - 网络稳定性优化:如果是跨区域访问,尽量将客户端和MySQL实例部署在同一区域,减少网络延迟;也可以在代码中添加重连逻辑,捕获连接异常后尝试重新建立连接。
内容的提问来源于stack exchange,提问作者Shravan Kumar
相关产品推荐
相关产品推荐

