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:
- ZMIEŃ TABELĘ
- Kopiowanie struktury i
INSERT INTO (SELECT *)
- Tabela zrzutu i zmiana definicji tabeli pliku zrzutu
- 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
ALTER TABLE ONLINE
. Czy masz klucze obce odnoszące się do tej kolumny? Pomogłoby to, gdybyś pokazałSHOW CREATE TABLE tablename;
wynik.Odpowiedzi:
Zakładając, że twój stół nie ma żadnych wyzwalaczy, powinieneś rozważyć użycie,
pt-online-schema-change
ponieważ 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.źródło
ALTER TABLE
może potrwać od 24 do 96 godzin. Możesz uzyskać lepszą ocenę, uruchamiając ALTER TABLE w środowisku testowym.Korzystanie z zestawu narzędzi Percona
pt-online-schema-change
był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:
źródło