Python 使用 MySQL,从 5.1 升级到 8.0, ALERT 有些命令,会卡(锁)死阻塞?

2022-03-25 18:20:07 +08:00
 qazwsxkevin

目前情况:
因为对 MySQL 完全不懂,目前也几乎能断定就是 MySQL 服务器执行目录有问题

Python 写的程序,以前在 CentOS6 自带的 MySQL5.1 上一直都是跑得稳稳的

最近因为要使用 JSON 数据和一些其它新特性,所以干脆搞了个测试环境,一步到位 MySQL8.0.28 先试试,

编译装上 MySQL8.0 后,跑了几步初始化就阻塞了,开始还以为是.28 版本有问题,就从.27 一直降到.12 都是这样,
才回头看,似乎是写的 MySQL 命令出了毛病
(期间也装过 5.7 ,也是同样情况)

代码篇幅无法在这里给出,
Python 与 MySQL 交互逻辑大概是这样:分 A 和 B 两个方面

A:
SQL 消息队列处理(Python 多进程+多线程),使用 Python 的 PoolDB 线程池,执行的指令只有 INSERT INTO,UPDATE,DELETE 三大类,
处理队列机制收到程序消息,就转换成 MySQL 命令,怼服务器
这个部分很 OK ,单独在 8.0 上测试过,增减删没有问题

B:
与服务器交互,按各种情况不同,去管理表内容,SELECT 一些内容等等,
程序卡在这里初始化的其中一步

SQLCommand = "ALTER TABLE `procLog` AUTO_INCREMENT = 0"      
SQLWriteData(sqlserverInfo,SQLCommand)      

测试过,
SQLCommand 凡是 ALTER 管理表的操作,都会阻塞等待服务器,看交互过程,cat /var/log/mysqld.log ,一点儿异常问题 warnning 什么的,都没有
my.cnf 都已经是用默认的了

在执行上面代码那一段的时候,A 已经写入了 40 多条数据了,不知道是否 A 的量,会导致 B 的阻塞?

但如果单独把上面的代码取出,作为单独步骤操作,又没有异常,不会阻塞

各位大哥,救救,如果情况的表达还是很模糊,请教教我还有一些什么思路,这一步,到底还可以怎么再往下看问题所在?
先谢谢了,不跟帖逐一回感谢的话了。。。

1428 次点击
所在节点    MySQL
5 条回复
qazwsxkevin
2022-03-25 18:21:14 +08:00
嗯? 好像是有些符号影响了 markdown 的排版效果? 不过没关系,应该不影响阅读
zmal
2022-03-26 00:07:05 +08:00
A 里有长事务,alter 在等锁?
话说你驱动更新了吗。
awolf
2022-03-26 00:07:24 +08:00
看看默認事務隔離策略是否有變更
rekulas
2022-03-31 18:44:15 +08:00
阻塞的时候查查进程,重点排查 wait for metadata lock 状态的,看是否有链接占用了锁又没执行
qazwsxkevin
2022-04-01 18:37:40 +08:00
经过多天折腾,缺失是有些 ALERT 命令造成了锁表,现在重写的很多 DDL,DML ,基本上算是找到原因,解决了问题,谢谢大家

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/842906

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX