Zasilanie zgasło - czy zapytanie zakończyło się?

9

Czy istnieje sposób sprawdzenia i sprawdzenia, czy zapytanie zostało zakończone? Uruchomiłem 3 bardzo długie zapytania dotyczące aktualizacji (+/- 25 godzin każde), kiedy wyszedłem za drzwi na wakacje w zeszłym tygodniu. Niestety gdzieś w ciągu tygodnia nastąpiła awaria zasilania i maszyna z systemem MYSQL została zamknięta. Czy istnieje sposób, aby sprawdzić, które z 3 (lub wszystkich trzech) zapytań zostało zakończonych?

Wiem, że mogłem sprawdzić, czy dane zostały zaktualizowane, ale należy oczekiwać wartości NULL z poprawnym i kompletnym wykonaniem, a do przeanalizowania jest 48 milionów wierszy danych. jakieś pomysły?


źródło
6
Dzienniki ... jeśli rejestrujesz rzeczy. Jeśli nie, polecam zacząć.
Ben
1
@Ben - chyba za późno, by polecić UPS i przetwarzanie transakcji.
1
Jeśli korzystasz z InnoDB, możesz robić swój kod w transakcjach. dev.mysql.com/doc/refman/5.0/en/commit.html
1
Gdyby włączone było powolne rejestrowanie zapytań, wówczas tak wolne zapytania prawdopodobnie trafiłyby do dziennika wolnych zapytań.
3
A jeśli nie zostało poprawnie wykonane, czy masz kopię zapasową?

Odpowiedzi:

9

Jeśli pracujesz z włączonymi dziennikami binarnymi, można to sprawdzić ze względnie wysoką niezawodnością.

Po pierwsze, aby sprawdzić, czy dzienniki binarne są rzeczywiście włączone, uruchom:

SHOW BINARY LOGS;

Jeśli są włączone, powinieneś otrzymać takie wyjście:

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

W przeciwnym razie pojawi się komunikat o błędzie.

Teraz, jeśli dzienniki binarne są włączone, każde pomyślne zatwierdzenie jest również zapisywane w dziennikach binarnych. Mówię „zatwierdzaj”, ale prawda jest taka, że ​​każda udana operacja, nawet na tabelach nietransakcyjnych, takich jak MyISAM, jest tam zapisana. Ale, szczerze mówiąc, aby mieć pewność co do wyniku twoich zapytań, mam nadzieję, że ze względu na ciebie korzystasz z silnika transakcyjnego takiego jak InnoDB, w przeciwnym razie nie możesz być niczego pewien.

OK, więc zakładając, że masz włączone dzienniki binarne i że twoje tabele są transakcyjne (mam nadzieję, że InnoDB), wtedy pomyślne zakończenie twoich zapytań zostanie zapisane w dziennikach binarnych.

Musisz teraz znaleźć odpowiedni dziennik binarny i poszukać tam zapytania. Jeśli znajdziesz zapytanie - dobrze! Jeśli nie - najprawdopodobniej jej nie ma. Wyjaśnię wkrótce.

Który dziennik binarny zawiera twoje zapytanie? Spójrz na same pliki dziennika binarnego, zwykle w katalogu danych. Poszukaj ich znaczników czasu. Kiedy pojawiła się moc, utworzono nowy dziennik binarny. Znajdź to. Twoje zapytania najprawdopodobniej znajdują się w dzienniku binarnym jeden przed tym. To przypuszczenie. Może to być jeden wcześniej, itd. Ale to dobre przypuszczenie.

Teraz, korzystając z mysqlbinlognarzędzia, uruchom z wiersza poleceń coś takiego:

mysqlbinlog mysql-bin.000245

Zastąp nazwę pliku nazwą, która prawdopodobnie zawiera zapytanie.

Spowoduje to wyświetlenie wszystkich zapytań z tego pliku dziennika binarnego na standardowe wyjście. W systemie Unix użyj przycisku, grepaby znaleźć zapytanie:

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

W systemie Windows powodzenia. Otwórz za pomocą notatnika ++ lub czegoś i wyszukaj ręcznie.

Czy istnieje zapytanie? Świetnie - wiesz, że zostało popełnione.

Czy zapytania nie ma? Musisz sprawdzić sync_binlogparametry. Czy to 1 ? Następnie zapytanie nie znajduje się w dzienniku binarnym ==> zapytanie nie zostało zatwierdzone. Ale jeśli sync_binlognie jest to 1 , może istnieć szansa, że ​​zapytanie zostało zatwierdzone, ale nie w dzienniku binarnym, ponieważ awaria mogła nastąpić tuż po commiti tuż przed opróżnieniem dziennika binarnego na dysk. Następnie powróć do innych środków.

Są to: (i mam nadzieję, że znowu używasz InnoDB): poszukaj pojedynczego wiersza, który może zidentyfikować wynik zapytania. Z InnoDB dostajesz „wszystko albo nic”. Jeśli masz pewność, że zapytanie dotyczy pojedynczego wiersza - możesz być pewien, że zapytanie zostało zakończone.

edytuj: oczywiście, jeśli włączony jest powolny dziennik, możesz oczekiwać, że tak długie zapytanie zostanie tam również zarejestrowane po zakończeniu ...

Powodzenia!

Shlomi Noach
źródło
2
Mam nadzieję, że zostaniesz.
jcolebrand
2
@jcolebrand Rolando mógłby zrobić z pewną konkurencją tutaj :)
Philᵀᴹ