暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

5.9.3 LOCK_ORDER工具

原创 由迪 2020-10-02
1589

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_启用了该变量,则将错误打印到日志中。

表5.7 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}]
    介绍了 8.0.17
    系统变量 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}]
    介绍了 8.0.17
    系统变量 lock_order_debug_loop
    范围 全局
    动态 没有
    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
    范围 全局
    动态 没有
    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
    范围 全局
    动态 没有
    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
    范围 全局
    动态 没有
    SET_VAR 提示适用 没有
    类型 布尔型
    默认值 OFF

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

  • lock_order_dependencies

    命令行格式 --lock-order-dependencies=file_name
    介绍了 8.0.17
    系统变量 lock_order_dependencies
    范围 全局
    动态 没有
    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
    范围 全局
    动态 没有
    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
    范围 全局
    动态 没有
    SET_VAR 提示适用 没有
    类型 目录名
    默认值 empty string

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

  • lock_order_print_txt

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

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

  • lock_order_trace_loop

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

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论