做为一款轻量级数据库软件,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
分享到:
相关推荐
5. **死锁**:虽然案例中没有明确提到死锁,但在多线程环境下,如果两个或更多事务相互等待对方释放资源,就可能出现死锁,需要使用`SHOW ENGINE INNODB STATUS`来检查是否存在这种情况。 解决这些问题的方法包括:...
《大芒果_魔兽世界_MySQL_数据库_详解》 《大芒果_魔兽世界_MySQL_数据库_详解》是一份关于魔兽世界游戏数据库的详细解释,涵盖了游戏账号、角色数量、道具及任务物品等多方面的知识点。下面将对这些知识点进行详细...
在本节MySQL数据库应用案例视频教程中,我们将深入探讨用户管理这一关键主题。用户管理是数据库系统中的核心组成部分,因为它确保了数据的安全性和访问控制。MySQL作为广泛应用的关系型数据库管理系统,提供了强大的...
- **长时间持有锁**:一个事务长时间占用资源,使得其他事务无法进行。 **2. "database is locked"异常的识别** 当出现"database is locked"异常时,通常是因为某个事务在执行时被阻塞,无法完成操作。这可能是由于...
MySQL数据库在处理并发事务时,可能会出现锁表的问题,这通常发生在多个事务同时访问和修改同一数据时。当一个事务尚未完成,其他事务无法进行相关操作,就会导致锁表现象,影响数据库性能和应用的正常运行。本文将...
在多线程环境下,由于并发操作不当,可能会出现“database is locked”(数据库被锁定)的错误,这通常涉及到SQLite的锁机制和事务处理。本文将深入探讨这个问题,并提供具体的解决方案。 一、SQLite锁机制 SQLite...
MySQL作为一款广泛使用的开源关系型数据库管理系统,提供了多种类型的锁来满足不同场景的需求,其中读写锁(Read-Write Lock)是其中一个重要的组成部分。 读写锁允许一个资源在同一时间被多个读取者访问,但只允许...
它是一个轻量级的数据库系统,支持多种数据库操作,如创建、查询、更新和删除数据。然而,在多线程环境中,由于并发访问数据库,可能会遇到“database locked”(数据库被锁定)的问题。本文将深入探讨如何在Android...
2. **找到.svn目录**:进入工作副本目录下的`.svn`目录(注意这是一个隐藏目录)。 3. **删除.lock文件**:找到并删除`.lock`文件。删除后,尝试重新执行`svn update`命令。 #### 预防措施 为了减少类似问题的发生...
MySQL 5.7 GA版本作为数据库管理系统MySQL的一个稳定发行版,在数据库性能优化、安全增强、功能完善等方面都做出了重要的改进。本文将详细介绍MySQL 5.7 GA版本新引入的特性和一些已不再支持的系统参数。 在安全性...
- **锁定操作**:当一个用户请求访问文件时,应用会向数据库发送一个请求,设置该文件的锁定状态。如果文件未被锁定,数据库会返回成功并设置锁;如果已被锁定,则返回失败。 - **解锁操作**:用户完成文件操作后...
数据库是任何应用程序的基础,尤其是那些处理大量数据的系统。在日常操作中,数据库用户可能会遇到各种问题,其中“ORA-00054: resource busy and acquire with nowait specified”是一个常见的错误,它通常出现在...
MySQL数据库中的死锁是数据库管理系统中常见的问题,特别是在并发环境下,多事务操作可能导致死锁的发生。本文主要讨论了在使用`SELECT ... FOR UPDATE`语句时遇到的死锁情况,并通过具体的例子深入分析了死锁的原因...
- 如果没有备份,可以尝试重新创建一个空的 `mysql-bin.index` 文件,并重启 MySQL 服务。如果 MySQL 成功启动,则表示之前的问题可能是由 `mysql-bin.index` 文件损坏造成的。 #### 连接失败问题 **问题分析** ...
### Oracle数据库锁表处理 在Oracle数据库管理过程中,锁表是一种常见的现象,它通常发生在多用户并发访问同一数据对象时。锁表会导致其他用户无法访问该数据对象,从而影响系统的正常运行。本文将详细介绍如何处理...
mysql数据库命令 默认安装位置:C:\Program Files\MySQL\MySQL Server 8.0\bin select version() from dual; desc mysql.user; 查看表中有哪些列 1、SELECT user, host, authentication_string, account_locked ,...
总结起来,本文介绍了一个实用的Linux Shell脚本,用于定时清理MySQL的Locked进程,有效地提升了数据库的稳定性和效率。结合`crontab`,我们能够实现对MySQL的自动维护,这对于大型网站或业务系统来说至关重要,确保...
此错误表明当前的操作因资源已被其他事务占用而无法继续执行,通常是因为另一个事务正在处理或已被锁定。 #### 二、问题分析 出现ORA-00054错误的主要原因有两个方面: 1. **并发冲突**:在多用户共享数据库资源...
此时,用户在尝试登录时会收到“ORA-28000: the account is locked”或“ORA-28001: the password has expired”的错误信息,无法进行任何操作。 二、处理密码过期的方法 1. **紧急模式登录(SQL*Plus as SYSDBA)*...