MySQL 8 锁表问题排查总结

第一步:查看锁表情况

执行如下指令:

show status like 'Table%'

核心指标说明:

Table_locks_immediate: 指的是能够立即获得表级锁的次数

Table_locks_waited: 指的是不能立即获取表级锁而需要等待的次数,如果数量大,说明锁等待多,有锁争用情况

第二步:正在被锁定的的表

执行如下指令:

show open TABLES where In_use > 0;

第三步:如果查看到锁争用情况严重,可以再查看当前执行的SQL

执行如下指令:

show processlist;

如果需要过滤用户/db/commond 等相关信息,也可以使用information_schema.processlist 表信息。

指令如下:

select * from information_schema.processlist;

也可以通过mysqladmin 指令打印processlist 进程信息。

执行如下指令:

root@241448b9f8d6:/# mysqladmin -uroot -p processlist
Enter password:
+----+-----------------+------------------+-------+---------+------+------------------------+------------------+
| Id | User            | Host             | db    | Command | Time | State                  | Info             |
+----+-----------------+------------------+-------+---------+------+------------------------+------------------+
| 5  | event_scheduler | localhost        |       | Daemon  | 8776 | Waiting on empty queue |                  |
| 55 | root            | 172.17.0.1:56330 | house | Sleep   | 1992 |                        |                  |
| 56 | root            | 172.17.0.1:56332 | house | Sleep   | 234  |                        |                  |
| 57 | root            | 172.17.0.1:56334 | house | Sleep   | 234  |                        |                  |
| 58 | root            | localhost        |       | Query   | 0    | init                   | show processlist |
+----+-----------------+------------------+-------+---------+------+------------------------+------------------+

mysqladmin命令有一个debug参数,可以分析当前MySQL服务的状态信息,同时也可以用来帮助我们定位当前锁的详细情况,这里我们通过该命令分析一下当前MySQL服务的详细状态,执行mysqladmin命令如下:

root@241448b9f8d6:/etc/mysql# mysqladmin -ujss -p -S /var/run/mysqld/mysqld.sock debug
Enter password:

拓展:

/var/run/mysqld/mysqld.sock: MySQL的配置文件my.cnf 查看Socker 文件目录地址

温馨提示: debug会将状态信息生成到mysql的错误文件,一般锁的信息都会保存在最后几行。

表锁文件展示:

hread 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)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要避免MySQL锁表问题,我们可以采取以下几种方法: 1. 尽量缩小事务范围:尽量将事务的范围缩小到最小,这样可以减少锁表的时间,并降低其他会话的等待时间。 2. 合理设计索引:通过合理设计索引,可以提高查询的效率,减少锁表的概率。将频繁用于查询的列设置为索引,可以加快读取数据的速度,减少锁表的时间。 3. 避免长事务和大事务:较长的事务或者涉及大量数据的事务,容易引发锁表问题。尽量将事务的执行时间缩短,或者将一些操作拆分成多个小的事务,以减少锁表的概率。 4. 使用读写分离:将读操作和写操作分离,将查询操作分发到只读从库上,以减轻主库的压力,提高系统的并发能力,减少锁表问题的发生。 5. 合理使用锁:在必要的时候,可以使用合适的锁机制,如共享锁、排他锁等,来规避冲突和死锁问题。尽量避免在高并发环境下使用悲观锁,可以考虑使用乐观锁等机制来提高并发处理能力。 6. 避免全表更新和删除操作:全表更新和删除操作会对整个表加锁,影响其他会话的正常访问。可以通过限定更新或删除的条件,以及设置合适的索引,来避免全表操作带来的锁表问题。 7. 合理设置事务隔离级别:选择合适的事务隔离级别也可以减少锁表问题。根据业务需求和性能要求,选择合适的隔离级别。 总之,通过以上几种方法,可以有效避免MySQL锁表问题,提高数据库性能和并发处理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值