2012-12-02 10 views
6

Ho bisogno di aggiungere una nuova colonna a una tabella nel DB MySQL (tabella MyISAM) che contiene più di 20 milioni di righe.Aggiungere una colonna a un grande tavolo MySql mentre è online

Il processo di aggiunta della colonna deve essere in fase di esecuzione, voglio dire che l'app sarà ancora in esecuzione e le righe saranno ancora inserite e selezionate mentre si altera la tabella.

  • In che modo influisce l'app in esecuzione?
  • Quanto tempo è necessario per eseguire questa modifica?

Come posso eseguire questo processo in modo sicuro e senza danneggiare l'app in esecuzione?

+3

Clona, ​​punto di riferimento, piano, distribuire. – soulseekah

+0

Che motore di database stai usando? – Barmar

+0

@Barmar Penso che tu intenda MyISAM. DB è MySQL. – SimonW

risposta

4

La tabella è bloccata mentre vengono eseguite le interrogazioni DDL. Questo non significa che il server non accetti le query su altre sessioni mentre è bloccato, ma sono in coda e probabilmente scadono prima che ALTER TABLE sia fatto. A seconda di fattori come l'hardware, la struttura della tabella e naturalmente la quantità di righe (che hai detto è piuttosto alta) l'alterazione richiederà un po 'di tempo.

Su MySQL 5.5 (creazione dell'indice più veloce, innodb), CPU a 8 core, dischi di chip, la modifica di una tabella di righe da 5 mil con diversi indici richiede circa 15-20 minuti nel nostro caso.

Suggerisco di creare una copia e di alterare la copia. Dovrai rieseguire il delta dei dati dopo aver finito. Facebook ha avuto a che fare con questo su un livello più elevato modo, controllare questo fuori

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

Tho, non posso promettere questo sarebbe tutto il lavoro in modo sicuro sul MyISAM motore

EDIT:

Percona creato un toolkit che lavora a quanto pare su tutti i motori di archiviazione:

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

Con questa release abbiamo introdurre una nuova versione di pt-online-schema-cambio, uno strumento che consente di modificare tabelle di grandi dimensioni con nessun blocco o i tempi di inattività. Come sapete, MySQL blocca le tabelle per la maggior parte delle operazioni ALTER, ma pt-online- modifica dello schema esegue l'ALTER senza qualsiasi blocco. Le applicazioni client possono continuare leggere e scrivere la tabella senza interruzioni.

+0

Grazie, controllerò! – SimonW

2

Mentre aggiunge la nuova colonna, bloccherà la tabella. L'implicazione di ciò è che qualsiasi applicazione che tenta di utilizzare la tabella verrà bloccata fino al completamento. Nessun danno verrà fatto ai dati, ma tutte le applicazioni che tentano di utilizzare la tabella si bloccherà.

È difficile dire quanto tempo ci vorrà, dipende da quanto è grande il database, dato che dovrà fare molta copia dei dati e la velocità del tuo server. Come detto sopra, il modo per scoprirlo è fare una copia del tavolo ed eseguire prima la modifica sulla copia.

+1

"* tutte le applicazioni che tentano di utilizzare la tabella si bloccherà *" - almeno, fino a quando il tavolo è sbloccato oppure timeout (e supponendo che fanno una chiamata di blocco per il driver di database). – eggyal

+0

Thnaks @Barmar! – SimonW