Отправить системный статус, когда MySQL большая транзакция потерпела неудачу
В настоящее время каждая наша транзакция MySQL вычисляет и обновляет 100K+~ миллионов строк в таблицу строк от 100K до миллиарда. Иногда такая транзакция не удалась по непонятным причинам, и мы пытаемся ее сортировать. Некоторые люди предполагают, что ограничение количества строк в каждой транзакции (менее 100 Ks) является хорошей практикой. Тем не менее, мы хотели бы лучше определить, каков предел транзакций в нашем случае. Также мы хотели бы сделать сообщение об ошибке транзакции более информативным, добавив больше системного статуса во время сбоя транзакции, чтобы мы могли
уверенно знать, что такое лимит транзакций в текущей спецификации оборудования. Любые два цента? Прямо сейчас мы печатаем MySQL "показывать переменные", когда транзакция не удалась, а также полу-вручную сравниваем системные ресурсы с помощью графана. https://grafana.com/ Это довольно трудоемко и может быть неточным, поскольку у grafana могут быть некоторые задержки и т. д.
Благодарю.
1 ответ
Вместо того, чтобы пытаться проанализировать слишком большую транзакцию, давайте обсудим варианты ее устранения.
Было бы нормально разбить его, скажем, на 10 тысяч строк одновременно? То есть после каждых 10К строк появляется COMMIT
, Это разбивает одну транзакцию на несколько. С точки зрения производительности и сбоя, это определенная победа. С точки зрения КИСЛОТЫ, ну, вы должны ответить на это.
Предполагая, что вы можете разбить его на части, я рекомендую методику, приведенную здесь, в качестве возможного способа эффективного выполнения запроса: http://mysql.rjweb.org/doc.php/deletebig (Да, с небольшими изменениями, он применяется к UPDATE
.)