免责声明:下面的脚本只适用于Percona服务器MySQL 5.7和依赖使性能模式(PS)仪器可雷竞技下载官网以在高并发系统增加开销,而不是用于连续生产使用的POC(的概念)。
介绍
Per雷竞技下载官网cona支持,我们经常收到票死锁和即使死锁的概念很简单,故障排除可能不是在所有情况下。
在解释如何处理MySQL死锁,死锁发生在两个或两个以上相互持有和交易请求锁,创建一个循环依赖关系。MySQL将检测死锁和杀死一个事务(让它回滚),和检波器的僵局将打印(显示引擎innodb状态)。使用这种方法的局限性是:1)只有一个死锁(最新)将打印可能错过许多死锁发生的如果你不积极检查,(除非启用innodb_print_all_deadlocks),2)只有最后执行DML打印,可能没有足够的光来识别违规的交易复杂的死锁。
使用pt-deadlock-logger从一号将克服困难,它将记录所有发生死锁,但是2号呢?
Perc雷竞技下载官网ona服务器MySQL 5.7,我开发了以下脚本(你可以找到我们支持片段回购),打印SQL历史两个事务参与死锁,在故障排除一些复杂的死锁情况下,可以帮助。注意,大多数时候,一个僵局将包括两个事务,但其他时候可以有更多的交易,在这种情况下,脚本将部分有用。
安装
|
1
2
3
4
5
6
7
|
#下载脚本
wget
https
:/ /生
.githubusercontent
com/雷竞技下载官网/支持- - - - - -片段/主/mysql/deadlock_catcher
. sh
修改文件权限
一个+x
deadlock_catcher
. sh
#您需要设置正确的用户/密码在执行之前,即
# MYSQL = " MYSQL - u root -psekret "
。/deadlock_catcher
. sh
|
执行脚本将显示以下提示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#上面的脚本将提示您关于启用所需的仪器:
集
全球
innodb_print_all_deadlocks=1
。
。
。
需要
来
启用
所有
声明/
仪器
在
性能
模式
,
写
是的
来
继续
是的
- - - - - - - - - - - - - - -
更新
performance_schema
.setup_instruments
集
启用
=
“是的”
,
定时
=
“是的”
在哪里
的名字
就像
的声明/ %
。
。
。
需要
来
启用
所有
event_statements/
消费者
,
写
是的
来
继续
是的
mysql
:
(
警告
]
使用
一个
密码
在
的
命令
行
接口
可以
是
不安全的
。
- - - - - - - - - - - - - - -
更新
performance_schema
.setup_consumers
集
启用
=
“是的”
在哪里
的名字
就像
“events_statements %”
|
然后,操作系统提示不会返回,当脚本将继续运营,扫描死锁。(你可以用“&”执行在后台运行)。
注意:deadlock_logger脚本将开始登录脚本执行后只死锁发生。
产生死锁
你需要打开两个会话和执行下列交叉:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Tx1
:
下降
表
如果
存在
t1
;
创建
表
t1
(
id
int
auto_increment
主
关键
)
;
开始
;
选择
*
从
t1
;
并
:
开始
;
选择
*
从
t1
;
插入
成
t1
值
(
1
)
;
Tx1
:
插入
成
t1
值
(
2
)
;
插入
成
t1
值
(
1
)
;
并
:
插入
成
t1
值
(
2
)
;
错误
1213年
(
40001年
)
:
死锁
发现
当
尝试
来
得到
锁
;
试一试
重新启动
事务
|
检查“deadlock_logger。sh”上面输出的历史我们可以看到交易线程(你需要阅读从底部到顶部):
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Tx1
:
#添加列名为更好的可读性
#电动汽车。thread_id,电动汽车。EVENT_ID,电动汽车。END_EVENT_ID,电动汽车。EVENT_NAME,电动汽车。SQL_TEXT
42
10
10
声明/sql/插入
插入
成
t1
值
(
1
)
42
9
9
声明/sql/插入
插入
成
t1
值
(
2
)
42
8
8
声明/sql/选择
选择
*
从
t1
42
7
7
声明/sql/开始
开始
42
6
6
声明/sql/create_table
创建
表
t1
(
id
int
auto_increment
主
关键
)
42
5
5
声明/sql/drop_table
下降
表
如果
存在
t1
42
4
4
声明/sql/选择
选择
@
@
version_comment
限制
1
42
3
3
声明/com/场
列表
零
42
2
2
声明/sql/show_tables
显示
表
42
1
1
声明/sql/show_databases
显示
数据库
|
|
1
2
3
4
5
6
7
8
9
10
11
|
并
:
#添加列名为更好的可读性
#电动汽车。thread_id,电动汽车。EVENT_ID,电动汽车。END_EVENT_ID,电动汽车。EVENT_NAME,电动汽车。SQL_TEXT
43
8
8
声明/sql/插入
插入
成
t1
值
(
2
)
43
7
7
声明/sql/插入
插入
成
t1
值
(
1
)
43
6
6
声明/sql/选择
选择
*
从
t1
43
5
5
声明/sql/开始
开始
43
4
4
声明/sql/选择
选择
@
@
version_comment
限制
1
43
3
3
声明/com/场
列表
零
43
2
2
声明/sql/show_tables
显示
表
43
1
1
声明/sql/show_databases
显示
数据库
|
可以看出,整个历史事务正在从性能模式表,这有助于识别复杂交易中的死锁。
脚本的局限性
- 目前只适用于Percona MySQL 5.7服务雷竞技下载官网器
- 使仪器性能模式将增加一些开销到MySQL
- 脚本是通过跟踪误差。日志,所以在运行时修改位置或内容可以有意想不到的结果
- 脚本依赖于“performance_schema。受限于events_statements_history”的最大行performance_schema_events_statements_history_long_size和performance_schema_events_statements_history_size。对于高活动服务器,历史表可能旋转僵局出现之前,导致部分不完整的打印语句,而不是打印线程的整个生命。
结论
解决死锁可以是困难的,但在检查执行的整个历史语句参与死锁的线程,它可以更容易理解为什么发生了死锁。测试脚本和性能退化之前高活动和/或生产系统的关键!
解简单的“与Percona服务器启动并运行MySQL”概述了建立一个MySQL®数据库本雷竞技下载官网地使用Percona MySQL服务器。它包括故障转移和基本业务连续性组件。





