Najszybszy sposób na zmianę typu klucza indeksu tabeli o pojemności 600 GB z INT na BIGINT

13

Muszę zmienić typ danych z INT na BIGINT w tabeli MySQL o pojemności 600 GB. Kolumna ma unikalny indeks. Mogę być dobry z niepodpisaną INT, ale zakładam, że przejście na to lub BIGINT będzie prawie takim samym bólem. Silnik stołu to InnoDB. Co byłoby łatwiejsze:

  1. ZMIEŃ TABELĘ
  2. Kopiowanie struktury i INSERT INTO (SELECT *)
  3. Tabela zrzutu i zmiana definicji tabeli pliku zrzutu
  4. Coś jeszcze?

AKTUALIZACJA: Zgodnie z żądaniem, MySQL wersja 5.5.15, brak kluczy obcych i tworzenie tabeli:

 CREATE TABLE `tbl` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created_at` datetime NOT NULL,
    `tid` bigint(20) NOT NULL,
    `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `f` tinyint(1) NOT NULL,
    `i_id` bigint(20) NOT NULL,
    `ir_id` int(11) NOT NULL,
    `r_c` int(11) NOT NULL,
    `r` tinyint(1) NOT NULL,
    `e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `t` varchar(5) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8
Noam
źródło
Zdefiniuj ból, poświęć najkrótszy czas ....? Najszybsze wyniki?
@AlecTeal Poświęć najkrótszy czas
Noam
Chociaż nie odpowiada na pytanie, a pytanie to prawdopodobnie zostało omówione, zanim stół stał się tak duży, szukałbym również sposobu na zmniejszenie wielkości tego stołu.
1
Która wersja MySQL? Ma to znaczenie, jak niektóre wersje ALTER TABLE ONLINE. Czy masz klucze obce odnoszące się do tej kolumny? Pomogłoby to, gdybyś pokazał SHOW CREATE TABLE tablename;wynik.
ypercubeᵀᴹ
2
Jeśli krótkie nazwy pól pomogłyby zmniejszyć rozmiar tabeli, byłoby to 600 MB .
Jon of All Trades

Odpowiedzi:

2

Zakładając, że twój stół nie ma żadnych wyzwalaczy, powinieneś rozważyć użycie, pt-online-schema-changeponieważ pozwoli to ZMIENIĆ stół bez blokowania go.

Biorąc pod uwagę wielkość stołu, zajmie to sporo czasu.

Ponadto, korzystając z tej metody lub przy pomocy ALTER TABLE, musisz upewnić się, że masz 600 GB dodatkowego miejsca na dysku, aby obsłużyć dwie kopie tabeli podczas jej przebudowy.

Ike Walker
źródło
Masz szacunkowy czas? (Wiem, że zależy to od wielu czynników, ale gdybyś musiał zgadywać, jaki byłby zasięg)
Noam
@Nie, nie musisz kopiować tabeli. Jeśli użyjesz tabeli Alter, WORST CASE jest to, że kopiuje, jeśli używasz dojrzałego silnika, po prostu zanotuje sobie, że cokolwiek wcześniej (jakaś lokalizacja w pliku lub jakiś rekord) używa int, wszystko post używa biginta, dopóki optymalizujesz.
@AlecTeal Czy masz jakieś formalne odniesienia do tego?
Noam
@Noam zobacz moją odpowiedź.
1
@Noam szacuję, że uruchomienie ALTER TABLEmoże potrwać od 24 do 96 godzin. Możesz uzyskać lepszą ocenę, uruchamiając ALTER TABLE w środowisku testowym.
Ike Walker
2

Korzystanie z zestawu narzędzi Percona pt-online-schema-changebyłoby moim wyborem przy produkcji bez wpływu na użytkowanie. Spowoduje to dodanie niektórych wyzwalaczy, aby uzyskać delty i tabelę czasową, która zmieni nazwę po zakończeniu.

przykład:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE
Binlogic DBA
źródło
pt to droga. @Noam FYI: INT-> BIGINT migracja w tabeli ~ 270 GB z dużą ilością wierszy w instancji EC2 z dość dużą aktywnością zapisu w tej tabeli zajęła 64 godziny przy użyciu zmiany schematu pt-online.
Jakub Głazik