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

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.