MySQL 锁的监控及处理
故障模拟
# 添加两项配置
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 锁的监控及处理的更多相关文章
- mysql锁
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...
- 20.Mysql锁机制
20.锁问题锁是计算机协调多个进程或线程并发访问某一资源的机制. 20.1 Mysql锁概述锁类型分为表级锁.页面锁.行级锁.表级锁:一个线程对表进行DML时会锁住整张表,其它线程只能读该表,如果要写 ...
- Mysql 锁机制和事务
InnoDB 锁机制 InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据.当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得 ...
- MySQL锁(行锁、表锁、页锁、乐观锁、悲观锁等)
锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...
- MySQL锁之一:锁详解
一. 什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进 ...
- MYsql 锁详解 锁 与索引的关系
原文:http://blog.csdn.net/xifeijian/article/details/20313977#t10 mysql innodb的锁是通过锁索引来实现的. select ...
- 【0.2】【MySQL】常用监控指标及监控方法(转)
[MySQL]常用监控指标及监控方法 转自:https://www.cnblogs.com/wwcom123/p/10759494.html 对之前生产中使用过的MySQL数据库监控指标做个小结. ...
- MySQL数据库重点监控指标
MySQL数据库重点监控指标 QPS queries per seconds 每秒中查询数量 show global status like 'Question%'; Queries/seconds ...
- 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高
https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...
随机推荐
- 2019蚂蚁金服中高级Java工程师面试题及答案
面试基础 谈谈一致hash算法? 按照hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间.将这些数字头尾相连,想象成一个闭合的环形.如果集群中加入新的 ...
- Netty如何监控内存泄露
目录 Netty如何监控内存泄露 前言 JDK的弱引用和引用队列 Netty的实现思路 代码实现 分配监控对象 追踪和检查泄露 Netty如何监控内存泄露 前言 一般而言,在Netty程序中都会采用池 ...
- 利用keras自带影评数据集进行评价正面与否的二分类训练
from keras.datasets import imdb from keras import layers from keras import models from keras import ...
- webpack 配置babel-loader babel7
babel 7版本配置 在webpack中 默认只能处理部分 ES6的新语法,一些更高级的ES6或ES7的语法,webpack是处理不了的这个时候就需要借助第三方的loader 来帮助webpack ...
- android studio 常见编译问题及解决思路总结
问题一:编译运行成功后放置一段时间后再运行会报错 这个问题让我纠结了不少时间,最后才发现遇到类似的错误,clear一下project就好了.这个一般是上次生成的临时文件和这次的有冲突造成的. 问题二: ...
- 使用ReentrantLock
/** * java.util.concurrent.locks包提供的ReentrantLock用于替代synchronized加锁* 因为synchronized是Java语言层面提供的语法,所以 ...
- Docker安全扫描工具之docker-bench-security
简介 Docker Bench for Security检查关于在生产环境中部署Docker容器的几十个常见最佳实践.这些测试都是自动化的,其灵感来自CIS Docker基准1.2.0版. 这种安全扫 ...
- IT兄弟连 HTML5教程 在移动设备上设置原始大小显示
在iPhone系列和iPod Touch中使用的是Safari浏览器,它支持前面介绍的媒体查询表达式.例如,使用iPhone 320px×480px的分辨率去访问我们前面的布局示例,却无法得到我们想看 ...
- 工厂模式-C#改良实现
参考了下网上的工厂模式实现,总的来说例子还是OK得,但是示例太单一了,因此我做了下优化的改良实现. namespace DP { public interface ICreditCard { stri ...
- 打通 DevOps 任督二脉 ,CODING 2.0 制品库全新上线
CODING 在近期的 KubeCon 2019 大会上发布了 CODING 2.0,同时发布了最新功能--制品库.CODING 不断完善 DevOps 工具链,旨在持续提升研发组织软件交付的速度与质 ...