处理MySQL数据库出现大量Locked的一个案例[转]
做为一款轻量级数据库软件,MySQL在使用过程中遇到访问速度慢,或者无法响应这类的问题,解决方式基本都有定式,一般第一反应都会是登录到MySQL, show processlist看看当前连接状态。
虽说简单,但show processlist显示的信息确实是相当有用,有一回,三思收到反馈说MySQL查询很慢,于是,赶紧登录到mysql中,执行show processlist查看当前连接信息:
mysql> show processlist;
+--------+-------------+--------------------+-------+---------+-------+----------------------------------+----------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-------------+--------------------+-------+---------+-------+----------------------------------+----------------------------------------------------------------------------------+
| 1 | system user | | NULL | Connect | 342266| Waiting for master to send event | NULL |
| 2 | system user | | hdpic | Connect | 872 | Locked | UPDATE a SET STATE=0 WHERE ID=83752 |
| 123890 | hdpic_read | 192.168.1.79:54910 | hdpic | Query | 1512 | Sending data | select z.ID,z.TITLE,z.CREATOR_USER_NICK,z.CREATOR_USER_IDEN,z.LASTEDITOR_TI |
| 124906 | hdpic_read | 192.168.1.39:18844 | hdpic | Query | 845 | Locked | select * from a where ((ID = 78789) AND (STATE != 0)) |
| 124912 | hdpic_read | 192.168.1.39:18862 | hdpic | Query | 845 | Locked | select * from a where ((ID = 16031) AND (STATE != 0)) |
| 124914 | hdpic_read | 192.168.1.39:18865 | hdpic | Query | 837 | Locked | select * from a where ((ID = 39109) AND (STATE != 0)) |
| 124917 | hdpic_read | 192.168.1.39:18875 | hdpic | Query | 833 | Locked | select * from a where ((ID = 16031) AND (STATE != 0)) |
................
................
................
一堆的Locked,怪不得慢啊,阻塞的时间不短了,十几分钟。
通常来说存在Locked就说明当前读写操作存在被阻塞的情况,一般我们看到锁都会下意识认为是由于写阻塞了读,上面的结果看仿佛也符合这一特征:只有一条UPDATE,而无数条的SELECT。猜是必须的,但不能瞎猜,这毕竟是线上系统,就算想杀连接的线程,也是要杀掉造成阻塞的那个,不能把所有Locked的全杀了,不然DBA本人很快也要被人杀了,因此具体情况如何还是需要继续分析。
从show processlist查看到的信息来看,UPDATE的语句是很简单的,分析a的表结构,该表为MyISAM表,ID为该表主键,该条更新应该能够瞬间执行完,即使系统繁忙也不应该,而且通过查看当前的系统状态,整体负载很低,iostat中看I/Owait几可忽略,该写操作不太可能这么长时间都没有执行完。
这个时候再分析show processlist中显示的信息,发现id 123890的语句执行时间最长,肯定是在该UPDATE语句之前执行的,通过show full processlist查看语句详表,看到该查询也访问到了a表,经此分析,应该是该语句长时间的读阻塞了写,而被阻塞的写操作由于处于最优先处理队列,又阻塞了其它的读。
不过这些都还只是我们的推论,考虑到线上系统服务的可靠性,最好还是能找到更确切的证据,而后再做操作。
mysqladmin命令有一个debug参数,可以分析当前MySQL服务的状态信息,同时也可以用来帮助我们定位当前锁的详细情况,这里我们通过该命令分析一下当前MySQL服务的详细状态,执行mysqladmin命令如下:
[root@phpmysql02 data]# mysqladmin -ujss -p -S /data/3306/mysql.sock debug
Enter password:
debug会将状态信息生成到mysql的错误文件,一般锁的信息都会保存在最后几行,这里我们在操作系统层error log最后几行:
[root@phpmysql02 data]# tail -10 phpmysql02.err
Thread database.table_name Locked/Waiting Lock_type
2 hdpic.t_wiki_zutu Waiting - write Highest priority write lock
123890 hdpic.t_wiki_zutu_category Locked - read Low priority read lock
123890 hdpic.t_wiki_zutu_photo Locked - read Low priority read lock
123890 hdpic.t_wiki_zutu Locked - read Low priority read lock
124906 hdpic.t_wiki_zutu Waiting - read Low priority read lock
从上述信息可以看出,123890持有的读锁阻塞了2的写入和124906的读操作,这个状态符合我们的推论,接下来处理就比较单纯了,如果现状不可接受,不能继续等待,将123890杀掉,释放资源即可:
mysql> kill 123890;
Query OK, 0 rows affected (0.00 sec)
再次执行show processlist查看:
mysql> show processlist;
+--------+-------------+--------------------+-------+---------+--------+----------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-------------+--------------------+-------+---------+--------+----------------------------------+------------------+
| 1 | system user | | NULL | Connect | 342390 | Waiting for master to send event | NULL |
| 124906 | hdpic_read | 192.168.1.39:18844 | hdpic | Sleep | 1 | | NULL |
| 124912 | hdpic_read | 192.168.1.39:18862 | hdpic | Sleep | 2 | | NULL |
| 124914 | hdpic_read | 192.168.1.39:18865 | hdpic | Sleep | 1 | | NULL |
| 124917 | hdpic_read | 192.168.1.39:18875 | hdpic | Sleep | 1 | | NULL |
| 124919 | hdpic_read | 192.168.1.39:18877 | hdpic | Sleep | 2 | | NULL |
................
................
................
已经没有Locked的连接,此时向前端人员询问,告知响应慢的现象也已经消除,服务恢复正常。
source:http://space.itpub.net/7607759/viewspace-696781
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7583803/viewspace-709225/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7583803/viewspace-709225/
处理MySQL数据库出现大量Locked的一个案例[转]相关推荐
- mysql数据库单用户模式_干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)
一大早就被电话吵醒了,云某项目数据库全挂了,启动不了(睡得太死,没听到报警短信),吓得不轻啊! 电话中说所有mysql数据库主库都启动不了,但从库正常,怀疑是主库去连其它阿里云的主库了.这些数据库,以 ...
- 下载了一堆mysql_干掉一堆mysql数据库,仅需这样一个shell脚本
一大早就被电话吵醒了,云某项目数据库全挂了,启动不了(睡得太死,没听到报警短信),吓得不轻啊! 电话中说所有mysql数据库主库都启动不了,但从库正常,怀疑是主库去连其它阿里云的主库了.这些数据库,以 ...
- mysql 对库中表授权_对mysql数据库的授权和使用AND案例
对mysql数据库的授权和使用 权限: create user 'guest'@'ip地址' identified by '123' //ipconfig 授权: grant 权限的具体使用 on.t ...
- MySQL数据库学习笔记,知识点和案例整理,期末三天复习完【简单且详细】
MySQL数据库近三万字学习笔记,超级详细! 文章目录 前言 一.day1 二.day2 三.day3 前言 MySQL数据库知识点和案例总结,非常详细,将近三万字!分成了三天去消化吸收! 一.day ...
- 【数据库数据恢复】华为云mysql数据库数据被delete的数据恢复案例
数据库数据恢复环境: 华为云ECS,linux操作系统: mysql数据库,实例内数据表默认存储引擎为innodb. 数据库故障: 在执行数据库版本更新测试时,用户误将本应在测试库测试的sql脚本执行 ...
- 如何使用python连接MYsql数据库,实现信息查询小案例
本文主要演示,在python中如何使用pymysql模块,链接MySQL数据库,实现多种条件,用户信息查询功能的小案例. 查询功能: 1.查询所有用户信息 2.查询所有用户姓名 3.查询单个用户工资 ...
- 【数据库数据恢复】MySQL数据库误删除未备份的数据恢复案例
MySQL数据库属于关系型数据库.SQL是一种用于操作关系型数据库的结构化语言.关系型数据库就是指在关系模型的基础上建立起来的数据库,是一种借助了集合代数等一些数学方法和数学概念处理数据的数据库. M ...
- 使用Mysql数据库完成增删改查综合案例(JSP页面)
本案例页面如下: 这是index.jsp页面(包含模糊查询) <%@ page language="java" contentType="text/html; ch ...
- python操作mysql数据库实现增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ...
最新文章
- 如何修改WINDOWS默认的3389远程端口
- Linux内核源码树建立加载hello模块
- Ubuntu下安装和配置Apache及Apache2
- Ubuntu启动显示System program problem detected 原因及解决方法
- html5 app 原理,html5打包成app应用的原理是什么?
- 算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结...
- 5. Browser 对象 - Screen 对象
- 人力资源管理系统如何助力提升HR工作效率
- html5如何直接源码,html5源码可以直接使用吗
- 任正非写给员工的信 - 要快乐地度过充满困难的一生
- CODEVS 1069 关押罪犯
- 计算机基础知识学习第七课,7、新建文件夹--电脑基础知识
- kdd19 Investment Behaviors can tell what inside:Exploring Stock Intrinsic Properties for Stock Trend
- 为什么别人不把你当回事(经典)
- 逆波兰式的转换与计算(简单)
- 使用Dockerfile创建openoffice镜像
- 中国行政区划数据下载
- ALSA-ASOC音频驱动框架简述
- ceph客户端挂在ceph集群存储作为本地文件系统来使用
- 四参数坐标转换c语言,四参数坐标转换原理和程序设计