MySQL 服务器是一个多线程应用程序,使用了许多内部锁和锁相关的基本原理,如互斥锁、读写锁(包括prlocks 和 sxlocks)、条件和文件。在服务器中,锁相关对象的集合随着新功能的实现和性能改进的代码重构而变化。与任何使用锁基本原理的多线程应用程序一样,在执行期间遇到死锁的风险总是存在的,对 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 with --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 --锁顺序[={OFF|ON}]
System Variable 锁顺序
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔 Default Value OFF
是否启用
LOCK_ORDER
工具在运行时。如果锁顺序
被禁用(默认),则其他LOCK_ORDER
系统变量无效。如果锁顺序
被启用,其他系统变量配置哪些LOCK_ORDER
功能启用。如果
锁顺序
被启用,服务器遇到未在锁顺序图中声明的锁获取序列时将引发错误。 -
Command-Line Format --锁顺序-调试-循环[={OFF|ON}]
System Variable 锁顺序调试循环
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔 Default Value OFF
是否
LOCK_ORDER
工具在遇到锁顺序图中标记为循环的依赖项时引发调试断言失败。 -
Command-Line Format --锁顺序-调试-缺失-弧[={OFF|ON}]
System Variable 锁顺序调试缺失弧
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔 Default Value OFF
是否
LOCK_ORDER
工具在遇到未在锁顺序图中声明的依赖项时引发调试断言失败。 -
Command-Line Format --锁顺序-调试-缺失-键[={OFF|ON}]
System Variable 锁顺序调试缺失键
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔 Default Value OFF
是否
LOCK_ORDER
工具在遇到未正确 instrumented 到性能模式中的对象时引发调试断言失败。 -
Command-Line Format --锁顺序-调试-缺失-解锁[={OFF|ON}]
System Variable 锁顺序调试缺失解锁
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔 Default Value OFF
是否
LOCK_ORDER
工具在遇到仍然持有的锁被销毁时引发调试断言失败。 -
Command-Line Format --锁顺序-依赖项=file_name
System Variable 锁顺序依赖项
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 文件名 Default Value 空字符串
定义服务器锁顺序依赖项图的文件路径
lock_order_dependencies.txt
。允许指定无依赖项。空依赖项图将在这种情况下使用。
-
Command-Line Format --锁顺序-额外-依赖项=file_name
System Variable 锁顺序额外依赖项
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 文件名 Default Value 空字符串
文件路径,包含锁定顺序依赖图的附加依赖项。这对于修改主服务器依赖图(定义在
lock_order_dependencies.txt
文件中)以描述第三方代码的行为非常有用。(另一种方法是修改lock_order_dependencies.txt
文件本身,但这不被推荐。)如果此变量未设置,则不使用辅助文件。
-
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 工具在日志文件中是否打印跟踪信息,当它遇到未正确instrumented的对象时。
-
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 工具在日志文件中是否打印跟踪信息,当它遇到销毁时仍持有的锁时。