PerconaToolkit系列之四ptlogger
1。ptdeadlocklogger记录有关MySQL死锁的信息到指定的表中。
基本使用语法为:ptdeadlocklogger〔options〕DSN
下面列表列出部分options,更加详细的请使用ptdeadlockloggerhelp进行查看
OPTIONS:
OPTIONS
短操作符
类型
默认值
简要说明
askpass
连接MySQL时提示输入密码。
createdesttable
自动创建存储死锁信息的表
database
D
s
连接到这个数据库。
defaultsfile
F
s
仅从给定文件中读取选项,必须提供绝对路径名。
host
h
s
连接到主机。
interval
m
30hr检查死锁的频率
iterations
i
检查死锁的次数。
password
p
连接时使用的密码。如果密码包含逗号,它们必须用反斜杠转义
port
P
i
用于连接的端口号。
runtime
m
退出前运行多长时间。setvars
a
个以逗号分隔的variablevalue对列表中设置MySQL变量。
socket
S
用于连接的套接字文件。
user
u
如果不是当前用户,则用于登录的用户。
类型备注:sstring,iinteger,ffloat,hHaAcommaseparatedlist,dDSN,zsize,mtime
DSN为要操作的数据库和表。
DSN:
DSN
简要说明
A
默认字符集。
D
数据库。
F
仅从给定文件中读取默认选项
h
连接到主机。
p
连接时使用的密码。如果密码包含逗号,它们必须用反斜杠转义
P
用于连接的端口号。
S
用于连接的套接字文件。
u
如果不是当前用户,则用于登录的用户。
t
存储死锁信息的表
2。基本使用样例
在test数据库下,创建如下表来存储死锁信息:
CREATETABLEdeadlocks(
serverchar(20)NOTNULL,
tstimestampNOTNULLDEFAULTCURRENTTIMESTAMP,
threadintunsignedNOTNULL,
txnidbigintunsignedNOTNULL,
txntimesmallintunsignedNOTNULL,
userchar(16)NOTNULL,
hostnamechar(20)NOTNULL,
ipchar(15)NOTNULL,
dbchar(64)NOTNULL,
tblchar(64)NOTNULL,
idxchar(64)NOTNULL,
locktypechar(16)NOTNULL,
lockmodechar(1)NOTNULL,
waitholdchar(1)NOTNULL,
victimtinyintunsignedNOTNULL,
querytextNOTNULL,
PRIMARYKEY(server,ts,thread)
)ENGINEInnoDBDEFAULTCHARSETutf8mb4COLLATEutf8mb40900aici;
2。1输出死锁信息到表中
ptdeadlockloggerh192。168。246。137,uroot,pYgzlpaul2022destDtest,tdeadlocks
模拟一下锁表的情况:
在数据库test下,新建如下表:
CREATETABLEt(
idintNOTNULL,
PRIMARYKEY(id)
)ENGINEInnoDBDEFAULTCHARSETutf8mb4COLLATEutf8mb40900aici;
表中暂无任何记录
此时,我们用两个客户端,依以下顺序执行SQL语句:
1)客户端A:
setautocommit0;
STARTTRANSACTION;
selectfromtwhereid22forupdate;
2)客户端B:
setautocommit0;
STARTTRANSACTION;
selectfromtwhereid23forupdate;
3)客户端A:
insertintotvalues(22);
4)客户端B:
insertintotvalues(23);
此时报告如下死锁信息:
〔Err〕1213Deadlockfoundwhentryingtogetlock;tryrestartingtransaction
下面我们查看一下表deadlocks数据,
执行如下SQL:
SELECTdb,tbl,query,locktype,lockmode,idx
FROMdeadlocks
返回结果如下图:
发现已经捕获了死锁信息,并记录在表中了。
2。2新建指定表,并输出死锁信息到表中
下面使用参数createdesttable自动在DSN中指定的数据库test中创建指定的表,并把死锁信息存储进表tdeadlocks中。
ptdeadlockloggerh192。168。246。137,uroot,pYgzlpaul2022createdesttabledestDtest,ttdeadlocks
做类似以上2。1中所做的操作,发现,死锁信息被正常记录进表(tdeadlocks)中了