美文网首页我爱编程
MySQL - 一次锁表排查

MySQL - 一次锁表排查

作者: 爱蛇 | 来源:发表于2018-05-28 18:56 被阅读0次

最近遇到单条更新SQL语句一直报超时:

update where id=x

原因是有一个事务,因为开发机器上不正常中断程序,导致没有提交。

先从mysql进程下手

show full processlist;
或者
select * from information_schema.`PROCESSLIST` where db='xxx'

查看有没有DEADLOCK 的进程。
结果发现没有一条记录是DEADLOCK的。
(实际上有一个进程显示为SLEEP, 是其中一个一直没有提交事务的进程)

再从innodb状态下手

可查看一共有多少个锁在等待

show status like 'innodb%';
Innodb_row_lock_waits   表示正在等待的锁

再再从innodb 状态下手

show engine innodb status

配合表使用情况,掌握当前锁表情况

show open tables from xxx_db;

查看关于Innodb三张重要的表:

show tables from  information_schema like 'INNODB%';

主要有三张表:

  1. INNODB_LOCKS
  2. INNODB_TRX
  3. INNODB_LOCK_WAITS

查看未提交的事务

查看具体事务列表

select * from information_schema.innodb_trx;

发现有一条记录,有一个字段 tx_thread_id记录着事务对应的进程id。

回到show processlist;查看这个进程id,发现显示的状态为SLEEP。

杀掉进程:

kill {未提交事务对应的进程id}

最后更新语句正常执行了。

备注

show processlist; 里显示的进程,虽然没有显示DEADLOCK,
但不能证明要更新的id 没有被独占。
出现DEADLOCK 应该是多个事务里互相请求 X锁才会,而在这个情况只是一个事务一直没有提交,而另外一个事务在请求X锁,所以进程显示成了SLEEP。


最后发现是有人在自己的开发机器上,强行终端未提交事务的程序,导致连接断开了,但事务一直在挂起。

相关文章

  • MySQL - 一次锁表排查

    最近遇到单条更新SQL语句一直报超时: 原因是有一个事务,因为开发机器上不正常中断程序,导致没有提交。 先从mys...

  • MySQL锁篇

    1 MySQL锁介绍 2 MySQL表级锁 2.1 表级锁介绍 ​ 表级锁由SQL layer实现。M...

  • MySQL的锁机制

    mysql的锁机制 1、MySQL锁的基本介绍 MyISAM:MySQL的表级锁有两种模式:表共享读锁(Table...

  • Mysql 锁详解

    Mysql 锁详解一、前言二、MyISAM2.1 MyISAM表锁2.2 查询表级锁争用情况2.3 MySQL表级...

  • MySQL 锁表

    Linux System Environment MySQL锁表简介 MySQL锁表是禁止用户在数据库增加/删除/...

  • MySQL锁表和解锁操作

    1、确定mysql有锁表的情况则使用以下命令查看锁表进程 2、杀掉查询结果中已经锁表的trx_mysql_thre...

  • Mysql的锁

    MySql锁的分类 Mysql里的锁大致可以分为全局锁、表级锁和行锁三类。 全局锁 Mysql 增加全局锁的方法:...

  • Mysql 之 锁表与解表

    Mysql 之 锁表与解表 Mysql 查看锁表语句 mysql>show open tables where i...

  • MySQL 锁之二——表锁

    1、概述 MySQL 表级锁是以单个表为粒度的锁,InnoDB 和 MyISAM 引擎都支持表级锁; 2、表锁分类...

  • MySQL学习笔记-死锁产生原因和解决方法

    Mysql 锁类型 一、锁类型介绍: MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出...

网友评论

    本文标题:MySQL - 一次锁表排查

    本文链接:https://www.haomeiwen.com/subject/vrxnjftx.html