死锁:是指两个或则多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,而导致恶性循环的现象;
当产生死锁的时候,MySQL会回滚一个小事务的SQL,确保另一个完成。
上面是死锁的概念,而在MySQL中innodb会出现死锁的情况,但是查看死锁却很不“智能”。
只能通过 show engine innodb status 查看,但只保留最后一个死锁的信息,之前产生的死锁都被刷掉了。
下面介绍的工具却很容易做到记录。

pt-deadlock-logger [OPTIONS] DSN
pt-deadlock-logger:显示指定的DSN的死锁日志信息,他能够标准输出到屏幕也可以把信息写日志文件中(--log参数)甚至可以保留到指定的表中(--dest参数),
该工具默认是永久执行,除非指定--run-time 或 --iterations 。

用法:

pt-deadlock-logger --run-time=10 --interval=3 u=admin,p=admin,h=192.168.100.101,P=3306|pt-align

pt-deadlock-logger --run-time=10 --interval=3 u=admin,p=admin,h=192.168.100.101,P=3306 --create-dest-table --dest D=db01,t=pt_deadlocks

参数:

--create-dest-table :创建指定的表。
--dest :创建存储死锁信息的表。
--database :-D,指定链接的数据库。
--table :-t,指定存储的表名。
--log :指定死锁日志信息写入到文件。
--run-time :运行时长,默认永久
--interval :运行间隔时间,默认30s。
u,p,h,P :链接数据库的信息。

测试:
session 1:
start transaction;
update t01 set name='lulu' where code>3;

session 2:
start transaction;
update t01 set name='kaka' where code>2;

session 1:
update t01 set name='jojo' where code>2;

死锁出现了!
看pt-deadlock-logger的运行情况:

-------------------------------

pt-deadlock-logger --run-time=10 --interval=3 u=admin,p=admin,h=192.168.100.101,P=3306|pt-align
192.168.100.101 2018-11-19T18:14:44 9 0 34 admin localhost db01 t01 PRIMARY RECORD X w 1 update t01 set name='jojo' where code>2
192.168.100.101 2018-11-19T18:14:44 10 0 26 admin localhost db01 t01 PRIMARY RECORD X w 0 update t01 set name='kaka' where code>2

-------------------------

pt-deadlock-logger --run-time=10 --interval=3 u=admin,p=admin,h=192.168.100.101,P=3306 --create-dest-table --dest D=db01,t=pt_deadlocks

select * from pt_deadlocks\G
*************************** 1. row ***************************
server: 192.168.100.101
ts: 2018-11-19 18:14:44
thread: 9
txn_id: 0
txn_time: 34
user: admin
hostname: localhost
ip:
db: db01
tbl: t01
idx: PRIMARY
lock_type: RECORD
lock_mode: X
wait_hold: w
victim: 1
query: update t01 set name='jojo' where code>2
*************************** 2. row ***************************
server: 192.168.100.101
ts: 2018-11-19 18:14:44
thread: 10
txn_id: 0
txn_time: 26
user: admin
hostname: localhost
ip:
db: db01
tbl: t01
idx: PRIMARY
lock_type: RECORD
lock_mode: X
wait_hold: w
victim: 0
query: update t01 set name='kaka' where code>2
2 rows in set (0.00 sec)

---------------------------------------------------------------------------

vim pt-deadlocks-logger.cnf

host=192.168.100.101
port=3306
user=admin
password=admin

tab
log=/root/test/pt-deadlocks.log
daemonize
interval=3

pt-deadlock-logger --config pt-deadlocks-logger.cnf

在后台长久运行,检测死锁,记录到文件里,以配置文件运行。

---------------------------------------------------------------------------

总结:

在检查数据库是死锁信息的时候,又多了一个选择。
该工具也是通过show engine innodb status的信息来计算的。
在mysql 5.6.2中,innodb_print_all_deadlocks这个设置可以看到死锁的情况。

victim就是回滚的事务为 1

04. pt-deadlock-logger的更多相关文章

  1. 从别人的代码中学习golang系列--01

    自己最近在思考一个问题,如何让自己的代码质量逐渐提高,于是想到整理这个系列,通过阅读别人的代码,从别人的代码中学习,来逐渐提高自己的代码质量.本篇是这个系列的第一篇,我也不知道自己会写多少篇,但是希望 ...

  2. 【Gin-API系列】Gin中间件之日志模块(四)

    日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...

  3. Java:并发笔记-04

    Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线 ...

  4. Ubuntu 14.04 中 安装elasticsearch2.*+logstash2.*+kibana

    在Ubuntu 14.04 上安装单机版ELK 2.*(脚本化) 1.判断是否为root权限 if [ "${UID}" -ne 0 ]; then echo "You ...

  5. java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;

    如果你出现类似如下错误 1. Install tomcat7 in my home directory and set up `CATALINA_HOME` environment variable ...

  6. Win7&Ubuntu12.04 双系统引导问题

    周末的时候手贱,重装系统,导致原来的ubuntu12.04和win7双系统的引导不见了,所以在此进行一下说明,如何修复. 1. win7和ubuntu12.04双系统引导修复 问题描述:    在重装 ...

  7. java.util.logging.Logger 使用详解

    概述: 第1部分 创建Logger对象 第2部分 日志级别 第3部分 Handler 第4部分 Formatter 第5部分 自定义 第6部分 Logger的层次关系 参考 第1部分 创建Logger ...

  8. ubuntu12.04+kafka2.9.2+zookeeper3.4.5的伪分布式集群安装和demo(java api)测试

    博文作者:迦壹 博客地址:http://idoall.org/home.php?mod=space&uid=1&do=blog&id=547 转载声明:可以转载, 但必须以超链 ...

  9. ubuntu 12.04 安装 redis

    原文地址:http://ijonas.com/software-development/nosql/412/ 1 Installing Redis 2.6.x on Ubuntu 12.04 and ...

  10. Ubuntu 14.04下安装eclipse搭建C++开发环境

    安装过程分为两部分:1.JAVA开发环境,即JDK的安装:2.eclipse的安装: 一.安装包下载 1.JDK官网下载地址:http://www.oracle.com/technetwork/jav ...

随机推荐

  1. Mybatis之mapper.xml配置文件中的#{}和${}

    #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换.#{}可以有效防止sql注入. #{}可以接收简单类型值或pojo ...

  2. Gamma Correction

    [Gamma Correction] 磁盘上存储的纹理可分为Linear Texture.Gamma Texture. sRGB sampling allows the Unity Editor to ...

  3. Pushlet实现后台信息推送(二)

    上一篇日志利用推送源周期性地向订阅了某一事件的所有网页端推送信息,但怎么实现向特定的某一个用户推送信息呢,想象一个网络聊天室,怎么向单独的一个好友私聊呢.问题的关键就是那个SessionID,Push ...

  4. EF CodeFirst学习笔记004--足够聪明

    将BlogTypes注释掉,但因为Blogs中定义了BlogType 这样类型的属性,所以Ef会聪明的找到BlogType类. public class BlogEntities:DbContext ...

  5. mybatis 插件安装与使用

    安装 1.在MarketPlace 中搜索 MyBatipse  安装 2.下载MyBatipse 插件 使用 ......

  6. day31 粘包问题

    TCP粘包问题 cmd客户端代码 import socket import struct import socket import json c = socket.socket() c.connect ...

  7. Python设计模式 - 总览(更新中...)

    最近打算重构部分python项目,有道是"工欲善其事,必先利其器",所以有必要梳理一下相关设计模式.每次回顾基本概念或底层实现时都会有一些新的收获,希望这次也不例外. 本系列打算先 ...

  8. 如何正确获取MYSQL的ADO连接字符串

    首先你正确安装了MYSQL的数据库驱动程序(mysql-connector-odbc-5.3.2-win32.msi )http://dev.mysql.com/downloads/connector ...

  9. vue项目打包后图片路径问题

    当用vue-cli自动构建项目后,有两种运行方法,分别是: npm run dev : 提供一个开发的环境,自动热更新,资源使用绝对路径,所以可以正常看到背景图片. npm run build : 打 ...

  10. C/C++ typedef用法详解(真的很详细)

    第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...