MySQL服务器是一个多线程应用程序,它使用许多内部锁和与锁相关的原语,如互斥锁、rwlocks(包括prlocks和sxlocks)、条件和文件。在服务器中,与锁相关的对象集随着新特性的实现和代码重构的变化而变化,以提高性能。与任何使用锁定原语的多线程应用程序一样,当同时持有多个锁时,在执行过程中总是有遇到死锁的风险。对于MySQL来说,死锁的影响是灾难性的,会导致服务完全丢失。
从MySQL 8.0.17开始,为了能够检测锁获取死锁并强制运行时执行不存在死锁,MySQL支持LOCK_ORDER工具。这允许将锁顺序依赖图定义为服务器设计的一部分,并允许服务器运行时检查以确保锁获取是非循环的,并且执行路径符合图。
本节提供关于使用LOCK_ORDER工具的信息,但只提供基本级别的信息。要了解完整的细节,请参阅MySQL Server Doxygen文档的Lock Order部分10bet官方网站https://dev.10bet靠谱mysql.com/doc/index-other.html.
LOCK_ORDER工具用于调试服务器,而不是用于生产。
要使用LOCK_ORDER工具,请遵循以下步骤:
从源代码构建MySQL,使用
-DWITH_LOCK_ORDER =对
CMake选项,以便构建包含LOCK_ORDER工具。请注意与
WITH_LOCK_ORDER
选项启用后,MySQL构建需要flex程序。要在启用LOCK_ORDER工具的情况下运行服务器,请启用
lock_order
服务器启动时的系统变量。LOCK_ORDER配置的其他几个系统变量也可用。MySQL测试套件操作,mysql-test-run.pl有一个
——lock-order
选项,它控制在测试用例执行期间是否启用LOCK_ORDER工具。
下面描述的系统变量是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_
变量时,将引发一个调试断言。如果
_trace_
变量,则将错误打印到日志中。
表5.7 LOCK_ORDER系统变量汇总
变量名 | 变量类型 | 变量作用域 |
---|---|---|
lock_order | 布尔 | 全球 |
lock_order_debug_loop | 布尔 | 全球 |
lock_order_debug_missing_arc | 布尔 | 全球 |
lock_order_debug_missing_key | 布尔 | 全球 |
lock_order_debug_missing_unlock | 布尔 | 全球 |
lock_order_dependencies | 文件名称 | 全球 |
lock_order_extra_dependencies | 文件名称 | 全球 |
lock_order_output_directory | 目录名称 | 全球 |
lock_order_print_txt | 布尔 | 全球 |
lock_order_trace_loop | 布尔 | 全球 |
lock_order_trace_missing_arc | 布尔 | 全球 |
lock_order_trace_missing_key | 布尔 | 全球 |
lock_order_trace_missing_unlock | 布尔 | 全球 |
-
命令行格式 ——lock-order[={|在}]
介绍了 8.0.17 系统变量 lock_order
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 从
是否在运行时启用LOCK_ORDER工具。如果
lock_order
禁用(默认值),则没有其他LOCK_ORDER系统变量有任何影响。如果lock_order
,则其他系统变量配置要启用哪些LOCK_ORDER特性。如果
lock_order
启用时,如果服务器遇到没有在锁定顺序图中声明的锁定获取序列,则会引发错误。 -
命令行格式 ——lock-order-debug-loop[={|在}]
介绍了 8.0.17 系统变量 lock_order_debug_loop
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 从
当LOCK_ORDER工具遇到在锁顺序图中标记为循环的依赖项时,它是否会导致调试断言失败。
-
命令行格式 ——lock-order-debug-missing-arc[={|在}]
介绍了 8.0.17 系统变量 lock_order_debug_missing_arc
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 从
当LOCK_ORDER工具遇到没有在锁顺序图中声明的依赖项时,它是否会导致调试断言失败。
-
命令行格式 ——lock-order-debug-missing-key[={|在}]
介绍了 8.0.17 系统变量 lock_order_debug_missing_key
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 从
当LOCK_ORDER工具遇到没有正确使用Performance Schema检测的对象时,它是否会导致调试断言失败。
lock_order_debug_missing_unlock
命令行格式 ——lock-order-debug-missing-unlock[={|在}]
介绍了 8.0.17 系统变量 lock_order_debug_missing_unlock
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 从
当LOCK_ORDER工具遇到在仍然持有时被销毁的锁时,它是否会导致调试断言失败。
-
命令行格式 ——lock-order-dependencies = file_name
介绍了 8.0.17 系统变量 lock_order_dependencies
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 文件名称 默认值 空字符串
通往天堂之路
lock_order_dependencies.txt
定义服务器锁顺序依赖关系图的文件。它不允许指定任何依赖项。在本例中使用了一个空的依赖关系图。
-
命令行格式 ——lock-order-extra-dependencies = file_name
介绍了 8.0.17 系统变量 lock_order_extra_dependencies
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 文件名称 默认值 空字符串
包含用于锁顺序依赖关系图的附加依赖关系的文件的路径。方法中定义的主服务器依赖关系图非常有用
lock_order_dependencies.txt
文件,带有描述第三方代码行为的附加依赖项。(另一种选择是修改lock_order_dependencies.txt
本身,这是不鼓励的。)如果未设置此变量,则不使用辅助文件。
-
命令行格式 ——lock-order-output-directory = dir_name
介绍了 8.0.17 系统变量 lock_order_output_directory
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 目录名称 默认值 空字符串
LOCK_ORDER工具写入其日志的目录。如果未设置此变量,则默认为当前目录。
-
命令行格式 ——lock-order-print-txt[={|在}]
介绍了 8.0.17 系统变量 lock_order_print_txt
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 从
LOCK_ORDER工具是否执行锁顺序图分析并打印文本报告。该报告包括检测到的任何锁获取周期。
-
命令行格式 ——lock-order-trace-loop[={|在}]
介绍了 8.0.17 系统变量 lock_order_trace_loop
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 从
LOCK_ORDER工具在遇到被标记为锁顺序图中的循环的依赖项时,是否在日志文件中打印跟踪。
-
命令行格式 ——lock-order-trace-missing-arc[={|在}]
介绍了 8.0.17 系统变量 lock_order_trace_missing_arc
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 在
LOCK_ORDER工具在遇到没有在锁顺序图中声明的依赖项时,是否在日志文件中打印跟踪。
-
命令行格式 ——lock-order-trace-missing-key[={|在}]
介绍了 8.0.17 系统变量 lock_order_trace_missing_key
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 从
当LOCK_ORDER工具遇到没有正确使用Performance Schema检测的对象时,它是否在日志文件中打印跟踪。
lock_order_trace_missing_unlock
命令行格式 ——lock-order-trace-missing-unlock[={|在}]
介绍了 8.0.17 系统变量 lock_order_trace_missing_unlock
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 在
LOCK_ORDER工具在遇到仍然持有的锁被销毁时是否在日志文件中打印跟踪。