Python3升级后执行MySQL DELETE查询挂起无响应问题求助
可能的问题排查点
- 锁等待(最高概率)
其他未提交的事务持有member_additional_skills表的行锁、表锁或者元数据锁,导致你的DELETE操作一直处于等待状态无返回。验证方式:登录MySQL执行show processlist;,查看对应连接的State字段是否为Waiting for table metadata lock、Waiting for table level lock这类等待锁的状态;也可以执行show engine innodb status;查看InnoDB的事务锁等待明细,找到持有锁的事务处理即可。 - 未设置执行超时参数
mysql.connector默认未开启查询超时,会无限等待服务端返回,所以即使底层出现问题也不会主动抛错中断。可以在建立连接时添加connection_timeout=30参数限制连接超时,执行SQL时添加timeout参数限制查询超时,示例:# 连接时加超时 cnx = mysql.connector.connect( host=config["MySQL"]["host"], user=config["MySQL"]["user"], port=config["MySQL"]["port"], passwd=config["MySQL"]["password"], database=config["MySQL"]["database"], connection_timeout=30 ) # 执行SQL时加超时,单位秒 cur.execute("DELETE FROM member_additional_skills", params=None, timeout=10) - 链路中间件/网络断连
如果你的数据库连接走了代理(ProxySQL、MaxScale等)、防火墙、安全组,这类中间件会默认切断长时间无数据交互的空闲连接,客户端未收到服务端返回就会一直阻塞。你看到的client_loop: send disconnect: Broken pipe是SSH连接超时断开的提示,和脚本本身的阻塞是独立现象,说明你是在远程SSH终端运行的脚本,SSH先断了。 - 驱动版本兼容性问题
旧版本的mysql-connector-python和Python3、MySQL 8.0+存在兼容性bug,可能导致执行SQL时无响应,可以尝试升级驱动版本:pip install --upgrade mysql-connector-python。 - 表结构损坏
小概率情况是目标表出现逻辑损坏,可在MySQL命令行执行CHECK TABLE member_additional_skills;检查表状态,如有损坏执行REPAIR TABLE member_additional_skills;修复即可。
快速验证方法
直接登录MySQL服务端命令行,执行同样的DELETE和ALTER语句:
DELETE FROM member_additional_skills; ALTER TABLE member_additional_skills AUTO_INCREMENT = 1;
如果命令行执行也是卡住,直接定位数据库侧的锁或者表问题;如果命令行秒执行完成,就排查连接链路、代码驱动参数的问题。
内容的提问来源于stack exchange,提问作者ThurstonLevi
相关产品推荐
相关产品推荐

