Mamy dość małą bazę danych, którą chcieliśmy przekonwertować z MyISAM na InnoDB. Będąc bazą danych noob, właśnie przekonwertowaliśmy (używając tabeli zmian), nawet nie usuwając strony.
Po zakończeniu konwersji wydaje się, że brakuje sporadycznych wierszy. Czy jest to możliwe z powodu operacji podczas konwersji? A może problem jest gdzie indziej?
Odpowiedzi:
Wykonanie polecenia ALTER w celu zmiany silników pamięci masowej nie spowoduje zniknięcia wierszy. Pozwól mi jednak udzielić porady, ponieważ w swoim pytaniu powiedziałeś, że jesteś „bazą danych noob”.
Podczas modyfikowania istniejącego schematu lub wykonywania innych czynności mogłoby wpłynąć na dane, oto kilka podstawowych porad:
Prawdopodobnie jest o wiele więcej, ale mogę uzyskać więcej opcji, gdy coś pójdzie nie tak.
Jeśli chodzi o brakujące dane / wiersze, nie ma sposobu, aby wiedzieć w / oa „przed / po” migawce do porównania. Możesz porównać z najnowszą kopią zapasową, aby przynajmniej tyle zweryfikować.
źródło
Jednym z najlepszych sposobów na konwersję MyISAM do InnoDB bez wielu przestojów jest tylko jeden warunek wstępny: Użyj Slave replikacji.
Oto plan z lotu ptaka
Brzmi prosto? Za tym kryje się wiele szczegółów.
Utwórz konfigurację Master / Slave replikacji
Istnieje sprytny sposób na stworzenie Slave bez większych zakłóceń dla Mistrza. Napisałem dwa posty:
Zamiast szczegółowo korzystać z rsync, przeczytaj te dwa posty.
Konwertuj każdą tabelę MyISAM na slave na InnoDB
Na DB Slave możesz wykonać następującą instrukcję SQL:
W przypadku MySQL 5.5:
Wersja dla MySQL przed MySQL 5.5
Korzystając z danych wyjściowych z zapytania, masz skrypt konwersji dla urządzenia podrzędnego.
Musisz umieścić te dwie linie na początku skryptu:
Skrypt najpierw wyłączy rejestrowanie binarne (jeśli skonfigurowałeś slave do binarnych logów), zatrzyma replikację i skonwertuje każdą tabelę MyISAM na InnoDB.
Oto jak utworzyć ten skrypt i wykonać go:
Skieruj swoją aplikację na Slave
Wykonaj zapytania SELECT z urządzenia Slave. Jeśli jesteś zadowolony z zawartości danych w Slave, możesz skierować swoją aplikację do Slave w następujący sposób:
SHOW SLAVE STATUS\G
i upewnij się, że Seconds_Behind_Master ma wartość 0service mysql stop
(zaczyna się przestój)Jeśli dotarłeś do tego punktu bez szwanku, GRATULACJE !!!
DODANY BONUS : Jeśli skonfigurujesz replikację master / master (inaczej replikacja cykliczna) zamiast master / slave, możesz to zrobić w zamian:
SHOW SLAVE STATUS\G
i upewnij się, że Seconds_Behind_Master ma wartość 0STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='';
To, co teraz masz, to Master / Slave w odwrotnej kolejności. Nowy Master ma dane InnoDB, a stary Master jest teraz slave z danymi MyISAM. Jeśli podzielisz odczyty i zapisy, odczyty mogą przejść z Slave (odczyty są szybsze z MyISAM niż InnoDB), a zapisy przejść do Master (obsługa transakcyjna dla InnoDB). Tak jak śpiewa Hannah Montana, dostajesz to, co najlepsze z obu światów (Tak, mam dwie córki, które uwielbiają serial) !!!
KOLEJNY DODATKOWY BONUS : Ponieważ Master jest teraz InnoDB, możesz zrobić mysqldump z Master bez przestojów i bez ingerencji w transakcje. Jedyną wadą jest zwiększenie wydajności procesora i dysku we / wy. Mógłbyś zatem uzyskać mysqldump struktur tabel tylko na Master (InnoDB) i mysqldump danych tylko na slave (taki zrzut nie będzie zawierał odniesień do InnoDB ani MyISAM. Będzie to tylko dane) plus mysqldump struktury tabel dla urządzenia podrzędnego, które mają układ MyISAM.
Możliwości mogą być kontynuowane dzięki tej nowej konfiguracji ...
AKTUALIZACJA 27.08.2011 19:50 EDT
Przepraszam. Nie w pełni przeczytałem pytanie. Przeprowadziłeś już rozmowę .
Tylko jeśli masz już włączone rejestrowanie binarne i masz wcześniejszą kopię zapasową, możesz to zrobić
service mysql stop
service mysql start --datadir=/var/lib/mysql2
Powinno to uchwycić wszystko, co zostało zarejestrowane, a konwersja powinna się rozpocząć. Ponownie, wszystko to jest na tyle rozsądne , że rejestrowanie binarne było już włączone przed ostatnią kopią zapasową . W przeciwnym razie moje kondolencje.
źródło