LOCK_ORDER工具
MySQL服务器是一个多线程应用程序,它使用许多内部锁定和与锁定相关的原语,例如互斥体,rwlock(包括prlock和sxlock),条件和文件。在服务器内,与锁相关的对象集随着新功能的实现和代码重构而改变,以提高性能。与使用锁定原语的任何多线程应用程序一样,执行一次同时持有多个锁时,总是有遇到死锁的风险。对于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工具,请按照以下步骤操作:
从源代码构建MySQL,并使用CMake选项对其进行配置,以便该构建包括LOCK_ORDER工具。
-DWITH_LOCK_ORDER=ON
注意
WITH_LOCK_ORDER
启用该选项后,MySQL构建需要flex程序。- 要在启用LOCK_ORDER工具的情况下运行服务器,请
lock_order
在服务器启动时启用系统变量。也可以使用其他几个用于LOCK_ORDER配置的系统变量。 - 对于MySQL测试套件操作,mysql-test-run.pl有一个
--lock-order
选项,用于控制在测试用例执行期间是否启用LOCK_ORDER工具。
假设MySQL已构建为包括LOCK_ORDER工具,则以下描述的系统变量将配置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_
启用了变量,则会引发调试声明。 - 如果
_trace_
启用了该变量,则将错误打印到日志中。
LOCK_ORDER系统变量摘要
变量名 | 变量类型 | 可变范围 |
---|---|---|
lock_order | 布尔型 | Global |
lock_order_debug_loop | 布尔型 | Global |
lock_order_debug_missing_arc | 布尔型 | Global |
lock_order_debug_missing_key | 布尔型 | Global |
lock_order_debug_missing_unlock | 布尔型 | Global |
lock_order_dependencies | 文档名称 | Global |
lock_order_extra_dependencies | 文档名称 | Global |
lock_order_output_directory | 目录名 | Global |
lock_order_print_txt | 布尔型 | Global |
lock_order_trace_loop | 布尔型 | Global |
lock_order_trace_missing_arc | 布尔型 | Global |
lock_order_trace_missing_key | 布尔型 | Global |
lock_order_trace_missing_unlock | 布尔型 | Global |
lock_order
属性 值 命令行格式 --lock-order[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 OFF 是否在运行时启用LOCK_ORDER工具。如果
lock_order
禁用(默认设置),则其他LOCK_ORDER系统变量均无效。如果lock_order
启用,则其他系统变量将配置要启用的LOCK_ORDER功能。如果
lock_order
启用此选项,则如果服务器遇到未在锁顺序图中声明的锁获取序列,则会引发错误。lock_order_debug_loop
属性 值 命令行格式 --lock-order-debug-loop[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_debug_loop 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 OFF 当LOCK_ORDER工具遇到在锁顺序图中标记为循环的依赖项时,是否导致调试断言失败。
lock_order_debug_missing_arc
属性 值 命令行格式 --lock-order-debug-missing-arc[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_debug_missing_arc 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 OFF LOCK_ORDER工具遇到锁定顺序图中未声明的依赖项时,是否导致调试声明失败。
lock_order_debug_missing_key
属性 值 命令行格式 --lock-order-debug-missing-key[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_debug_missing_key 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 OFF 当LOCK_ORDER工具遇到性能模型未正确检测的对象时,是否导致调试断言失败。
lock_order_debug_missing_unlock
属性 值 命令行格式 --lock-order-debug-missing-unlock[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_debug_missing_unlock 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 OFF 当LOCK_ORDER工具遇到仍被保留的销毁的锁时,是否导致调试断言失败。
lock_order_dependencies
属性 值 命令行格式 --lock-order-dependencies=file_name 介绍了 8.0.17 系统变量 lock_order_dependencies 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 文档名称 默认值 empty string lock_order_dependencies.txt
定义服务器锁定顺序依赖关系图的文件的路径。允许不指定任何依赖关系。在这种情况下,将使用一个空的依赖图。
lock_order_extra_dependencies
属性 值 命令行格式 --lock-order-extra-dependencies=file_name 介绍了 8.0.17 系统变量 lock_order_extra_dependencies 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 文档名称 默认值 empty string 包含锁定顺序依赖关系图的其他依赖关系的文件的路径。这对于修改
lock_order_dependencies.txt
文件中定义的主服务器依赖关系图很有用,并带有描述第三方代码行为的其他依赖关系。(另一种方法是修改lock_order_dependencies.txt
自身,不鼓励这样做。)如果未设置此变量,则不使用辅助文件。
lock_order_output_directory
属性 值 命令行格式 --lock-order-output-directory=dir_name 介绍了 8.0.17 系统变量 lock_order_output_directory 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 目录名 默认值 empty string LOCK_ORDER工具在其中写入日志的目录。如果未设置此变量,则默认值为当前目录。
lock_order_print_txt
属性 值 命令行格式 --lock-order-print-txt[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_print_txt 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 OFF LOCK_ORDER工具是否执行锁定顺序图分析并打印文本报告。该报告包括检测到的所有锁定获取周期。
lock_order_trace_loop
属性 值 命令行格式 --lock-order-trace-loop[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_trace_loop 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 OFF 当LOCK_ORDER工具遇到在锁定顺序图中标记为循环的依赖项时,是否在日志文件中打印跟踪。
lock_order_trace_missing_arc
属性 值 命令行格式 --lock-order-trace-missing-arc[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_trace_missing_arc 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 ON 当LOCK_ORDER工具遇到在锁顺序图中未声明的依赖项时,是否在日志文件中打印跟踪。
lock_order_trace_missing_key
属性 值 命令行格式 --lock-order-trace-missing-key[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_trace_missing_key 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 OFF 当LOCK_ORDER工具遇到性能模型未正确检测的对象时,是否在日志文件中打印跟踪。
lock_order_trace_missing_unlock
属性 值 命令行格式 --lock-order-trace-missing-unlock[={OFF|ON}] 介绍了 8.0.17 系统变量 lock_order_trace_missing_unlock 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 ON 当LOCK_ORDER工具遇到仍然被破坏的锁时,是否在日志文件中打印跟踪。