故障模拟

# 添加两项配置
vi /etc/my.cnf
[mysqld]
autocommit=0
innodb_lock_wait_timeout = 3600 systemctl restart mysqld # 登录数据库
use klvchen;
UPDATE t1 SET k1='av' WHERE id=1; # 新开一个窗口,再登录数据库
use klvchen;
UPDATE t1 SET k1='az' WHERE id=1;
# 此时页面卡住

(一)看有没有锁等待

# 新开一个窗口,登录数据库
SHOW STATUS LIKE 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 1 | # 当前正在等待锁的数量;
| Innodb_row_lock_time | 0 | # 从系统启动到现在锁定总时间长度;
| Innodb_row_lock_time_avg | 0 | # 每次等待所花平均时间;
| Innodb_row_lock_time_max | 0 | # 从系统启动到现在等待最长的一次所花的时间长度;
| Innodb_row_lock_waits | 1 | # 系统启动到现在总共等待的次数;
+-------------------------------+-------+

(二)查看哪个事务在等待(被阻塞了)

USE information_schema;
SELECT * FROM information_schema.INNODB_TRX WHERE trx_state='LOCK WAIT'\G;
*************************** 1. row ***************************
trx_id: 14597 # 事务ID号
trx_state: LOCK WAIT # 当前事务的状态
trx_started: 2019-12-21 09:20:25
trx_requested_lock_id: 14597:32:3:2
trx_wait_started: 2019-12-21 09:20:25
trx_weight: 2
trx_mysql_thread_id: 3 # 连接层的,连接线程ID(SHOW PROCESSLIST ===>Id或trx_id )
trx_query: UPDATE t1 SET k1='az' WHERE id=1 # 当前被阻塞的操作(一般是要丢给开发的)
trx_operation_state: starting index read
trx_tables_in_use: 1
trx_tables_locked: 1
trx_lock_structs: 2
trx_lock_memory_bytes: 1136
trx_rows_locked: 1
trx_rows_modified: 0
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 0
trx_is_read_only: 0
trx_autocommit_non_locking: 0 # 或者你可以简单地进行查看
select trx_state,trx_started,trx_wait_started,trx_weight,trx_rows_locked,now() from information_schema.innodb_trx; # 字段说明:
trx_state 事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING
trx_started 事务开始时间
trx_wait_started 事务开始等待的时间
trx_weight 事务的权重
trx_rows_locked 事务锁住的记录数,包含标记为 DELETED,并且已经保存到磁盘但对事务不可见的行

(三)查看锁源,谁锁的我

SELECT * FROM sys.innodb_lock_waits\G;                          # 被锁的和锁定它的之间关系
*************************** 1. row ***************************
wait_started: 2019-12-21 09:20:25
wait_age: 00:01:30
wait_age_secs: 90
locked_table: `klvchen`.`t1` # 哪张表出现的等待
locked_index: GEN_CLUST_INDEX
locked_type: RECORD
waiting_trx_id: 14597 # 等待的事务(与上个视图trx_id 对应)
waiting_trx_started: 2019-12-21 09:20:25
waiting_trx_age: 00:01:30
waiting_trx_rows_locked: 1
waiting_trx_rows_modified: 0
waiting_pid: 3 # 等待的线程号(与上个视图trx_mysql_thread_id)
waiting_query: UPDATE t1 SET k1='az' WHERE id=1
waiting_lock_id: 14597:32:3:2
waiting_lock_mode: X
blocking_trx_id: 14596 # 锁源的事务ID
blocking_pid: 2 # 锁源的线程号
blocking_query: NULL
blocking_lock_id: 14596:32:3:2
blocking_lock_mode: X
blocking_trx_started: 2019-12-21 09:20:12
blocking_trx_age: 00:01:43
blocking_trx_rows_locked: 5
blocking_trx_rows_modified: 0
sql_kill_blocking_query: KILL QUERY 2
sql_kill_blocking_connection: KILL 2

(四)找到锁源的 thread_id

SELECT * FROM performance_schema.threads WHERE processlist_id=2\G;
*************************** 1. row ***************************
THREAD_ID: 27
NAME: thread/sql/one_connection
TYPE: FOREGROUND
PROCESSLIST_ID: 2
PROCESSLIST_USER: root
PROCESSLIST_HOST: localhost
PROCESSLIST_DB: klvchen
PROCESSLIST_COMMAND: Sleep
PROCESSLIST_TIME: 261
PROCESSLIST_STATE: NULL
PROCESSLIST_INFO: UPDATE t1 SET k1='av' WHERE id=1
PARENT_THREAD_ID: 1
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: Socket
THREAD_OS_ID: 2557

(五)找到锁源的SQL语句

-- 当前在执行的语句
SELECT * FROM performance_schema.`events_statements_current` WHERE thread_id=27\G;
*************************** 1. row ***************************
THREAD_ID: 27
EVENT_ID: 8
END_EVENT_ID: 8
EVENT_NAME: statement/sql/update
SOURCE:
TIMER_START: 16785505578000
TIMER_END: 16785741560000
TIMER_WAIT: 235982000
LOCK_TIME: 126000000
SQL_TEXT: UPDATE t1 SET k1='av' WHERE id=1
DIGEST: c75120019b1993cf2423bd9add827987
DIGEST_TEXT: UPDATE `t1` SET `k1` = ? WHERE `id` = ?
CURRENT_SCHEMA: klvchen
OBJECT_TYPE: NULL
OBJECT_SCHEMA: NULL
OBJECT_NAME: NULL
OBJECT_INSTANCE_BEGIN: NULL
MYSQL_ERRNO: 0
RETURNED_SQLSTATE: 00000
MESSAGE_TEXT: Rows matched: 1 Changed: 0 Warnings: 0
ERRORS: 0
WARNINGS: 0
ROWS_AFFECTED: 0
ROWS_SENT: 0
ROWS_EXAMINED: 4
CREATED_TMP_DISK_TABLES: 0
CREATED_TMP_TABLES: 0
SELECT_FULL_JOIN: 0
SELECT_FULL_RANGE_JOIN: 0
SELECT_RANGE: 0
SELECT_RANGE_CHECK: 0
SELECT_SCAN: 0
SORT_MERGE_PASSES: 0
SORT_RANGE: 0
SORT_ROWS: 0
SORT_SCAN: 0
NO_INDEX_USED: 0
NO_GOOD_INDEX_USED: 0
NESTING_EVENT_ID: NULL
NESTING_EVENT_TYPE: NULL
NESTING_EVENT_LEVEL: 0 -- 执行语句的历史
SELECT * FROM performance_schema.`events_statements_history` WHERE thread_id=27\G;

得出结果,丢给开发

表信息

被阻塞的

锁源SQL

快速方法

方法 一

# 查看有没有锁表
SHOW STATUS LIKE 'innodb_row_lock%'; # 获取正在等待的语句,kill 锁源语句,锁源ID,锁源线程ID
select a.waiting_query as '被锁住的SQL语句', a.sql_kill_blocking_connection, a.blocking_pid, b.THREAD_ID AS '锁源线程ID'
from
(SELECT waiting_query, sql_kill_blocking_connection, blocking_pid FROM sys.innodb_lock_waits) a,
(SELECT THREAD_ID, PROCESSLIST_ID FROM performance_schema.threads WHERE processlist_id IN (SELECT blocking_pid FROM sys.innodb_lock_waits)) b
where a.blocking_pid = b.PROCESSLIST_ID order by b.THREAD_ID; # 查出锁源 SQL 语句
SELECT THREAD_ID, SQL_TEXT AS '锁源当前执行的SQL语句' ,CURRENT_SCHEMA AS '数据库' FROM performance_schema.`events_statements_current` WHERE thread_id IN (SELECT THREAD_ID FROM performance_schema.threads pt WHERE processlist_id IN (SELECT blocking_pid FROM sys.innodb_lock_waits));

方法 二

# 查看有没有锁表
SHOW STATUS LIKE 'innodb_row_lock%'; # 获取正在等待的语句,kill 锁源语句,锁源ID
SELECT waiting_query as '被锁住的SQL语句',sql_kill_blocking_connection,blocking_pid FROM sys.innodb_lock_waits; # 查找对应关系
SELECT THREAD_ID AS '锁源线程ID', PROCESSLIST_ID FROM performance_schema.threads WHERE processlist_id IN (SELECT blocking_pid FROM sys.innodb_lock_waits); # 查出锁源 SQL 语句
SELECT THREAD_ID, SQL_TEXT AS '锁源当前执行的SQL语句' ,CURRENT_SCHEMA AS '数据库' FROM performance_schema.`events_statements_current` WHERE thread_id IN (SELECT THREAD_ID FROM performance_schema.threads pt WHERE processlist_id IN (SELECT blocking_pid FROM sys.innodb_lock_waits));

MySQL 锁的监控及处理的更多相关文章

  1. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  2. 20.Mysql锁机制

    20.锁问题锁是计算机协调多个进程或线程并发访问某一资源的机制. 20.1 Mysql锁概述锁类型分为表级锁.页面锁.行级锁.表级锁:一个线程对表进行DML时会锁住整张表,其它线程只能读该表,如果要写 ...

  3. Mysql 锁机制和事务

    InnoDB 锁机制 InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据.当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得 ...

  4. MySQL锁(行锁、表锁、页锁、乐观锁、悲观锁等)

    锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...

  5. MySQL锁之一:锁详解

    一.    什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进 ...

  6. MYsql 锁详解 锁 与索引的关系

    原文:http://blog.csdn.net/xifeijian/article/details/20313977#t10   mysql innodb的锁是通过锁索引来实现的.   select ...

  7. 【0.2】【MySQL】常用监控指标及监控方法(转)

    [MySQL]常用监控指标及监控方法 转自:https://www.cnblogs.com/wwcom123/p/10759494.html  对之前生产中使用过的MySQL数据库监控指标做个小结. ...

  8. MySQL数据库重点监控指标

    MySQL数据库重点监控指标 QPS queries per seconds 每秒中查询数量 show global status like 'Question%'; Queries/seconds ...

  9. 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高

    https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...

随机推荐

  1. 2019蚂蚁金服中高级Java工程师面试题及答案

    面试基础 谈谈一致hash算法? 按照hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间.将这些数字头尾相连,想象成一个闭合的环形.如果集群中加入新的 ...

  2. Netty如何监控内存泄露

    目录 Netty如何监控内存泄露 前言 JDK的弱引用和引用队列 Netty的实现思路 代码实现 分配监控对象 追踪和检查泄露 Netty如何监控内存泄露 前言 一般而言,在Netty程序中都会采用池 ...

  3. 利用keras自带影评数据集进行评价正面与否的二分类训练

    from keras.datasets import imdb from keras import layers from keras import models from keras import ...

  4. webpack 配置babel-loader babel7

    babel 7版本配置 在webpack中 默认只能处理部分 ES6的新语法,一些更高级的ES6或ES7的语法,webpack是处理不了的这个时候就需要借助第三方的loader 来帮助webpack ...

  5. android studio 常见编译问题及解决思路总结

    问题一:编译运行成功后放置一段时间后再运行会报错 这个问题让我纠结了不少时间,最后才发现遇到类似的错误,clear一下project就好了.这个一般是上次生成的临时文件和这次的有冲突造成的. 问题二: ...

  6. 使用ReentrantLock

    /** * java.util.concurrent.locks包提供的ReentrantLock用于替代synchronized加锁* 因为synchronized是Java语言层面提供的语法,所以 ...

  7. Docker安全扫描工具之docker-bench-security

    简介 Docker Bench for Security检查关于在生产环境中部署Docker容器的几十个常见最佳实践.这些测试都是自动化的,其灵感来自CIS Docker基准1.2.0版. 这种安全扫 ...

  8. IT兄弟连 HTML5教程 在移动设备上设置原始大小显示

    在iPhone系列和iPod Touch中使用的是Safari浏览器,它支持前面介绍的媒体查询表达式.例如,使用iPhone 320px×480px的分辨率去访问我们前面的布局示例,却无法得到我们想看 ...

  9. 工厂模式-C#改良实现

    参考了下网上的工厂模式实现,总的来说例子还是OK得,但是示例太单一了,因此我做了下优化的改良实现. namespace DP { public interface ICreditCard { stri ...

  10. 打通 DevOps 任督二脉 ,CODING 2.0 制品库全新上线

    CODING 在近期的 KubeCon 2019 大会上发布了 CODING 2.0,同时发布了最新功能--制品库.CODING 不断完善 DevOps 工具链,旨在持续提升研发组织软件交付的速度与质 ...