文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  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 工具遇到未用性能模式正确检测到的对象时,是否会导致调试断言失败。

  • 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 工具遇到未用性能模式正确检测到的对象时,是否在日志文件中打印跟踪。

  • lock_order_trace_missing_unlock

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

    LOCK_ORDER 工具遇到在仍被持有时被销毁的锁时,是否在日志文件中打印跟踪。