Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  The LOCK_ORDER Tool

7.9.3 LOCK_ORDER 工具

MySQL 服务器是一个多线程应用程序,使用了许多内部锁定和锁定相关的基本对象,如互斥锁、读写锁(包括排他锁和共享锁)、条件变量和文件。服务器内部的锁定相关对象随着新功能实现和性能改进代码重构而变化。在任何多线程应用程序中使用锁定基本对象时,总是存在死锁风险,即在同时持有多个锁定的情况下可能会遇到死锁。对于 MySQL,死锁的影响是灾难性的,导致服务完全失效。

为了启用锁定获取死锁检测和执行时间免费的检查,MySQL 支持 LOCK_ORDER 工具。这使得可以在服务器设计中定义锁定顺序依赖图,并在运行时检查锁定获取是否是无环的,并且执行路径符合图。

本节提供了使用 LOCK_ORDER 工具的基本信息,但只限于基本信息。对于详细信息,请见 MySQL 服务器 Doxygen 文档中的锁定顺序部分,位于 https://dev.mysql.com/doc/index-other.html

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

要使用 LOCK_ORDER 工具,请按照以下步骤进行:

  1. 从源代码构建 MySQL,使用-DWITH_LOCK_ORDER=ONCMake选项,以便在构建中包含LOCK_ORDER工具。

    Note

    启用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特性可用。

Note

一般来说,意图是使用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系统变量总结

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 布尔值 全局

  • lock_order

    Command-Line Format --lock-order[={OFF|ON}]
    System Variable lock_order
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value OFF

    是否在运行时启用 LOCK_ORDER 工具。如果lock_order被禁用(默认),则其他LOCK_ORDER系统变量没有任何影响。如果lock_order启用,则其他系统变量配置哪些LOCK_ORDER特性启用。

    如果lock_order启用,服务器将在遇到未在锁定顺序图中声明的锁定获取序列时raise错误。

  • lock_order_debug_loop

    Command-Line Format --lock-order-debug-loop[={OFF|ON}]
    System Variable lock_order_debug_loop
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value OFF

    是否在锁定顺序工具遇到循环依赖关系时引发调试断言失败。

  • lock_order_debug_missing_arc

    Command-Line Format --lock-order-debug-missing-arc[={OFF|ON}]
    System Variable lock_order_debug_missing_arc
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value OFF

    是否在锁定顺序工具遇到未在锁定顺序图中声明的依赖关系时引发调试断言失败。

  • lock_order_debug_missing_key

    Command-Line Format --lock-order-debug-missing-key[={OFF|ON}]
    System Variable lock_order_debug_missing_key
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value OFF

    是否在锁定顺序工具遇到未正确 instrumentalized 的性能架构对象时引发调试断言失败。

  • lock_order_debug_missing_unlock

    Command-Line Format --lock-order-debug-missing-unlock[={OFF|ON}]
    System Variable lock_order_debug_missing_unlock
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value OFF

    是否在LOCK_ORDER工具遇到被销毁而仍然持有的锁时,导致调试断言失败。

  • lock_order_dependencies

    Command-Line Format --lock-order-dependencies=文件名
    System Variable lock_order_dependencies
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 文件名
    Default Value 空字符串

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

    允许指定无依赖关系。使用空依赖关系时,该情况将被用于。

  • lock_order_extra_dependencies

    Command-Line Format --lock-order-extra-dependencies=文件名
    System Variable lock_order_extra_dependencies
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 文件名
    Default Value 空字符串

    包含锁定顺序依赖图的额外依赖项的文件路径。这对于补充主服务器依赖图,定义在lock_order_dependencies.txt文件中,以描述第三方代码的行为。 (修改lock_order_dependencies.txt文件本身不鼓励。)

    如果该变量未设置,则不会使用secondary文件。

  • lock_order_output_directory

    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工具将其日志写入的目录。如果该变量未设置,则默认为当前目录。

  • lock_order_print_txt

    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工具执行锁定顺序图分析,并在报告中包含任何检测到的锁定获取循环。

  • lock_order_trace_loop

    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工具在遇到锁定顺序图中标记为循环的依赖项时,在日志文件中打印跟踪。

  • lock_order_trace_missing_arc

    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工具在遇到锁定顺序图中未声明的依赖项时,在日志文件中打印跟踪。

  • lock_order_trace_missing_key

    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工具遇到未正确 instrumental 的对象时的跟踪信息。

  • 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工具遇到锁被销毁而仍然持有的时的跟踪信息。