MySQL中insert语句没有响应的问题分析(r11笔记第21天)
今天开发的一个同学问我一个MySQL的问题,说在测试数据库中执行一条Insert语句之后很久没有响应。我一看语句是一个很常规的insert into xxx values形式的语句。看起来有些不太合乎常理啊,我对这类问题立马来了兴趣,准备好好看看到底是什么原因。
向开发同学了解了环境之后,我登录到服务端,首先查看是否可能是磁盘空间不足导致的问题。结果df -h的结果显示,空间还绰绰有余。
使用show proceslist查看线程情况。
可以看到大量的线程是Waiting for table level lock ,开发同学提交的SQL语句也被锁住了,也是同样的锁。
| 253688 | webadmin | xxxx | pt_test | Query | 171 | Waiting for table level lock | insert into ptp_jgg(sub_type) values(9999)
这类表级锁好像在MyISAM中还是看到过,结果查看表的存储引擎,发现都是InnoDB,
对于这类问题的一种解决方法,就是使用kill的方式杀掉线程。
mysql> SELECT
-> a.*,CONCAT("kill " ,a.id,";")
-> FROM
-> information_schema.`PROCESSLIST` a
-> WHERE
-> a.STATE = 'Waiting for table level lock';
这样就会生成很规律的kill语句。
当然我也没有着急这么做,和开发同学简单了解,他们之前碰到这类问题,是找系统运维的同学直接重启MySQL的,看来这个问题之前也碰到过,这我就更有兴趣了解了。
查看MySQL的error log也没有发现什么明显的错误,使用ps -ef|grep mysql查看进程的信息,突然发现系统中是设置了一个定时任务去备份数据,不过开始没有引起我的注意,但是这些线索都逐一排除之后,我的注意力就很自然的落在了这个备份脚本上。
打开备份脚本,我就明白问题的原委了。
备份的核心语句是通过变量的方式调用mysqldump的。
mysqldump -uroot -p$passwd pt_test | $GZIP -9 > $dump_path/pt_test$date.gz
这样一来这个语句毫无疑问就是这个锁表的罪魁祸首。
默认mysqldump会调用--lock-all-tables这个选项,也就意味着master的binlog和postion信息写入SQL文件的头部,而通用的方式是使用--single-transaction
执行的时候会有短暂的全局读锁,影响要低得多。
所以这个问题的解决方式就很直接,当前解决就是直接kill掉正在进行的mysqldump,杀掉备份的mysqldump之后,再次查看show processlist,这些线程马上就是sleep状态了。
这样一来,这个问题就算是基本解决了,我想以后至少不会因为这样而无端重启MySQL了。
- 设计模式专题(二十一) ——中介者模式
- 设计模式专题(二十二) ——享元模式
- 设计模式专题(二十三) ——解释器模式
- Thinking in SQL系列之数据挖掘C4.5决策树算法
- 设计模式专题(二十四) ——访问者模式
- PHP实用功能——modern PHP读书笔记(一)
- ModernPHP读书笔记(二) ——PHP开发标准
- iBatis.Net(6):Data Map(深入)
- iBatis.Net(5):Data Map(了解)
- ModernPHP读书笔记(三)——PHP的良好实践
- PHP开发过程的那些坑(一) ——对象拷贝
- PHP开发过程的那些坑(二) ——PHP empty函数
- Thinking in SQL系列之数据挖掘Apriori关联分析再现啤酒尿布神话
- PHP开发过程的那些坑(三) ——PHParray_shift函数
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Python人工智能经典算法之机器学习第二篇
- Python人工智能经典算法之机器学习第三篇
- Python人工智能经典算法之K-近邻算法
- Python人工智能经典算法之线性回归
- Python人工智能经典算法之逻辑回归
- Python人工智能经典算法之决策树
- Python人工智能经典算法之聚类算法
- 【NPM库】- 0x06 - WebSocket
- 代码详解——《无人驾驶车辆模型预测控制》3.3.3代码详解
- 【前端】:模块化 - 打包技术
- 代码详解——《无人驾驶车辆模型预测控制》3.3.3参考路径更改
- MySQL redo与undo日志解析
- 样本不平衡造成的影响和解决方案
- 代码详解——NMPC路径跟踪复杂参考路径设置
- 代码详解——NMPC之加入控制平顺性惩罚项