首页 » db » MySQL innodb_print_all_deadlocks参数介绍

MySQL innodb_print_all_deadlocks参数介绍

 
文章目录

innodb_print_all_deadlocks是InnoDB存储引擎的一个配置参数。用于控制在发生死锁时将所有的死锁信息打印到错误日志中。

本文基于MySQL8.4.3版本。MySQL8.4官方参考手册:https://dev.mysql.com/doc/refman/8.4/en/innodb-parameters.html#sysvar_innodb_print_all_deadlocks

innodb_print_all_deadlocks = ON

当设置为ON时,InnoDB引擎会在每次检测到死锁时,将与该死锁相关的所有事务的详细信息记录到log_error日志中。

临时生效

永久生效修改MySQL配置文件以下参数

innodb_print_all_deadlocks = OFF

当设置为OFF时(默认值),InnoDB只会记录最后一个发生死锁的信息,需要使用SHOW ENGINE INNODB STATUS;语句查看,但是不会将死锁信息写入到log_error日志中。

临时生效

永久生效修改MySQL配置文件以下参数

演示示例

基于wlnmp源,安装MySQL8.4.3版本验证innodb_print_all_deadlocks参数实际效果。

临时开启死锁日志记录

查看死锁状态是否开启

查看log_error_verbosity参数值

创建测试库

创建测试表

插入一些测试数据

执行上述操作后,这个表是如下样子:

分别开启两个终端会话来模拟死锁场景。

在第一个会话中

在第二个会话中

在第一个会话中

在第二个会话中

此时,事务A已经锁定了记录1,但它需要锁定记录2,而事务B已经锁定了记录2,但它需要锁定记录1。这就形成了一个死锁。

log_error_verbosity值为3,log_error日志内容如下

可以删除测试表,或自行修改测试的UPDATE,我们来验证当log_error_verbosity值为2,log_error死锁日志的情况

可以删除测试表,或自行修改测试的UPDATE,我们来验证当log_error_verbosity值为1,log_error死锁日志的情况

通过该示例可以发现,log_error_verbosity值1或2时,依旧会记录死锁信息,并且几乎没有区别,log_error_verbosity等于3死锁信息更详细。

注意事项

1、死锁日志:当log_error_verbosity值等于1或2,发生死锁时,log_error日志中记录的内容相似,主要包括死锁的发生情况和相关的事务,但不包含时间戳。当log_error_verbosity值等于3,发生死锁时,log_error日志将详细记录死锁的情况,包括时间戳、更多的上下文信息。

2、死锁关闭:默认情况下innodb_print_all_deadlocks处于OFF状态,在这种情况下,只能通过SHOW ENGINE INNODB STATUS;命令查看最后一次发生死锁的详细信息,但是不会将死锁信息写入到log_error日志中。

3、性能影响:开启innodb_print_all_deadlocks可能会对性能产生一定影响,尤其是在高并发的环境中,因为每次发生死锁时都会记录详细信息。建议在开发、测试环境中使用,或在生产环境中仅在排查问题时临时开启。

总结

通过合理使用innodb_print_all_deadlocks,可以更有效地监控和优化应用程序的数据库操作,以减少死锁的发生。

附,MySQL my.cnf配置文件生成器:https://dbcnf.wlnmp.com/

原文链接:MySQL innodb_print_all_deadlocks参数介绍,转载请注明来源!

0