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
工具遇到未用性能模式正确检测到的对象时,是否会导致调试断言失败。 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
工具遇到未用性能模式正确检测到的对象时,是否在日志文件中打印跟踪。 lock_order_trace_missing_unlock
命令行格式 --lock-order-trace-missing-unlock[={OFF|ON}]
系统变量 lock_order_trace_missing_unlock
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 ON
当
LOCK_ORDER
工具遇到在仍被持有时被销毁的锁时,是否在日志文件中打印跟踪。