Spec-Zone.ru › MySQL 8.4

7.9.3 Инструмент LOCK_ORDER

Сервер MySQL — многопоточная программа, которая использует множество внутренних блокировок и связанных с ними примитивов, таких как мьютексы, rwlocks (включая prlocks и sxlocks), условия и файлы. Внутри сервера набор объектов, связанных с блокировками, изменяется с реализацией новых функций и рефакторингом кода для повышения производительности. Как и в любой многопоточной программе, использующей примитивы блокировки, всегда существует риск возникновения тупиковой ситуации во время выполнения, когда несколько блокировок удерживаются одновременно. Для MySQL последствия тупиковой ситуации катастрофические, приводя к полному отказу в обслуживании.

Для того, чтобы обеспечить обнаружение тупиков при приобретении блокировок и гарантировать отсутствие тупиков во время выполнения, MySQL поддерживает инструмент LOCK_ORDER. Это позволяет определить зависимость графа порядка блокировок как часть проектирования сервера, а также обеспечить проверку во время работы сервера, чтобы гарантировать, что приобретение блокировок является ациклическим, и что пути выполнения соответствуют графу.

Этот раздел предоставляет информацию об использовании инструмента LOCK_ORDER, но только на базовом уровне. Для получения полной информации см. раздел «Порядок блокировок» в документации MySQL Server Doxygen, доступной по адресу https://dev.mysql.com/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.pl для установки системных переменных LOCK_ORDER с соответствующими значениями.

Все системные переменные LOCK_ORDER должны быть установлены при запуске сервера. Во время выполнения их значения видимы, но изменить их нельзя.

Некоторые системные переменные существуют парами, например lock_order_debug_loop и lock_order_trace_loop. Для таких пар переменные различаются следующим образом, когда возникает условие, с которым они связаны:

  • Если переменная _debug_ включена, вызывается ошибка отладки.

  • Если переменная _trace_ включена, сообщение об ошибке записывается в журналы.

Таблица 7.8 Краткое описание системной переменной LOCK_ORDER

Таблица 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 Булево Глобальная

END_OF_DOCUMENT_MARKER
  • 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 Подсказка применяется Нет
    Тип Имя файла
    Значение по умолчанию empty string

    Путь к файлу lock_order_dependencies.txt, который определяет граф зависимостей порядка блокировок сервера.

    Разрешено не указывать зависимости. В этом случае используется пустой граф зависимостей.

  • lock_order_extra_dependencies

    Формат командной строки --lock-order-extra-dependencies=file_name
    Системная переменная 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
    Системная переменная lock_order_output_directory
    Область видимости Глобальная
    Динамическая Нет
    SET_VAR Подсказка применяется Нет
    Тип Имя каталога
    Значение по умолчанию empty string

    Каталог, в который инструмент 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 выводить трассировку в файл журнала, когда он обнаружит блокировку, уничтоженную при её удержании.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/lock-order-tool.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API