本文转自:http://blog.itpub.net/7607759/viewspace-696781/

做为一款轻量级数据库软件,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的连接,此时向前端人员询问,告知响应慢的现象也已经消除,服务恢复正常。

处理MySQL数据库出现大量Locked的一个案例 (转)的更多相关文章

  1. MySQL数据库的10大经典错误案例

    学习任何一门技术的同时,其实就是自我修炼的过程.沉下心,尝试去拥抱数据的世界! 案例一 Too many connections (连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原: 解决 ...

  2. mysql数据库使用mysqldump工具针对一个数据库备份,使用--databases选项与不使用该参数的区别

    需求描述: 今天在做mysqldump备份某个数据库的试验,在备份某个数据库的时候可以使用 --databases参数,也可以直接进行某个数据库的备份,那么这里记录下两者的区别 操作过程: 1.使用- ...

  3. MySQL数据库数据迁移:从一个服务器到另一个服务器

    需要两个服务器数据库版本相同才可迁移 1:单个或多个数据库 mysqldump -h远程ip -u用户 -p密码 -P3306 -- -uroot -p -P3306 执行后输入本地数据库密码即可 : ...

  4. mysql数据库中某项其中一个值在该项排第几,百分几

    SQL 如下: sql 1. SELECT X.USER_ID, X.TOTAL_NO, X.ORDER_NO, X.ORDER_NO / X.TOTAL_NO AS PERCENTAGE_NO AS ...

  5. mysql大量locked的一个案例

    转自 http://cyxu2004.blog.163.com/blog/static/45768718201222133440986/

  6. MySQL数据库干货分享!unsigned使用案例分析

    今天主要写一下unsigned的使用,进入正文前先分享一套博主觉得讲的很详细很实用的MySQL教程给大家 https://www.bilibili.com/video/BV1fx411X7BD 好了, ...

  7. JAVA对MySQL数据库的操作

    一.导包: 使用JDBC连接MySQL数据库时,首先需要导入一个第三方的JAR包(点击下载),下载解压得到一个JAR包,并导入到JAVA项目中,如下图: 二.DBHelper类: 代码如下: impo ...

  8. Mysql数据库的一些命令_LInux

    查看当前数据库的版本,因为有些命令在不同版本中 用法有可能不一样,注意 -V 是大写字母V[root@localhost ~]# mysqladmin -Vmysqladmin  Ver 8.42 D ...

  9. Mysqldb连接Mysql数据库(转)

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...

随机推荐

  1. 电脑小白学习软件开发-C#的选择语句、异常捕获,进攻程序员

    写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 不得不说,C#这门语言是小编以为最好的语言.其 ...

  2. 优雅的使用 PhpStorm 来开发 Laravel 项目

    [目录] Prerequisites plugin installation and configuration 1 Ensure Composer is initialized 2 Install ...

  3. 读jQuery官方文档:遍历

    遍历 jQuery的快捷遍历方法可以快速定位到想要的元素.查找祖先元素 html<div class="grandparent"> <div class=&quo ...

  4. 【转】myeclipse 上安装 Maven3

    [转]myeclipse 上安装 Maven3 环境准备: JDK 1.6 Maven 3.0.4 myeclipse 8.6.1 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Ma ...

  5. Java简单算法--出圈问题

    package cn.magicdu.algorithm; import java.util.LinkedList; import java.util.List; /** * 出圈问题,数到某个数字的 ...

  6. Android——列表视图(ListView)

    列表视图是android中最常用的一种视图组件,它以垂直列表的形式列出需要显示的列表项.在android中有两种方法向屏幕中添加列表视图:一种是直接使用ListView组件创建:另外一种是让Activ ...

  7. php ticks 调试应用

    declare(ticks=1); register_tick_function('do_profile'); register_shutdown_function('show_profile'); ...

  8. [jquery]高级篇--获取div子元素

    参考: http://zhidao.baidu.com/link?url=IfeQQBn1xMLqWvwdkKbQYJ8mC6ciGi_8M1NYkm6iQ-kXBMX2f2ylN-ckzFLiynn ...

  9. 14_CXF发布REST服务

    [rest服务] REST服务是一种软件架构模式,只是一种风格.REST服务采用HTTP做传输协议. REST对于HTTP的利用分为以下两种: 一.资源定位 REST要求对方资源定位更加准确,如下: ...

  10. 使用AutoMapper

    一.AutoMapper初探: [参考Using AutoMapper: Getting Started] 1.新建空的ASP.NET MVC项目. 2.在Models文件夹添加类: public c ...