MySQL 服务器是一个多线程应用程序,它使用许多内部锁和与锁相关的原语,例如互斥锁、rwlocks(包括 prlocks 和 sxlocks)、条件和文件。在服务器中,与锁相关的对象集会随着新功能的实现和性能改进的代码重构而发生变化。与任何使用锁定原语的多线程应用程序一样,在执行过程中始终存在遇到死锁的风险,当同时持有多个锁时。对于 MySQL,死锁的影响是灾难性的,会导致完全的服务中断。
为了能够检测锁获取死锁并强制执行运行时执行没有死锁,MySQL 支持 LOCK_ORDER
工具。这使得可以在服务器设计中定义锁顺序依赖关系图,并且服务器运行时检查以确保锁获取是无环的,并且执行路径符合该图。
本节提供了有关使用 LOCK_ORDER
工具的信息,但仅限于基本级别。有关完整详细信息,请参阅 MySQL 服务器 Doxygen 文档中的锁顺序部分,可在 https://dev.mysqlserver.cn/doc/index-other.html 获取。
LOCK_ORDER
工具旨在用于调试服务器,而不是用于生产环境。
要使用 LOCK_ORDER
工具,请按照以下步骤操作
从源代码构建 MySQL,使用
-DWITH_LOCK_ORDER=ON
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_
变量被启用,则会将错误打印到日志。
表 7.8 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[={OFF|ON}]
系统变量 lock_order
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 OFF
是否在运行时启用
LOCK_ORDER
工具。如果lock_order
被禁用(默认情况下),其他LOCK_ORDER
系统变量将不起作用。如果lock_order
被启用,其他系统变量将配置要启用的LOCK_ORDER
功能。如果
lock_order
被启用,如果服务器遇到未在锁顺序图中声明的锁获取顺序,则会引发错误。 -
命令行格式 --lock-order-debug-loop[={OFF|ON}]
系统变量 lock_order_debug_loop
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 OFF
当
LOCK_ORDER
工具遇到在锁顺序图中被标记为循环的依赖项时,是否会导致调试断言失败。 -
命令行格式 --lock-order-debug-missing-arc[={OFF|ON}]
系统变量 lock_order_debug_missing_arc
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 OFF
当 LOCK_ORDER 工具遇到未在锁顺序图中声明的依赖项时,是否会导致调试断言失败。
-
命令行格式 --lock-order-debug-missing-key[={OFF|ON}]
系统变量 lock_order_debug_missing_key
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 OFF
当
LOCK_ORDER
工具遇到未用 Performance Schema 正确检测到的对象时,是否会导致调试断言失败。 lock_order_debug_missing_unlock
命令行格式 --lock-order-debug-missing-unlock[={OFF|ON}]
系统变量 lock_order_debug_missing_unlock
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 OFF
当
LOCK_ORDER
工具遇到仍被持有的锁被销毁时,是否会导致调试断言失败。-
命令行格式 --lock-order-dependencies=file_name
系统变量 lock_order_dependencies
范围 全局 动态 否 SET_VAR
提示适用否 类型 文件名 默认值 空字符串
定义服务器锁顺序依赖图的
lock_order_dependencies.txt
文件的路径。允许不指定任何依赖项。在这种情况下,将使用空的依赖图。
-
命令行格式 --lock-order-extra-dependencies=file_name
系统变量 lock_order_extra_dependencies
范围 全局 动态 否 SET_VAR
提示适用否 类型 文件名 默认值 空字符串
包含锁顺序依赖图的附加依赖项的文件路径。这对于使用附加依赖项来修改在
lock_order_dependencies.txt
文件中定义的主要服务器依赖图,其中描述了第三方代码的行为非常有用。(另一种方法是修改lock_order_dependencies.txt
本身,但这并不建议这样做。)如果未设置此变量,则不会使用任何辅助文件。
-
命令行格式 --lock-order-output-directory=dir_name
系统变量 lock_order_output_directory
范围 全局 动态 否 SET_VAR
提示适用否 类型 目录名 默认值 空字符串
LOCK_ORDER
工具写入日志的目录。如果未设置此变量,则默认值为当前目录。 -
命令行格式 --lock-order-print-txt[={OFF|ON}]
系统变量 lock_order_print_txt
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 OFF
是否
LOCK_ORDER
工具执行锁顺序图分析并打印文本报告。该报告包括检测到的任何锁获取循环。 -
命令行格式 --lock-order-trace-loop[={OFF|ON}]
系统变量 lock_order_trace_loop
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 OFF
当
LOCK_ORDER
工具遇到在锁顺序图中被标记为循环的依赖项时,是否在日志文件中打印跟踪。 -
命令行格式 --lock-order-trace-missing-arc[={OFF|ON}]
系统变量 lock_order_trace_missing_arc
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 ON
当
LOCK_ORDER
工具遇到未在锁顺序图中声明的依赖项时,是否在日志文件中打印跟踪。 -
命令行格式 --lock-order-trace-missing-key[={OFF|ON}]
系统变量 lock_order_trace_missing_key
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 OFF
当
LOCK_ORDER
工具遇到未用 Performance Schema 正确检测到的对象时,是否在日志文件中打印跟踪。 lock_order_trace_missing_unlock
命令行格式 --lock-order-trace-missing-unlock[={OFF|ON}]
系统变量 lock_order_trace_missing_unlock
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔型 默认值 ON
当
LOCK_ORDER
工具遇到仍被持有的锁被销毁时,是否在日志文件中打印跟踪。