`
d2hellen
  • 浏览: 104244 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

[转]处理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的连接,此时向前端人员询问,告知响应慢的现象也已经消除,服务恢复正常。
原文转自:http://space.itpub.net/7607759/viewspace-696781
分享到:
评论

相关推荐

    MySQL数据库出现大量Locked的一个案例

    5. **死锁**:虽然案例中没有明确提到死锁,但在多线程环境下,如果两个或更多事务相互等待对方释放资源,就可能出现死锁,需要使用`SHOW ENGINE INNODB STATUS`来检查是否存在这种情况。 解决这些问题的方法包括:...

    大芒果_魔兽世界_mysql_数据库_详解.docx

    《大芒果_魔兽世界_MySQL_数据库_详解》 《大芒果_魔兽世界_MySQL_数据库_详解》是一份关于魔兽世界游戏数据库的详细解释,涵盖了游戏账号、角色数量、道具及任务物品等多方面的知识点。下面将对这些知识点进行详细...

    MySQL数据库应用案例视频教程下载第13讲 用户管理.zip

    在本节MySQL数据库应用案例视频教程中,我们将深入探讨用户管理这一关键主题。用户管理是数据库系统中的核心组成部分,因为它确保了数据的安全性和访问控制。MySQL作为广泛应用的关系型数据库管理系统,提供了强大的...

    MYSQL锁表问题的解决方法

    MySQL数据库在处理并发事务时,可能会出现锁表的问题,这通常发生在多个事务同时访问和修改同一数据时。当一个事务尚未完成,其他事务无法进行相关操作,就会导致锁表现象,影响数据库性能和应用的正常运行。本文将...

    sqlite死锁datebaselock解决方案

    在多线程环境下,由于并发操作不当,可能会出现“database is locked”(数据库被锁定)的错误,这通常涉及到SQLite的锁机制和事务处理。本文将深入探讨这个问题,并提供具体的解决方案。 一、SQLite锁机制 SQLite...

    解决sqlite死锁示例异常database is locked示例

    - **长时间持有锁**:一个事务长时间占用资源,使得其他事务无法进行。 **2. "database is locked"异常的识别** 当出现"database is locked"异常时,通常是因为某个事务在执行时被阻塞,无法完成操作。这可能是由于...

    mysql读写锁演示案例

    MySQL作为一款广泛使用的开源关系型数据库管理系统,提供了多种类型的锁来满足不同场景的需求,其中读写锁(Read-Write Lock)是其中一个重要的组成部分。 读写锁允许一个资源在同一时间被多个读取者访问,但只允许...

    Android多线程操作sqlite(Sqlite解决database locked问题)

    它是一个轻量级的数据库系统,支持多种数据库操作,如创建、查询、更新和删除数据。然而,在多线程环境中,由于并发访问数据库,可能会遇到“database locked”(数据库被锁定)的问题。本文将深入探讨如何在Android...

    SVN在客户端执行UPDATE报locked的处理办法

    2. **找到.svn目录**:进入工作副本目录下的`.svn`目录(注意这是一个隐藏目录)。 3. **删除.lock文件**:找到并删除`.lock`文件。删除后,尝试重新执行`svn update`命令。 #### 预防措施 为了减少类似问题的发生...

    MySQL 5.7(GA)版本新特性

    MySQL 5.7 GA版本作为数据库管理系统MySQL的一个稳定发行版,在数据库性能优化、安全增强、功能完善等方面都做出了重要的改进。本文将详细介绍MySQL 5.7 GA版本新引入的特性和一些已不再支持的系统参数。 在安全性...

    通过数据库给文件加锁

    - **锁定操作**:当一个用户请求访问文件时,应用会向数据库发送一个请求,设置该文件的锁定状态。如果文件未被锁定,数据库会返回成功并设置锁;如果已被锁定,则返回失败。 - **解锁操作**:用户完成文件操作后...

    数据库问题及解决方法

    数据库是任何应用程序的基础,尤其是那些处理大量数据的系统。在日常操作中,数据库用户可能会遇到各种问题,其中“ORA-00054: resource busy and acquire with nowait specified”是一个常见的错误,它通常出现在...

    Mysql 数据库死锁过程分析(select for update)

    MySQL数据库中的死锁是数据库管理系统中常见的问题,特别是在并发环境下,多事务操作可能导致死锁的发生。本文主要讨论了在使用`SELECT ... FOR UPDATE`语句时遇到的死锁情况,并通过具体的例子深入分析了死锁的原因...

    mysql启动-连接失败两例.txt

    - 如果没有备份,可以尝试重新创建一个空的 `mysql-bin.index` 文件,并重启 MySQL 服务。如果 MySQL 成功启动,则表示之前的问题可能是由 `mysql-bin.index` 文件损坏造成的。 #### 连接失败问题 **问题分析** ...

    oracle数据库锁表处理

    ### Oracle数据库锁表处理 在Oracle数据库管理过程中,锁表是一种常见的现象,它通常发生在多用户并发访问同一数据对象时。锁表会导致其他用户无法访问该数据对象,从而影响系统的正常运行。本文将详细介绍如何处理...

    使用Linux的Shell脚本定时处理MySQL超时

    总结起来,本文介绍了一个实用的Linux Shell脚本,用于定时清理MySQL的Locked进程,有效地提升了数据库的稳定性和效率。结合`crontab`,我们能够实现对MySQL的自动维护,这对于大型网站或业务系统来说至关重要,确保...

    数据库锁表问题解决方法

    此错误表明当前的操作因资源已被其他事务占用而无法继续执行,通常是因为另一个事务正在处理或已被锁定。 #### 二、问题分析 出现ORA-00054错误的主要原因有两个方面: 1. **并发冲突**:在多用户共享数据库资源...

    oracle数据库密码过期处理方法.docx

    此时,用户在尝试登录时会收到“ORA-28000: the account is locked”或“ORA-28001: the password has expired”的错误信息,无法进行任何操作。 二、处理密码过期的方法 1. **紧急模式登录(SQL*Plus as SYSDBA)*...

    oracle 检测数据库是否有对象被锁的脚本

    对象锁是数据库管理系统用于控制并发访问的一种机制,它确保了在任何时间只有一个用户或进程可以修改特定的对象,如表、索引或视图。Oracle提供了多种类型的锁,包括排他锁(X)、共享锁(S)、意向锁(IX和IS)等,...

Global site tag (gtag.js) - Google Analytics