文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  LOCK_ORDER 工具

7.9.3 LOCK_ORDER 工具

MySQL 服务器是一个多线程应用程序,它使用许多内部锁和与锁相关的原语,例如互斥锁、rwlocks(包括 prlocks 和 sxlocks)、条件和文件。在服务器中,与锁相关的对象集会随着新功能的实现和性能改进的代码重构而发生变化。与任何使用锁定原语的多线程应用程序一样,在执行过程中始终存在遇到死锁的风险,当同时持有多个锁时。对于 MySQL,死锁的影响是灾难性的,会导致完全的服务中断。

为了能够检测锁获取死锁并强制执行运行时执行没有死锁,MySQL 支持 LOCK_ORDER 工具。这使得可以在服务器设计中定义锁顺序依赖关系图,并且服务器运行时检查以确保锁获取是无环的,并且执行路径符合该图。

本节提供了有关使用 LOCK_ORDER 工具的信息,但仅限于基本级别。有关完整详细信息,请参阅 MySQL 服务器 Doxygen 文档中的锁顺序部分,可在 https://dev.mysqlserver.cn/doc/index-other.html 获取。

LOCK_ORDER 工具旨在用于调试服务器,而不是用于生产环境。

要使用 LOCK_ORDER 工具,请按照以下步骤操作

  1. 从源代码构建 MySQL,使用 -DWITH_LOCK_ORDER=ON CMake 选项配置,以便构建包含 LOCK_ORDER 工具。

    注意

    启用了 WITH_LOCK_ORDER 选项后,MySQL 构建需要 flex 程序。

  2. 要使用启用了 LOCK_ORDER 工具的服务器运行服务器,请在服务器启动时启用 lock_order 系统变量。还提供了一些其他用于 LOCK_ORDER 配置的系统变量。

  3. 对于 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.plLOCK_ORDER 系统变量设置为适当的值。

所有 LOCK_ORDER 系统变量都必须在服务器启动时设置。在运行时,它们的值是可见的,但不能更改。

一些系统变量成对存在,例如 lock_order_debug_looplock_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

    命令行格式 --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

    命令行格式 --lock-order-debug-loop[={OFF|ON}]
    系统变量 lock_order_debug_loop
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔型
    默认值 OFF

    LOCK_ORDER 工具遇到在锁顺序图中被标记为循环的依赖项时,是否会导致调试断言失败。

  • lock_order_debug_missing_arc

    命令行格式 --lock-order-debug-missing-arc[={OFF|ON}]
    系统变量 lock_order_debug_missing_arc
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔型
    默认值 OFF

    当 LOCK_ORDER 工具遇到未在锁顺序图中声明的依赖项时,是否会导致调试断言失败。

  • lock_order_debug_missing_key

    命令行格式 --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

    命令行格式 --lock-order-dependencies=file_name
    系统变量 lock_order_dependencies
    范围 全局
    动态
    SET_VAR 提示适用
    类型 文件名
    默认值 空字符串

    定义服务器锁顺序依赖图的 lock_order_dependencies.txt 文件的路径。

    允许不指定任何依赖项。在这种情况下,将使用空的依赖图。

  • lock_order_extra_dependencies

    命令行格式 --lock-order-extra-dependencies=file_name
    系统变量 lock_order_extra_dependencies
    范围 全局
    动态
    SET_VAR 提示适用
    类型 文件名
    默认值 空字符串

    包含锁顺序依赖图的附加依赖项的文件路径。这对于使用附加依赖项来修改在 lock_order_dependencies.txt 文件中定义的主要服务器依赖图,其中描述了第三方代码的行为非常有用。(另一种方法是修改 lock_order_dependencies.txt 本身,但这并不建议这样做。)

    如果未设置此变量,则不会使用任何辅助文件。

  • lock_order_output_directory

    命令行格式 --lock-order-output-directory=dir_name
    系统变量 lock_order_output_directory
    范围 全局
    动态
    SET_VAR 提示适用
    类型 目录名
    默认值 空字符串

    LOCK_ORDER 工具写入日志的目录。如果未设置此变量,则默认值为当前目录。

  • lock_order_print_txt

    命令行格式 --lock-order-print-txt[={OFF|ON}]
    系统变量 lock_order_print_txt
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔型
    默认值 OFF

    是否 LOCK_ORDER 工具执行锁顺序图分析并打印文本报告。该报告包括检测到的任何锁获取循环。

  • lock_order_trace_loop

    命令行格式 --lock-order-trace-loop[={OFF|ON}]
    系统变量 lock_order_trace_loop
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔型
    默认值 OFF

    LOCK_ORDER 工具遇到在锁顺序图中被标记为循环的依赖项时,是否在日志文件中打印跟踪。

  • lock_order_trace_missing_arc

    命令行格式 --lock-order-trace-missing-arc[={OFF|ON}]
    系统变量 lock_order_trace_missing_arc
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔型
    默认值 ON

    LOCK_ORDER 工具遇到未在锁顺序图中声明的依赖项时,是否在日志文件中打印跟踪。

  • lock_order_trace_missing_key

    命令行格式 --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 工具遇到仍被持有的锁被销毁时,是否在日志文件中打印跟踪。