Mam ten błąd InnoDB w MySQL 5.0. Mysqld został zatrzymany czysto, ale później udało mi się utracić ib_logfile0 i ib_logfile1. Teraz po czystym uruchomieniu InnoDB wykonało „odzyskiwanie po awarii”. Przeszedłem przez firmę innodb_force_recovery = 4, naprawiłem zawieszoną tabelę MyISAM, a teraz replika jest gotowa do pracy, oprócz tego. Wielkie zatwierdzone liczby:
111116 15:49:36 InnoDB: Error: page 393457 log sequence number 111 561,760,232
InnoDB: is in the future! Current system log sequence number 70 3,946,969,851.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html
InnoDB: for more information.
To jest na serwerze podrzędnym. Powyższy błąd wyrzuca setki. Znalazłem odpowiedź: „wstaw i usuń dane o wartości> 64 GB, aby numer sekwencyjny dziennika został wystarczająco zawyżony”.
http://forums.mysql.com/read.php?22,50163,50163#msg-50163
Ta magiczna liczba 64 GB pochodzi z 4 GB * 16, gdzie „główna liczba” logu tego faceta musiała wzrosnąć z 0 do 15. Mój idzie z 70 do 111 = 164 GB. Zajmie to 5 dni. Będę pracował nad przyspieszeniem mojego skryptu i równoległym uruchomieniem go, aby to przyspieszyć. Tymczasem mam nadzieję, że ktoś inny ma lepszą odpowiedź. To jest głupie.
Odpowiedzi:
To była dość rzadka sytuacja. Mam nadzieję, że już nigdy tam nie skończę, z InnoDB „kolejny numer dziennika jest w przyszłości!” błąd. Z powodu moich konkretnych szczegółów odbudowanie / przywrócenie danych mojego serwera było ostatecznością. Niektóre oszustwa w pomaganiu, które były dobrymi pomysłami, ale ostatecznie postanowiłem po prostu ulepszać mój skrypt Perla, aby grać w tę głupią grę i przerzucać tyle koncertów, ile mogłem. Co do cholery, to dobry test warunków skrajnych systemu.
Pamiętaj: celem jest zwiększenie pojedynczego licznika („numeru sekwencji dziennika”), który jest przechowywany gdzieś w nagłówkach ib_logfile0 i ib_logfile1 . Ma to na celu sfałszowanie InnoDB, aby zignorował pozorne wypaczenie czasu i zaczął żyć. Ale nikt nie wie, jak edytować ten numer. A jeśli wiedzą, nikt nie mówi.
Oto mój produkt końcowy. YMMV, ale użycie funkcji REPEAT mysql do wewnętrznego generowania danych jest bardzo wydajne.
Mój sugerowany przepis:
while true; do date; junk.pl dataX; done
.Zobacz, jak rośnie LSN, być może w innej pętli:
Duża liczba to 32-bitowy INT bez znaku, który zawinie się przy 4 GB, zwiększając za każdym razem mniejszą liczbę. W powyższym przypadku właśnie spadła ze 124 do 125. Twój cel jest ukryty w mysqld.log, który wysłał Ci Googlinga za to śmieszne rozwiązanie. Gdy przekroczysz linię mety, to wszystko! Dmuchaj w rogi! Uwolnij konfetti!
źródło
Masz trzy (3) opcje:
OPCJA 01: Wykonaj rsync z Master na Slave (Przestój na Master)
reset master;
na systemie głównym (Zaps Binary Logs)service mysql stop
na kapitanieservice mysql stop
na niewolnikuservice mysql start
na kapitanieservice mysql stop --skip-slave-start
na niewolnikustart slave;
na slave i pozwól replikacji nadrobić zaległościOPCJA 02: Wykonaj rsync z Master na Slave (minimalny czas przestoju na Master)
reset master;
na systemie głównym (Zaps Binary Logs)service mysql stop
na niewolnikuservice mysql stop
na kapitanieservice mysql start
na kapitanieservice mysql stop --skip-slave-start
na niewolnikustart slave;
na slave i pozwól replikacji nadrobić zaległościOPCJA 03: Użyj XtraBackup
To narzędzie programowe nie tylko utworzy nie rzucającą się w oczy kopię działającego wzorca, ale także utworzy odpowiednie pliki ib_log. Będziesz musiał skonfigurować replikację
Publikowałem już na StackExchange na ten temat
Robiłem te rzeczy wiele razy dla firmy hostingowej mojego pracodawcy. Jeden klient miał 3,7 TB do przeniesienia i zajęło to około 16 godzin. 64 GB jest bardzo małe w porównaniu.
źródło
RESET SLAVE
jest przydatny, szczególnie jeśli zgromadziłeś wiele GB dzienników przekazywania. Po zakończeniu procesu rsync i ponownym ustanowieniu replikacji pamiętaj, że polecenie CHANGE MASTER TO usunie również dzienniki przekazywania.Dowiedziałem się, że istnieje fajniejszy sposób na rozwiązanie tego problemu w przypadku tabel podzielonych na partycje. Musiałem usunąć partycje sprzed kilku lat i musiałem je dodać na 2014 r. Prawie wszystkie partycje zgłaszają ten błąd, więc także stare. Bardzo nieprzyjemny wypadek.
Tak więc podczas gdy DROPPING jest stary i używa REORGANIZE partycji MAXVALUE (ostatniej), utworzy nowe pliki, które są w porządku, więc otrzymuję coraz mniej ostrzeżeń. Tymczasem pomaga zwiększyć licznik sekwencji logów, więc nie muszę wstawiać fałszywych danych. To się dzieje na głównym serwerze btw ...
Więc to:
I to:
To skutecznie usunie każdą partycję ze zmiany i odtworzy ją z tymczasową kopią zawartości tego, co tam było. Możesz to zrobić według tabeli, jeśli chcesz, moja aplikacja na to pozwala, więc nie musisz się martwić o zsynchronizowane kopie zapasowe itp.
Teraz do końca tabeli, ponieważ nie dotknąłem wszystkich partycji w tym procesie, niektóre zostaną z ostrzeżeniem o sekwencji dziennika, dla tych, które są uszkodzone, ale objęte tą reorganizacją, prawdopodobnie uruchomię to:
albo to
Pomyślałem, że możesz to zrobić przy użyciu zwykłych tabel waniliowych, tymczasowo dodawać partycje za pomocą skrótu, a później je usuwać (lub zachować je, zdecydowanie zalecam partycje).
Używam jednak mariadb, nie mysql (więc XtraDB)
Być może to pomaga komuś. Nadal go uruchamiam, jak dotąd tak dobrze. Wydaje się, że zmiana SILNIKA również wykonuje tę pracę, więc przenoszę ją między MyIsam a nimi z powrotem do InnoDB.
Jest to dość logiczne, jeśli zmienisz SILNIK, tabela zniknie z innodb, więc nie będzie już problemem.
wydaje się, że tutaj działa. Mogę potwierdzić kilka rzeczy na partycjonowanych tabelach:
Użyłem ostatnich na kilku stołach. Ostrzeżenia pojawiają się, gdy próbuje otworzyć pliki i jest jeden dla każdej definicji partycji, którą otwiera z problemami z licznikami. Prawie przewrócił się dzisiaj na ladzie dla ostatnich stołów. Myślę, że kiedy wszystko zostanie przetworzone, trzeba opróżnić dzienniki binarne.
aktualizacja : Mogę podsumować kilka rzeczy, teraz udało mi się rozwiązać ten problem.
źródło
USE INFORMATION_SCHEMA; SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` REBUILD PARTITION ALL;") AS MySQLCMD AS MySQLCMD FROM TABLES;
(źródło: dba.stackexchange.com/questions/35073/... ) i przekształcić go w plik, który ma zostać wykonany jako seria poleceń.