Есть ли способ проверить и посмотреть, завершен ли запрос? Я выполнил 3 очень длительных запроса на обновление (+/- 25 часов каждый), когда на прошлой неделе я выходил в отпуск. К сожалению, где-то в течение недели отключилось питание, и машина с MYSQL выключилась. Есть ли способ проверить и посмотреть, какой из 3 (или всех трех) запросов был выполнен?
Я знаю, что могу проверить, обновлялись ли данные, но при правильном и полном выполнении ожидаются значения NULL, и есть 48 миллионов строк данных для просмотра. Какие-нибудь мысли?
Ответы:
Если вы работаете с включенными двоичными журналами, это можно проверить с относительно высокой надежностью.
Сначала, чтобы увидеть, действительно ли включены двоичные журналы, запустите:
Если они включены, вы должны получить такой вывод:
В противном случае вы получите сообщение об ошибке.
Теперь, если двоичные журналы включены, то любая успешная фиксация также записывается в двоичные журналы. Я говорю «commit», но правда в том, что любая успешная операция, даже на нетранзакционных таблицах, таких как MyISAM, написана там. Но, честно говоря, чтобы быть уверенным в результатах ваших запросов, я надеюсь, что ради вас вы используете транзакционный движок, такой как InnoDB, иначе вы ни в чем не можете быть уверены.
Итак, если предположить, что теперь у вас включены двоичные журналы и что ваши таблицы являются транзакционными (надеюсь, InnoDB), то ожидается, что успешное завершение ваших запросов будет записано в двоичные журналы.
Теперь вы должны найти соответствующий двоичный журнал и найти там запрос. Если вы нашли запрос - хорошо! Если нет - скорее всего, его там нет. Я объясню в ближайшее время.
Какой двоичный журнал содержит ваш запрос? Посмотрите сами двоичные файлы журнала, обычно в вашем каталоге данных. Ищите их метки времени. Когда питание пришло, новый двоичный журнал был создан. Найди это. Ваши запросы, скорее всего, находятся в двоичном журнале перед тем. Это предположение. Это также может быть один до этого и т. Д. Но это хорошее предположение.
Теперь с помощью
mysqlbinlog
утилиты выполните из командной строки что-то вроде этого:Замените имя файла тем, которое, как вы подозреваете, будет содержать запрос.
Это выведет все запросы в этом двоичном файле журнала в стандартный вывод. В Unix используйте
grep
для поиска вашего запроса:На винде удачи. Откройте с помощью блокнота ++ или что-то и искать вручную.
Есть ли запрос? Отлично - вы знаете, это было совершено.
Нет запроса? Нужно проверить по
sync_binlog
парам. Это 1 ? Тогда запрос не в двоичном журнале ==> запрос не зафиксирован. Но еслиsync_binlog
не равно 1 , все еще может быть вероятность того, что запрос был зафиксирован, но не в двоичном журнале, поскольку сбой мог произойти сразу послеcommit
и непосредственно перед тем, как двоичный журнал был записан на диск. Затем вам нужно вернуться к другим средствам.Это: (и, надеюсь, вы снова используете InnoDB): ищите одну строку, которая может идентифицировать результат запроса. С InnoDB вы получаете «все или ничего». Если вы можете быть уверены в единственной строке, затронутой запросом - вы можете быть уверены, что запрос завершен.
edit: конечно, если медленный журнал включен, вы можете ожидать, что такой длинный запрос будет зарегистрирован там и после завершения ...
Удачи!
источник