Питание отключилось - запрос завершен?

9

Есть ли способ проверить и посмотреть, завершен ли запрос? Я выполнил 3 очень длительных запроса на обновление (+/- 25 часов каждый), когда на прошлой неделе я выходил в отпуск. К сожалению, где-то в течение недели отключилось питание, и машина с MYSQL выключилась. Есть ли способ проверить и посмотреть, какой из 3 (или всех трех) запросов был выполнен?

Я знаю, что могу проверить, обновлялись ли данные, но при правильном и полном выполнении ожидаются значения NULL, и есть 48 миллионов строк данных для просмотра. Какие-нибудь мысли?


источник
6
Журналы ... если вы регистрируете вещи. Если нет, я бы порекомендовал начать.
Бен
1
@ Бен - слишком поздно, чтобы рекомендовать ИБП и транзакционную обработку, я думаю.
1
Если вы используете InnoDB, вы можете делать свой код в транзакциях. dev.mysql.com/doc/refman/5.0/ru/commit.html
1
Если бы у вас была включена медленная регистрация запросов, то медленные запросы, вероятно, оказались бы в медленном журнале запросов.
3
И, в случае, если это не завершилось должным образом, у вас есть резервная копия?

Ответы:

9

Если вы работаете с включенными двоичными журналами, это можно проверить с относительно высокой надежностью.

Сначала, чтобы увидеть, действительно ли включены двоичные журналы, запустите:

SHOW BINARY LOGS;

Если они включены, вы должны получить такой вывод:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000244 |  15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+

В противном случае вы получите сообщение об ошибке.

Теперь, если двоичные журналы включены, то любая успешная фиксация также записывается в двоичные журналы. Я говорю «commit», но правда в том, что любая успешная операция, даже на нетранзакционных таблицах, таких как MyISAM, написана там. Но, честно говоря, чтобы быть уверенным в результатах ваших запросов, я надеюсь, что ради вас вы используете транзакционный движок, такой как InnoDB, иначе вы ни в чем не можете быть уверены.

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

Теперь вы должны найти соответствующий двоичный журнал и найти там запрос. Если вы нашли запрос - хорошо! Если нет - скорее всего, его там нет. Я объясню в ближайшее время.

Какой двоичный журнал содержит ваш запрос? Посмотрите сами двоичные файлы журнала, обычно в вашем каталоге данных. Ищите их метки времени. Когда питание пришло, новый двоичный журнал был создан. Найди это. Ваши запросы, скорее всего, находятся в двоичном журнале перед тем. Это предположение. Это также может быть один до этого и т. Д. Но это хорошее предположение.

Теперь с помощью mysqlbinlogутилиты выполните из командной строки что-то вроде этого:

mysqlbinlog mysql-bin.000245

Замените имя файла тем, которое, как вы подозреваете, будет содержать запрос.

Это выведет все запросы в этом двоичном файле журнала в стандартный вывод. В Unix используйте grepдля поиска вашего запроса:

mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"

На винде удачи. Откройте с помощью блокнота ++ или что-то и искать вручную.

Есть ли запрос? Отлично - вы знаете, это было совершено.

Нет запроса? Нужно проверить по sync_binlogпарам. Это 1 ? Тогда запрос не в двоичном журнале ==> запрос не зафиксирован. Но если sync_binlogне равно 1 , все еще может быть вероятность того, что запрос был зафиксирован, но не в двоичном журнале, поскольку сбой мог произойти сразу после commitи непосредственно перед тем, как двоичный журнал был записан на диск. Затем вам нужно вернуться к другим средствам.

Это: (и, надеюсь, вы снова используете InnoDB): ищите одну строку, которая может идентифицировать результат запроса. С InnoDB вы получаете «все или ничего». Если вы можете быть уверены в единственной строке, затронутой запросом - вы можете быть уверены, что запрос завершен.

edit: конечно, если медленный журнал включен, вы можете ожидать, что такой длинный запрос будет зарегистрирован там и после завершения ...

Удачи!

Шломи Ноах
источник
2
Я надеюсь, что вы остаетесь вокруг.
Jcolebrand
2
@jcolebrand Роландо мог бы участвовать в соревнованиях здесь :)
Philᵀᴹ