Jestem programistą PHP, więc nie bądź surowy. Mam zrzut dużego stołu ~ 5,5 GB. Nasz premier postanowił utworzyć w nim nową kolumnę, aby wykonać nową funkcję. Tabela to InnoDB, więc co próbowałem:
Zmień stół na ekranie z blokadą stołu. Zajęło ~ 30 godzin i nic. Więc po prostu to powstrzymałem. Najpierw popełniłem błąd, ponieważ nie zakończyłem wszystkich transakcji, ale po raz drugi nie było multilocka. Status był
copy to tmp table
.Ponieważ muszę także zastosować partycjonowanie dla tej tabeli, postanowiliśmy zrobić zrzut, zmienić nazwę i utworzyć tabelę o tej samej nazwie i nowej strukturze. Ale zrzut robi ścisłą kopię (przynajmniej nie znalazłem czegoś innego). Dodałem więc, aby zrzucić nową kolumnę
sed
i wysłać zapytanie. Ale zaczęły się dziwne błędy. Uważam, że było to spowodowane charsetem. Tabela w utf-8 i plik stał się potem us-asciised
. Mam więc błędy (nieznane polecenie „\”) na 30% danych. To także zły sposób.
Jakie są inne opcje, aby to osiągnąć i zwiększyć wydajność (mogę to zrobić za pomocą skryptu php, ale zajmie to wieki). Jaka będzie wydajność INSERT SELECT
w tym przypadku.
Dzięki za wszelkie zaliczki.
SET NAMES utf8
i.COLLATION
Ale me idk, dlaczego 30% danych uległo później uszkodzeniused
. Myślę, że ładowanie zbiorcze będzie najszybsze, ale może istnieje coś więcej, czego mi brakuje. Dziękuję MarkTwój pomysł sed jest przyzwoitą metodą, ale bez błędów lub polecenia, które wykonałeś, nie możemy ci pomóc.
Jednak dobrze znaną metodą wprowadzania zmian online do dużych tabel jest zmiana schematu pt-online . Uproszczone przeoczenie tego, co robi to narzędzie, zostało skopiowane z dokumentacji:
Ta metoda może również zająć trochę czasu, ale podczas procesu oryginalna tabela będzie w pełni użyteczna.
źródło
'D\'agostini'
spowoduje błądunknown command '\''
. Ale nie zawsze, jak w 30% przypadków. To dziwne i błędne. To samo dotyczy zrzutów hex-blob. Dziękuję Derek.alter table add column, algorithm=inplace, lock=none
zmieni tabelę MySQL 5.6 bez kopiowania tabeli i bez blokowania.Właśnie przetestowałem to wczoraj, masowo wstawiono 70 000 wierszy do tabeli podziału 7 000 280 wierszy, 10 000 wierszy dla każdej partycji, z 5-sekundowym uśpieniem między nimi, aby umożliwić inną przepustowość.
Rozpoczęto wstawianie mas, a następnie w osobnej sesji rozpoczęto
alter
powyższą instrukcję online w MySQL Workbench,alter
zakończono przed wstawkami, dodano dwie nowe kolumny i żadne wiersze nie wynikały ze zmiany, co oznacza, że MySQL nie kopiował żadnych wierszy.źródło
Obecnie najlepszą opcją zmiany ogromnych tabel jest prawdopodobnie https://github.com/github/gh-ost
gh-ost to bezproblemowe rozwiązanie migracji schematu online dla MySQL. Jest testowalny i zapewnia łatwą obsługę, dynamiczną kontrolę / rekonfigurację, audyt i wiele dodatkowych korzyści operacyjnych.
Program gh-ost wytwarza niewielkie obciążenie na systemie głównym podczas migracji, oddzielone od istniejącego obciążenia na migrowanej tabeli.
Został zaprojektowany w oparciu o lata doświadczeń z istniejącymi rozwiązaniami i zmienia paradygmat migracji tabel.
źródło
Myślę, że Mydumper / Myloader jest dobrym narzędziem do takich operacji: Z każdym dniem jest coraz lepiej. Możesz korzystać z procesorów i ładować dane równolegle: http://www.percona.com/blog/2014/03/10/new-mydumper-0-6-1-release-offers-several-performance-and- funkcje użyteczności /
Udało mi się załadować setki gigabajtów tabel MySQL w ciągu kilku godzin.
Teraz, jeśli chodzi o dodawanie nowej kolumny, jest trudne, ponieważ MySQL kopiuje całą tabelę do
TMP
obszaru pamięci.ALTER TABLE...
Chociaż MySQL 5.6 mówi, że może dokonywać zmian w schemacie online, nie udało mi się tego zrobić online dla ogromnych tabel bez blokady jak dotąd spór.źródło
właśnie miałem ten sam problem. Trochę obejścia:
UTWÓRZ TABELĘ new_table WYBIERZ * z oldtable;
USUŃ Z nowej tabeli
ALTER TABLE new_table DODAJ KOLUMNĘ new_column int (11);
INSERT INTO new_table wybierz *, 0 ze old_table
upuść tabelę old_table; zmień nazwę tabeli new_table TO old_table;
źródło