5.9.3 LOCK_ORDER工具

mysql服务器是一个使用了大量内部锁和锁相关原语(例如mutex,rwlocks(包括prlocks和sxlocks),conditions,files)的多线程应用。在服务器内,与锁相关的对象随着新特性的实现和代码重构而改变,以提高性能。如同任何使用了锁原语的多线程应用一样,总会有一些风险,当多个锁同时被持有时会遇到死锁。对mysql来说,死锁的后果是灾难性的,会造成服务的完全丢失。
从MySQL 8.0.17开始,为了支持检测锁获取死锁并强制执行时释放死锁,MySQL支持LOCK_ORDER工具。这样就可以将锁顺序依赖关系图定义为服务器设计的一部分,并且服务器运行时的检查可以保证锁的获取是非循环的,并且执行路径符合该图。
这节提供了关于使用LOCK_ORDER工具的信息,但也仅是基本层面的使用。对于复杂的细节,请参见MySQL Server Doxygen文档的“锁定顺序”部分,该文档位于https://dev.mysql.com/doc/index-other.html。
LOCK_ORDER工具是用来调试服务器,而不是用于生产。
为使用LOCK_ORDER工具,请按照以下流程:

  1. 从源服务器构建MySQL,并使用-DWITH_LOCK_ORDER = ON CMake选项对其进行配置,以便该构建包括LOCK_ORDER工具。
    注意:
    启用WITH_LOCK_ORDER选项后,MySQL构建需要flex程序。
  2. 要在启用LOCK_ORDER工具的情况下运行服务器,请在服务器启动时启用lock_order系统变量。 也可以使用其他几个用于LOCK_ORDER配置的系统变量。
  3. 对于MySQL测试套件操作,mysql-test-run.pl具有–lock-order选项,该选项控制是否在测试用例执行期间启用LOCK_ORDER工具。
    假设MySQL已使用了LOCK_ORDER工具构建mysql,则以下描述的系统变量将配置LOCK_ORDER工具的操作。 主要变量是lock_order,它指示是否在运行时启用LOCK_ORDER工具:
     如果lock_order被禁用(默认选项),则其他LOCK_ORDER系统变量没有任何作用。
     如果启用了lock_order,则其他系统变量将会配置要启用的LOCK_ORDER功能。
    注意:
    通常,可以通过使用–lock-order选项执行mysql-test-run.pl来配置LOCK_ORDER工具,并且mysql-test-run.pl可以将LOCK_ORDER系统变量设置为适当的值。
    所有的LOCK_ORDER系统变量必须在服务器启动时设置。运行时这些值可见但是无法改变。
    一些系统变量是成对存在的,比如lock_order_debug_loop和lock_order_trace_loop。对于此类对,当变量与之关联的条件发生时,将其区分如下:
     如果启用了_debug_变量,将会raise一个debug assertion
     如果启用了_trace_变量,会打印在日志中一个error.
    表5.7 LOCK_ORDER系统变量概要
    在这里插入图片描述

 lock_order
在这里插入图片描述

是否在运行时启用LOCK_ORDER工具。如果禁用lock_order(默认设置),则其他LOCK_ORDER系统变量均无效。 如果启用了lock_order,则其他系统变量将配置要启用的LOCK_ORDER功能。
如果启用了lock_order,则如果服务器在获得锁时没有按照锁顺序图中的顺序,则会引发错误。
 lock_order_debug_loop
在这里插入图片描述

当LOCK_ORDER工具遇到在锁顺序图中标记为循环的依赖项时,是否导致调试断言失败。
 lock_order_debug_missing_arc
在这里插入图片描述

当LOCK_ORDER工具遇到在锁顺序图中没有声明的依赖项时,是否导致调试断言失败。
 lock_order_debug_missing_key
在这里插入图片描述

当LOCK_ORDER工具遇到performance schema未能正确检测的对象时,是否导致调试断言失败。
 lock_order_debug_missing_unlock
在这里插入图片描述

当LOCK_ORDER工具遇到持有期间被destory的锁是否导致调试断言失败。
 lock_order_dependencies
在这里插入图片描述

lock_order_dependencies.txt文件的路径定义了服务器锁顺序依赖图。允许把它设置为无依赖。在这个场景中使用了空依赖图。
 lock_order_extra_dependencies
在这里插入图片描述

包含锁定顺序依赖关系图的其他依赖的文件路径。这对修改在lock_order_dependencies.txt文件中定义的主服务器依赖关系图很有用,并带有描述第三方代码行为的其他依赖关系。 (另一种方法是修改lock_order_dependencies.txt本身,不鼓励这样做。)

如果未设置此变量,则不使用辅助文件。
 lock_order_output_directory
在这里插入图片描述

LOCK_ORDER工具写日志到何处的目录。如果此变量未设置,默认是当前目录
 lock_order_print_txt
在这里插入图片描述

LOCK_ORDER工具是否执行锁顺序图分析并打印文本报告。 该报告包括任何检测到的锁定获取周期。
 lock_order_trace_loop
在这里插入图片描述

当LOCK_ORDER工具遇到在锁定顺序图中标记为循环的依赖项时,是否在日志文件中打印跟踪(strace)。
 lock_order_trace_missing_arc
在这里插入图片描述

当LOCK_ORDER工具遇到在锁顺序图中未声明的依赖项时,是否在日志文件中打印跟踪。
 lock_order_trace_missing_key
在这里插入图片描述

当LOCK_ORDER工具遇到未能正确检测performance schema的对象时,是否在日志文件中打印跟踪。
 lock_order_trace_missing_unlock
在这里插入图片描述

当LOCK_ORDER工具遇到持有期间被销毁的锁时,是否在日志文件中打印跟踪。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值