加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_镇江站长网 (https://www.0511zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL常规日志排错 - MySQL教程

发布时间:2014-03-20 00:39:45 所属栏目:MySql教程 来源:站长网
导读:MySQL版本:5.0.82 测试环境中,开发人员告诉我,数据库无法insert插入提示 lock wait timeout; 第一印象是被某个语句锁住,多次执行show full processlist 查
MySQL版本:5.0.82

测试环境中,开发人员告诉我,数据库无法insert插入提示 lock wait timeout;

第一印象是被某个语句锁住,多次执行show full processlist 查看对同一个表执行的操作,查看 show engine innodb statusG  只显示被锁住的语句,未显示被哪个语句锁住(在官方5.5版本中同样也是显示这样的情况,在mariadb分支中,显示的信息比较详细!);

这个时候采取的办法是打开 innodb 监控器,innodb_lock_monitor 16s 检测一次,在测试程序的时候仍然一无所获;此时我们只能开始怀疑 os问题,cpu负载,磁盘IO;由于网络是隔离的,起初怀疑网络原因,导致连接经常断掉,调整为同一个网络仍然无效;后来将数据全部mysqldump出来(这样排除了磁盘未损坏的问题,至少能读取)

这种情况只能去怀疑程序的问题,java 采用连接池,当初怀疑某个未commit的线程被复用的问题;这次打开了 general log; 显示的格式为: time   thread id      SQL语句;这次我们有较大的收获;通过比较commit 与 set autocommit 个数不同,对应到具体线程,即可知道哪个线程未提交事务;这个时候剩下的就是让开发人员修改代码啦。

小结:对于官方原版的数据库。5.5 及以下版本的锁信息 显示的是不全面的,可以的话切换为mariadb版本;针对锁信息的查看,可以使用5.5中新功能:performance_schema ,这个锁问题很方便;general log 要好好利用,他是诊断故障,测试性能的救命稻草!!

本文出自 “技术成就梦想” 博客,请务必保留此出处http://weipengfei.blog.51cto.com/1511707/1200443

查看本栏目更多精彩内容:http://www.bianceng.cn/database/MySQL/

(编辑:应用网_镇江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!