当前位置:首页> 正文

mysql脚本怎么写(数据库mysql基本语句)

mysql脚本怎么写(数据库mysql基本语句)

  很多时候我们在MySQL中会经常出现事务之间阻塞的问题,也就是阻塞lock,oracle的话实际上之前提供的脚本已经可以很直观看出阻塞的问题,那么对于数据库我们应如何快速查找定位问题根源?

  之前分享了innotop工具和show engine innodb status都不能很好的解决我们的需求,所以今天主要基于几张事务表来写sql看能不能定位到。

  数据库:mysql5.7.24 操作系统:centos7.3

  1、数据准备

  2、参数设置

  为了实验效果,我们先将参数innodb_lock_wait_timeout设置为100,否则很快就会提示ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

  1、第一个会话

  2、第二个会话

  在第二个连接会话中执行更新脚本

  3、第三个会话–通过查询information_schema数据库下与事务相关的几个系统表

  如下截图所示,第一个SQL语句能够查到线程304193被线程304192阻塞了, 被阻塞的SQL语句为“update test_blocking set name=’kk’ where id=1;”, 能够查到被阻塞了多长时间,但是无法查到源头SQL语句。此时就需要第二个SQL语句登场,找到源头语句。

  ps:附一段查看阻塞线程更多信息的sql

  这里不要太天真的认为第二个SQL语句能够获取所有场景下的阻塞源头SQL语句,实际业务场景,会话可能在执行一个存储过程或复杂的业务,有可能它执行完阻塞源头SQL后,继续在执行其它SQL语句,此时,你抓取的是这个连接会话最后执行的SQL语句。

展开全文阅读

相关内容