• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • LOCK_ORDER工具

    MySQL服务器是一个多线程应用程序,它使用许多内部锁定和与锁定相关的原语,例如互斥体,rwlock(包括prlock和sxlock),条件和文件。在服务器内,与锁相关的对象集随着新功能的实现和代码重构而改变,以提高性能。与使用锁定原语的任何多线程应用程序一样,执行一次同时持有多个锁时,总是有遇到死锁的风险。对于MySQL,死锁的后果是灾难性的,导致服务完全丧失。

    从MySQL 8.0.17开始,为了支持检测锁获取死锁并强制执行运行时释放死锁,MySQL支持LOCK_ORDER工具。这使锁顺序依赖关系图可以定义为服务器设计的一部分,并且可以通过服务器运行时检查来确保锁获取是非循环的,并且执行路径符合该图。

    本节仅在基本级别上提供有关使用LOCK_ORDER工具的信息。有关完整的详细信息,请参见MySQL Server Doxygen文档的“锁定顺序”部分,该文档位于https://dev.mysql.com/doc/index-other.html。

    LOCK_ORDER工具用于调试服务器,而不用于生产用途。

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

    1. 从源代码构建MySQL,并使用CMake选项对其进行配置,以便该构建包括LOCK_ORDER工具。-DWITH_LOCK_ORDER=ON

      注意

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

    2. 要在启用LOCK_ORDER工具的情况下运行服务器,请lock_order在服务器启动时启用系统变量。也可以使用其他几个用于LOCK_ORDER配置的系统变量。
    3. 对于MySQL测试套件操作,mysql-test-run.pl有一个--lock-order选项,用于控制在测试用例执行期间是否启用LOCK_ORDER工具。

    假设MySQL已构建为包括LOCK_ORDER工具,则以下描述的系统变量将配置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_looplock_order_trace_loop。对于此类对,在与变量关联的条件发生时,将变量区分如下:

    • 如果_debug_启用了变量,则会引发调试声明。
    • 如果_trace_启用了该变量,则将错误打印到日志中。

    LOCK_ORDER系统变量摘要

    变量名变量类型可变范围
    lock_order布尔型Global
    lock_order_debug_loop布尔型Global
    lock_order_debug_missing_arc布尔型Global
    lock_order_debug_missing_key布尔型Global
    lock_order_debug_missing_unlock布尔型Global
    lock_order_dependencies文档名称Global
    lock_order_extra_dependencies文档名称Global
    lock_order_output_directory目录名Global
    lock_order_print_txt布尔型Global
    lock_order_trace_loop布尔型Global
    lock_order_trace_missing_arc布尔型Global
    lock_order_trace_missing_key布尔型Global
    lock_order_trace_missing_unlock布尔型Global

    • lock_order

      属性
      命令行格式--lock-order[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order
      范围Global
      动态没有
      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}]
      介绍了8.0.17
      系统变量lock_order_debug_loop
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值OFF

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

    • lock_order_debug_missing_arc

      属性
      命令行格式--lock-order-debug-missing-arc[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order_debug_missing_arc
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值OFF

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

    • lock_order_debug_missing_key

      属性
      命令行格式--lock-order-debug-missing-key[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order_debug_missing_key
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值OFF

      当LOCK_ORDER工具遇到性能模型未正确检测的对象时,是否导致调试断言失败。

    • lock_order_debug_missing_unlock

      属性
      命令行格式--lock-order-debug-missing-unlock[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order_debug_missing_unlock
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值OFF

      当LOCK_ORDER工具遇到仍被保留的销毁的锁时,是否导致调试断言失败。

    • lock_order_dependencies

      属性
      命令行格式--lock-order-dependencies=file_name
      介绍了8.0.17
      系统变量lock_order_dependencies
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型文档名称
      默认值empty string

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

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

    • lock_order_extra_dependencies

      属性
      命令行格式--lock-order-extra-dependencies=file_name
      介绍了8.0.17
      系统变量lock_order_extra_dependencies
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型文档名称
      默认值empty string

      包含锁定顺序依赖关系图的其他依赖关系的文件的路径。这对于修改lock_order_dependencies.txt文件中定义的主服务器依赖关系图很有用,并带有描述第三方代码行为的其他依赖关系。(另一种方法是修改lock_order_dependencies.txt自身,不鼓励这样做。)

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

    • lock_order_output_directory

      属性
      命令行格式--lock-order-output-directory=dir_name
      介绍了8.0.17
      系统变量lock_order_output_directory
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型目录名
      默认值empty string

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

    • lock_order_print_txt

      属性
      命令行格式--lock-order-print-txt[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order_print_txt
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值OFF

      LOCK_ORDER工具是否执行锁定顺序图分析并打印文本报告。该报告包括检测到的所有锁定获取周期。

    • lock_order_trace_loop

      属性
      命令行格式--lock-order-trace-loop[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order_trace_loop
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值OFF

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

    • lock_order_trace_missing_arc

      属性
      命令行格式--lock-order-trace-missing-arc[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order_trace_missing_arc
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值ON

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

    • lock_order_trace_missing_key

      属性
      命令行格式--lock-order-trace-missing-key[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order_trace_missing_key
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值OFF

      当LOCK_ORDER工具遇到性能模型未正确检测的对象时,是否在日志文件中打印跟踪。

    • lock_order_trace_missing_unlock

      属性
      命令行格式--lock-order-trace-missing-unlock[={OFF|ON}]
      介绍了8.0.17
      系统变量lock_order_trace_missing_unlock
      范围Global
      动态没有
      SET_VAR提示适用没有
      类型布尔型
      默认值ON

      当LOCK_ORDER工具遇到仍然被破坏的锁时,是否在日志文件中打印跟踪。