Mam kilka tabel, które są podzielone na partycje i mają kilka indeksów na zreplikowanym slave. Po skopiowaniu migawki (zweryfikowanej jako bezpieczna) do nowego urządzenia podrzędnego i aktualizacji mysqld z 5.1.42 do 5.5.15 i ponownym uruchomieniu replikacji, pojawia się awaria InnoDB z komunikatem o błędzie „Nieprawidłowy wskaźnik ...”
Te błędy wystąpiły na 2 serwerach z innym sprzętem i systemem operacyjnym. Po bieganiu:
ALTER TABLE .... COALESCE PARTION n;
problem zniknął dla tego stołu.
Moje pytanie ma jednak większy zakres i brzmi: „Jak rozpoznać uszkodzenie tabeli InnoDB?” lub przeformułował „Jak oceniasz zdrowie tabeli InnoDB?” Czy „CHECK TABLE” jest jedynym dostępnym narzędziem do identyfikowania problemów przed awarią?
Nie jestem pewien, czy to ważne, ale wystąpiły awarie podczas uruchamiania: Wersja: „5.5.15-55-log” gniazdo: Port „/opt/mysql.sock”: 3306 Serwer Percona (GPL), wydanie rel21.0, wersja 158
źródło
Odpowiedzi:
Morgan daje do zrozumienia w swoim komentarzu, że InnoDB stale sprawdza uszkodzone strony, wykonując sumy kontrolne na stronach, które czyta. Jeśli InnoDB znajdzie niedopasowanie sumy kontrolnej, spowoduje
awarięzatrzymania serwera.Jeśli chcesz przyspieszyć ten proces (zamiast czekać, aż InnoDB przeczyta uszkodzoną stronę), możesz użyć
innochecksum
:Ciekawe zastrzeżenie:
Tak więc, ponieważ tabela online
CHECK TABLE
jest prawdopodobnie narzędziem (lub jak wskazano w innej odpowiedzi,mysqlcheck
jeśli chcesz zrobić więcej niż jedną bazę danych naraz).Jeśli możesz zamknąć bazę danych, możesz wymusić użycie sum kontrolnych
innochecksum
Anegdota: w obszarze tabel o wielkości 29 GB (z
innodb_file_per_table=1
) ten skrypt zajął około 2 minutJako bonus, ponieważ korzystasz z Percony, zaimplementowali nową metodę szybkiej sumy kontrolnej innodb . Nigdy go nie użyłem, ale może to przyspieszyć proces.
źródło
OSTRZEŻENIE: przed wypróbowaniem którejkolwiek z tych instrukcji zdecydowanie zaleca się sprawdzenie, czy na wszelki wypadek znajduje się zdrowa kopia zapasowa bazy danych. (dzięki @Nick za ostrzeżenie)
Spróbuj użyć
mysqlcheck
polecenia. Na terminalu:To polecenie wyświetli listę wszystkich tabel i status informujący, czy nastąpiło jakieś uszkodzenie:
Dzięki temu będziesz już wiedział, które stoły musisz naprawić. Na wypadek, gdybyś chciał naprawić wszystko na raz:
Więcej informacji
mysqlcheck
: http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.htmlUwaga: otagowałeś swoje pytanie percona . Nie miałem pojęcia, co to było, więc poszukałem Google. Wygląda na to, że jest rozwidleniem MySQL, ale nie mam powodu sądzić, że polecenia są niezgodne (kciuki).
Ktoś wskazał mi ten przewodnik, który zawiera bardziej szczegółowe instrukcje dotyczące odzyskiwania bazy danych InnoDB w bardziej krytycznych sytuacjach, w których cała baza danych nie uruchamia się: http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -database-myisam-innodb-1634.html
źródło
CHECK TABLE
. Dokumentacja jesteś związana stwierdza: "mysqlcheck
wykorzystuje SQLCHECK TABLE
,REPAIR TABLE
,ANALYZE TABLE
orazOPTIMIZE TABLE
w wygodny sposób dla użytkownika Określa Które stwierdzenia wykorzystania do operacji, którą chcesz wykonać, a następnie przesyła sprawozdanie z serwerem w celu wykonania.. „ To nie jest synonim; jest to interfejs użytkownika do zbioru instrukcji.Zgodnie z MySQL 5.0 Certification Study Guide, Strona 443,444 Sekcja 30.4 :
Przeczytaj dokumentację MySQL na temat InnoDB Forced Recovery
źródło
Zastanawiam się, co się stanie, jeśli ktoś użyje danych InnoDB utworzonych za pomocą wtyczki InnoDB, a następnie przełączy się na inną wersję InnoDB. Może to spowodować potencjalne uszkodzenie strony w oczach mysqld.
Zwróć uwagę na to, co Dokumentacja MySQL w formacie pliku InnoDB mówi o tej możliwości:
Zeskrobałbym dane na niewolniku. W rzeczywistości użyłbym brutalnej siły, uzyskując logiczny zrzut (mysqldump) danych:
Mój oryginalny anwser jest uważany za „starą szkołę”. Jednak w tym przypadku zdecydowanie zajrzałbym do formatów plików używanych przez .ibd i / lub ibdata1.
źródło