Mam dużą tabelę z kolumną VARCHAR (20) i muszę ją zmodyfikować, aby stała się kolumną VARCHAR (50). Zazwyczaj wykonanie ALTER TABLE (dodanie TINYINT) na tym konkretnym stole zajmuje około 90-120 minut, więc naprawdę mogę to zrobić tylko w sobotę lub niedzielę wieczorem, aby uniknąć wpływu na użytkowników bazy danych. Jeśli to możliwe, chciałbym wcześniej dokonać tej modyfikacji.
Kolumna jest również indeksowana, co, jak zakładam, spowoduje spowolnienie ALTER TABLE, ponieważ musi ona odbudować indeks po zmodyfikowaniu długości kolumny.
Aplikacja internetowa jest skonfigurowana w środowisku replikacji MySQL (26 urządzeń slave i jeden master). Pamiętam, jak kiedyś czytałem, że jedną z metod jest najpierw wykonanie ALTER TABLE na każdym slave (minimalizowanie wpływu na użytkowników), a następnie zrobienie tego na Master, ale czy to nie będzie wtedy próba replikacji polecenia ALTER TABLE na slave?
Więc moje pytanie brzmi: jaki jest najlepszy sposób na zmodyfikowanie tej tabeli przy minimalnych zakłóceniach dla moich użytkowników?
Edycja: tabela to InnoDB.
źródło
Odpowiedzi:
Jeśli jesteś trochę ryzykowny, możesz wziąć sprawy w swoje ręce, wykonując ALTER TABLE w etapach, które możesz zobaczyć. Załóżmy, że tabela, którą chcesz zmienić, nazywa się WorkingTable. Możesz wykonać zmiany etapami w następujący sposób:
Możesz to zrobić na wszystkich niewolnikach. Co z mistrzem ??? Jak temu zapobiec replikacji do niewolników. Proste: nie wysyłaj kodu SQL do dzienników binarnych wzorca. Po prostu wyłącz logowanie binarne w sesji przed wykonaniem czynności ALTER TABLE:
Ale poczekaj !!! A co z nowymi danymi przychodzącymi podczas przetwarzania tych poleceń? Zmiana nazwy tabeli na początku operacji powinna załatwić sprawę. Zmieńmy nieco ten kod, aby zapobiec wprowadzaniu nowych danych w tym zakresie:
Spróbuj !!!
źródło
Domyślam się z dokumentacji , że zwykłe zwiększenie ograniczenia długości na
varchar
nie spowodowałoby takich samych problemów jak dodanie kolumny:Ale wydaje się, że jest to sprzeczne z komentarzami do tego pisemnego zgłoszenia zastrzeżeń pytania .
EDYTOWAĆ
Przynajmniej w wersji 5.0, myślę, że mogę potwierdzić, że zwiększenie długości rzeczywiście wymaga tymczasowego stołu (lub innej równie kosztownej operacji):
testbed:
wynik:
źródło
Myślałem, że wspomnę o tym, ponieważ
ENGINE=INNODB
Jeśli masz ograniczenia na klucze obce, nie możesz zmieniać i zmieniać nazwy bez ograniczeń, wskazując na starą tabelę (teraz przemianowaną). Będziesz musiał później zmienić lub usunąć ograniczenia na czas trwania.
źródło