7.9.3 LOCK_ORDER 工具
MySQL 服务器是一个多线程应用程序,使用了许多内部锁定和锁定相关的基本对象,如互斥锁、读写锁(包括排他锁和共享锁)、条件变量和文件。服务器内部的锁定相关对象随着新功能实现和性能改进代码重构而变化。在任何多线程应用程序中使用锁定基本对象时,总是存在死锁风险,即在同时持有多个锁定的情况下可能会遇到死锁。对于 MySQL,死锁的影响是灾难性的,导致服务完全失效。
为了启用锁定获取死锁检测和执行时间免费的检查,MySQL 支持 LOCK_ORDER
工具。这使得可以在服务器设计中定义锁定顺序依赖图,并在运行时检查锁定获取是否是无环的,并且执行路径符合图。
本节提供了使用 LOCK_ORDER
工具的基本信息,但只限于基本信息。对于详细信息,请见 MySQL 服务器 Doxygen 文档中的锁定顺序部分,位于 https://dev.mysql.com/doc/index-other.html。
LOCK_ORDER
工具旨在用于调试服务器,而不是生产环境使用。
要使用 LOCK_ORDER
工具,请按照以下步骤进行:
-
从源代码构建 MySQL,使用
-DWITH_LOCK_ORDER=ON
CMake选项,以便在构建中包含LOCK_ORDER
工具。Note启用
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_
变量,则将在日志中打印错误信息。
表7.8 LOCK_ORDER系统变量总结
Variable Name | Variable Type | Variable Scope |
---|---|---|
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 | 布尔值 | 全局 |
-
Command-Line Format --lock-order[={OFF|ON}]
System Variable lock_order
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否在运行时启用
LOCK_ORDER
工具。如果lock_order
被禁用(默认),则其他LOCK_ORDER
系统变量没有任何影响。如果lock_order
启用,则其他系统变量配置哪些LOCK_ORDER
特性启用。如果
lock_order
启用,服务器将在遇到未在锁定顺序图中声明的锁定获取序列时raise错误。 -
Command-Line Format --lock-order-debug-loop[={OFF|ON}]
System Variable lock_order_debug_loop
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否在锁定顺序工具遇到循环依赖关系时引发调试断言失败。
-
Command-Line Format --lock-order-debug-missing-arc[={OFF|ON}]
System Variable lock_order_debug_missing_arc
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否在锁定顺序工具遇到未在锁定顺序图中声明的依赖关系时引发调试断言失败。
-
Command-Line Format --lock-order-debug-missing-key[={OFF|ON}]
System Variable lock_order_debug_missing_key
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否在锁定顺序工具遇到未正确 instrumentalized 的性能架构对象时引发调试断言失败。
-
lock_order_debug_missing_unlock
Command-Line Format --lock-order-debug-missing-unlock[={OFF|ON}]
System Variable lock_order_debug_missing_unlock
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否在LOCK_ORDER工具遇到被销毁而仍然持有的锁时,导致调试断言失败。
-
Command-Line Format --lock-order-dependencies=文件名
System Variable lock_order_dependencies
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 文件名 Default Value 空字符串
锁定顺序依赖图的服务器路径,定义在
lock_order_dependencies.txt
文件中。允许指定无依赖关系。使用空依赖关系时,该情况将被用于。
-
Command-Line Format --lock-order-extra-dependencies=文件名
System Variable lock_order_extra_dependencies
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 文件名 Default Value 空字符串
包含锁定顺序依赖图的额外依赖项的文件路径。这对于补充主服务器依赖图,定义在
lock_order_dependencies.txt
文件中,以描述第三方代码的行为。 (修改lock_order_dependencies.txt
文件本身不鼓励。)如果该变量未设置,则不会使用secondary文件。
-
Command-Line Format --lock-order-output-directory=dir_name
System Variable lock_order_output_directory
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 目录名 Default Value 空字符串
LOCK_ORDER工具将其日志写入的目录。如果该变量未设置,则默认为当前目录。
-
Command-Line Format --lock-order-print-txt[={OFF|ON}]
System Variable lock_order_print_txt
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否将
LOCK_ORDER
工具执行锁定顺序图分析,并在报告中包含任何检测到的锁定获取循环。 -
Command-Line Format --lock-order-trace-loop[={OFF|ON}]
System Variable lock_order_trace_loop
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否将
LOCK_ORDER
工具在遇到锁定顺序图中标记为循环的依赖项时,在日志文件中打印跟踪。 -
Command-Line Format --lock-order-trace-missing-arc[={OFF|ON}]
System Variable lock_order_trace_missing_arc
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
是否将
LOCK_ORDER
工具在遇到锁定顺序图中未声明的依赖项时,在日志文件中打印跟踪。 -
Command-Line Format --lock-order-trace-missing-key[={OFF|ON}]
System Variable lock_order_trace_missing_key
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否在日志文件中打印LOCK_ORDER工具遇到未正确 instrumental 的对象时的跟踪信息。
-
lock_order_trace_missing_unlock
Command-Line Format --lock-order-trace-missing-unlock[={OFF|ON}]
System Variable lock_order_trace_missing_unlock
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
是否在日志文件中打印LOCK_ORDER工具遇到锁被销毁而仍然持有的时的跟踪信息。