Потужність згасла - Чи завершився запит?


9

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

Я знаю, що міг би перевірити, чи були дані оновлені, але очікується, що NULL з правильним та повним виконанням слід очікувати, і для аналізу потрібно 48 мільйонів рядків. Будь-які думки?

mysql 

6
Журнали ... якщо ви реєструєте речі. Якщо ви цього не зробите, я б не рекомендував починати.
Бен

1
@Ben - занадто пізно, щоб рекомендувати UPS та транзакційну обробку, я думаю.

1
Якщо ви використовуєте InnoDB, ви можете робити свій код в транзакціях. dev.mysql.com/doc/refman/5.0/uk/commit.html

1
Якщо у вас було увімкнено повільний журнал запитів, то запити, які повільно, мабуть, потрапили б у журнал повільних запитів.

3
І якщо ви не завершили належним чином, у вас є резервна копія?

Відповіді:


9

Якщо ви працюєте з увімкненими двійковими журналами, це можна перевірити з відносно високою надійністю.

По-перше, щоб побачити, чи дійсно двійкові журнали включені, запустіть:

SHOW BINARY LOGS;

Якщо вони включені, ви повинні отримати такий результат:

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

Інакше ви отримаєте повідомлення про помилку.

Тепер, якщо ввімкнено бінарні журнали, то будь-яка успішна фіксація також записується до двійкових журналів. Я кажу "фіксую", але правда - будь-яка успішна операція, навіть на не транзакційних таблицях, таких як MyISAM, написана там. Але, чесно кажучи, щоб мати певну впевненість у результатах ваших запитів, я сподіваюся, що заради вас використовується транзакційний двигун, такий як InnoDB, інакше ви не можете бути впевнені ні в чому.

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

Тепер ви повинні знайти відповідний бінарний журнал і шукати там запит. Якщо ви знайшли запит - добре! Якщо ні - це, швидше за все, не там. Я поясню коротко.

Який бінарний журнал містить ваш запит? Перегляньте самі файли бінарних журналів, як правило, у вашому каталозі даних. Шукайте їх часові позначки. Коли з'явилася потужність, був створений новий двійковий журнал. Знайти це. Ваші запити, ймовірно, знаходяться у двійковому журналі перед цим. Це здогад. Це може бути і до цього, і т. Д. Але це гарна здогадка.

Тепер, використовуючи mysqlbinlogутиліту, виконайте з командного рядка щось подібне:

mysqlbinlog mysql-bin.000245

Замініть ім'я файлу тим, кого ви підозрюєте, що він містить запит.

Це виведе всі запити в цьому двійковому файлі журналу до стандартного виводу. У Unix використовуйте grepдля пошуку свого запиту:

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

У Windows удача. Відкрийте за допомогою блокнота ++ чи чогось і шукайте вручну.

Чи є запит? Чудово - ви знаєте, що це було вчинено.

Хіба запиту немає? Потрібно перевірити sync_binlogпарам. Це 1 ? Тоді запит не у двійковому журналі ==> запит не здійснено. Але якщо sync_binlogце не 1 , все ж може бути ймовірність, що запит був здійснений ще не в двійковому журналі, оскільки збій може статися безпосередньо після того, commitяк бінарний журнал був перенесений на диск. Потім потрібно повернутися до інших засобів.

Це: (і, сподіваємось, знову ж, ви використовуєте InnoDB): шукайте єдиний рядок, який може визначити результат запиту. З InnoDB ви отримуєте "все або нічого". Якщо ви можете бути впевнені в одному рядку, на який впливає запит, - ви можете бути впевнені, що запит завершено.

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

Удачі!


2
Я сподіваюся, що ти триматимешся
jcolebrand

2
@jcolebrand Rolando міг би зіткнутися з конкуренцією :)
Philᵀᴹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.