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锁,事务,多线程,大并发,分布式架 ...
随机推荐
- Appium(八):Appium API(二) 元素等待、元素操作
1. 元素等待 我们在使用脚本的时候,可能会由于网络.服务器处理.电脑等原因,我们想要找的元素没有加载出来,这个时候如果直接定位就可能会报错. 这个时候我们就可以设置元素等待了. 什么叫元素等待呢? ...
- python--推倒式(列表、字典、集合)
python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...
- 使用mysql-proxy实现mysql的读写分离
前言: MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力.使用mysql-proxy实现mysql的读写分离,mysq ...
- JCC 指令
JCC跳转指令 JCC指条件跳转指令,CC就是指条件码. JCC指令 中文含义 英文原意 检查符号位 典型C应用 JZ/JE 若为0则跳转:若相等则跳转 jump if zero;jump if eq ...
- ETCD:客户端v3
原文地址:etcd/clientv3 etcd/clientv3是v3版本的Go etcd官方客户端 安装 go get go.etcd.io/etcd/clientv3 开始 创建客户端使用clie ...
- MyBatis框架之第三篇
8.Spring与Mybatis整合 框架的整合就是软件之间的集成,它很抽象,因此在做整合之前先想好思路.规划好思路然后按照思路一步一步的做就可以实现框架的整合. 8.1.SM整合思路 8.1.1.思 ...
- Pluralsight 科技公司公布自己的avaScript 成为最受欢迎的开发技术
根据 SDTimes 报道,Pluralsight 科技公司公布自己的 Technology Index,JavaScript 位居榜首. Pluralsight,是美国的一家面向软件开发者的在线教育 ...
- C# Excel 读取导入数据库
使用Aspose.Cells组件. 表格第一行为表头合并,第二行为数据名称,从第三行开始数据. if (xtraOpenFileDialog1.ShowDialog() == DialogResult ...
- Oracle - crfclust.bdb文件太大
今天在检查oracle rac集群时,突然才发现服务器的根目录下面占用了很多空间,照道理不应该出现这种情况,初步猜想可能是哪个日志或跟踪文件太大导致.切换到跟目录,使用du -sh *来一层一层查看到 ...
- Centos 7.5私有域名服务器部署(coredns+etcd)
单机配置: 一.安装etcd: 1.安装 yum install etcd -y 2.启动 systemctl start etcd 3.设置开机启动 systemctl enable e ...