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?
Odpowiedzi:
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:
Jeśli są włączone, powinieneś otrzymać takie wyjście:
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
mysqlbinlog
narzędzia, uruchom z wiersza poleceń coś takiego: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,
grep
aby znaleźć zapytanie: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_binlog
parametry. Czy to 1 ? Następnie zapytanie nie znajduje się w dzienniku binarnym ==> zapytanie nie zostało zatwierdzone. Ale jeślisync_binlog
nie jest to 1 , może istnieć szansa, że zapytanie zostało zatwierdzone, ale nie w dzienniku binarnym, ponieważ awaria mogła nastąpić tuż pocommit
i 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!
źródło