Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья6 мин чтенияПросмотры1

Как найти долгие транзакции в MySQL 8.4 без завершения соединений

Возраст транзакции и длительность ожидания блокировки — разные показатели. Два запроса чтения помогают найти старые транзакции InnoDB и собрать данные для дальнейшего расследования.

Комментарии 0

Часы без надписей рядом с внешним накопителем на рабочей поверхности. Сгенерированная иллюстрация.
В этой статье

Обмен с 1С завершился, а база магазина продолжает испытывать задержки. Один из возможных следов — транзакция, которая началась давно и ещё не закончилась. Её возраст не равен времени выполнения текущего запроса: между SQL-операциями приложение может ожидать внешний ответ, сохраняя незавершённую транзакцию.

Руководство рассчитано на MySQL 8.4 с InnoDB и уже открытый разрешённый сеанс для диагностики. Это не инструкция для MariaDB. Синтаксис и значения полей сверены с официальным руководством MySQL 8.4 26 сентября 2026 года. Запросы только читают сведения; на стенде MySQL 8.4 они в рамках подготовки материала не выполнялись. Завершение соединений, изменение параметров и исправление приложения сюда не входят.

Для чтения INFORMATION_SCHEMA.INNODB_TRX требуется уже предоставленная привилегия PROCESS. Используйте предназначенную для диагностики учётную запись. Не расширяйте права обычного аккаунта магазина ради этой проверки. Если доступ запрещён, передайте запрос администратору; ошибка доступа не означает отсутствие долгих транзакций.

Сначала подтвердите сервер и место наблюдения

В SQL-сеансе выполните:

SELECT VERSION();

Нужна версия сервера MySQL 8.4, а не установленного на рабочем компьютере клиента. Если подключение ведёт на реплику, наблюдение относится к ней. Оно не описывает транзакции приложения на другом узле. В управляемой базе часть диагностических возможностей может ограничиваться провайдером; эти ограничения не следует обходить.

Перед сбором данных запишите время инцидента и роль узла. Сеанс диагностики должен использовать согласованный режим подключения; не открывайте специально длительную транзакцию для наблюдения. Внешние признаки задержки также сохраните: какой этап обмена или действие покупателя ожидало ответа и когда это происходило.

Выберите самые старые видимые транзакции

Следующий запрос возвращает до двадцати строк, начиная с самых ранних по времени начала. Он не читает содержимое заказов и не выводит текст выполняемого SQL:

SELECT TRX_ID, TRX_MYSQL_THREAD_ID, TRX_STATE, TRX_STARTED, TIMESTAMPDIFF(SECOND, TRX_STARTED, NOW()) AS age_seconds, TRX_WAIT_STARTED FROM INFORMATION_SCHEMA.INNODB_TRX ORDER BY TRX_STARTED LIMIT 20;

Поле TRX_STARTED содержит время начала транзакции. Выражение TIMESTAMPDIFF(SECOND, TRX_STARTED, NOW()) вычисляет разницу в секундах на момент запроса; age_seconds — заданное нами имя этого столбца. Сохраняйте исходное время вместе с рассчитанным возрастом. При сопоставлении с журналами приложения учитывайте часовые пояса, а при аномальных отрицательных значениях проверьте время и контекст наблюдения, прежде чем делать выводы.

TRX_MYSQL_THREAD_ID связывает транзакцию с соединением MySQL. Это не номер процесса Linux и не номер заказа. TRX_ID относится к транзакции; внутренние оптимизации чтения влияют на назначение её идентификатора, поэтому не следует превращать его в универсальный счётчик всей активности базы.

Ограничение LIMIT 20 сокращает результат, а не гарантирует просмотр только двадцати внутренних объектов. Для сортировки серверу может понадобиться обработать больше диагностических сведений. На перегруженной базе не запускайте запрос в частом бесконечном цикле. Начните с одного снимка и повторите его через осмысленный интервал, если это допускает состояние сервера.

Разделите возраст и ожидание блокировки

В TRX_STATE возможны состояния RUNNING, LOCK WAIT, ROLLING BACK и COMMITTING. Они описывают разные этапы. Значение RUNNING само по себе не доказывает, что соединение всё это время непрерывно выполняло один SQL-запрос. Для поиска текущей операции администратору может понадобиться дополнительная информация о соединении.

При LOCK WAIT поле TRX_WAIT_STARTED показывает начало ожидания блокировки. Оно может быть существенно позже TRX_STARTED. Условный пример: транзакция существует 600 секунд, а блокировку ждёт последние 20. Приписывать все десять минут одной блокировке было бы ошибкой. Обратный вывод тоже неверен: старая транзакция без текущего ожидания не обязательно безвредна для остальных.

Наличие LOCK WAIT ещё не показывает, кто удерживает нужный ресурс. Для установления связи ожидающего и блокирующего MySQL 8.4 предоставляет таблицы Performance Schema data_lock_waits и data_locks. Это следующий этап расследования. Не назначайте виновником просто первую строку с наибольшим возрастом.

Старая транзакция может быть ожидаемой частью разрешённой обработки, а может остаться открытой из-за ошибки приложения. Длительное чтение также способно удерживать старое представление данных и мешать очистке ненужных версий строк. Поэтому отсутствие изменения заказов в текущий момент не исключает влияния на работу InnoDB. Однако один возраст не определяет ни ущерб, ни способ вмешательства.

Повторный снимок помогает найти продолжение истории

Повторите тот же запрос через согласованный интервал и сравните связь с соединением, время начала и состояние. Если строка исчезла, транзакция могла завершиться между измерениями. Если сохранилась с тем же началом, её возраст должен увеличиться примерно на длительность интервала. Не объединяйте записи только по номеру соединения после его разрыва и нового подключения.

Сведения о транзакциях и отдельный список соединений не образуют гарантированно единый неподвижный снимок. Документация MySQL предупреждает об их возможной несогласованности во времени. Пока вы переходите от одного источника к другому, запрос уже может закончиться. Отсутствие строки во втором источнике требует проверки времени, а не немедленного вывода о повреждении базы.

Пустой результат говорит лишь о том, что в момент наблюдения в доступной таблице не найдено соответствующих транзакций. Он не доказывает отсутствие блокировок ранее, медленных запросов вне интервала или проблем другого движка. Инструкция ограничена текущим состоянием InnoDB на выбранном сервере.

Сопоставьте находку с операцией приложения

Для ответственного разработчика подготовьте время снимков, версию и роль сервера, идентификатор соединения, начало транзакции, её состояние и момент начала ожидания. Добавьте обезличенное описание операции: например, импорт определённой группы товаров. Пароли, полный заказ и рабочие токены в этот пакет не входят.

Таблица транзакций содержит и поле TRX_QUERY, но приведённая выборка намеренно его не запрашивает. Текст SQL может включать значения из данных покупателей. Если без него нельзя продолжить расследование, администратор собирает нужный фрагмент разрешённым способом и ограничивает круг получателей. Сначала полезно понять, какое приложение владеет соединением и чего оно ожидало.

Не завершайте соединение только потому, что оно оказалось старейшим. Прерывание может запустить длительный откат, затронуть обмен и вызвать повтор операции на стороне приложения. Решение о вмешательстве принимают после выяснения владельца, незавершённых изменений и плана восстановления. Результат этого руководства — подтверждённый след для диагностики, а не автоматически выбранная цель для остановки.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.