Spec-Zone.ru › MySQL 9.2

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.12 Краткое описание переменных системы LOCK_ORDER

Таблица 7.12 Краткое описание переменных системы 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-9.2-en/lock-order-tool.html

Spec-Zone.ru

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