2012-12-02 26 views
6

Potrzebuję dodać nową kolumnę do tabeli w MySQL DB (tabela MyISAM), która zawiera więcej niż 20 milionów wierszy.Dodaj kolumnę do dużej tabeli MySQL podczas online

Proces dodawania kolumna musi być w czasie wykonywania, mam na myśli to, że aplikacja będzie nadal działać i wiersze będą nadal wstawiane i wybrane podczas zmiany tabeli.

  • Jak to wpłynie na uruchomioną aplikację?
  • Ile czasu zajmuje wykonanie tej zmiany?

Jak mogę to zrobić bezpiecznie i bez szkody dla uruchomionej aplikacji?

+3

Klonowanie, test porównawczy, planowanie, wdrażanie. – soulseekah

+0

Jakiego silnika bazy danych używasz? – Barmar

+0

@Barmar Myślę, że masz na myśli MyISAM. DB to MySQL. – SimonW

Odpowiedz

4

Tabela jest zablokowana podczas wykonywania kwerend DDL. Nie oznacza to, że serwer nie akceptuje zapytań dotyczących innych sesji podczas blokowania, ale są one ustawione w kolejce i prawdopodobnie upływają, zanim zrobi się ALTER TABLE. W zależności od czynników takich jak sprzęt, struktura tabeli i oczywiście liczba rzędów (które, jak pan powiedział, jest dość wysokie), zmiana zajmie trochę czasu.

W przypadku MySQL 5.5 (szybsze tworzenie indeksu, innodb), 8-procesorowy procesor, dyski mikroukładów, zmienianie tabeli rzędu 5 mil z kilkoma indeksami zajmuje w naszym przypadku około 15-20 minut.

Proponuję utworzyć kopię i zmienić kopię. Po zakończeniu będziesz musiał powtórzyć deltę danych. Facebook miał do czynienia z tym na sposób wyższy poziom, to sprawdzić

http://m.facebook.com/note.php?note_id=430801045932

Tho, nie mogę obiecać, to że wszystkie prace bezpiecznie na MyISAM silnika

EDIT:

Percona stworzyła zestaw narzędzi, który najwyraźniej działa na wszystkich silników składowania:

http://www.mysqlperformanceblog.com/2012/04/05/percona-toolkit-2-1-with-new-online-schema-change-tool/

W tym wydaniu przedstawiamy nową wersję PT-online-schematu zmian, narzędzie, które umożliwia Ci ALTER duże tabele bez blokowania lub przestojów. Jak wiesz, MySQL blokuje tabele dla większości operacji ALTER, ale pt-online- zmiana schematu powoduje ALTER bez blokowania. Aplikacje klienckie mogą kontynuować czytanie i pisanie tabeli bez żadnych przerw.

+0

Dzięki, sprawdzę to! – SimonW

2

Podczas dodawania nowej kolumny zablokuje ona tabelę. Sugeruje to, że każda aplikacja, która spróbuje użyć tabeli, zostanie zablokowana, dopóki nie zostanie wykonana. Dane nie zostaną uszkodzone, ale wszelkie aplikacje, które spróbują użyć tabeli, zostaną zawieszone.

Trudno powiedzieć, ile czasu to zajmie, zależy to od tego, jak duża jest już baza danych, ponieważ będzie musiała wykonać wiele kopii danych i szybkość serwera. Jak ktoś powiedział powyżej, sposobem na znalezienie tego jest zrobienie kopii tabeli i wykonanie zmiany na kopii w pierwszej kolejności.

+1

"* wszelkie aplikacje, które próbują użyć tabeli będą zawieszone *" - przynajmniej do momentu odblokowania tabeli lub przekroczenia limitu czasu (i zakładając, że wykonują wywołanie blokujące do sterownika bazy danych). – eggyal

+0

Thnaks @Barmar! – SimonW

Powiązane problemy