2011-09-29 18 views
52

stavo solo cercando di aggiungere una colonna chiamata "luogo" ad un tavolo (main_table) in un database. Il comando corro eraALTER TABLE ADD COLUMN richiede molto tempo

ALTER TABLE main_table ADD COLUMN location varchar (256); 

Il main_table contiene> 2.000.000 righe. Continua a funzionare per più di 2 ore e non è ancora completato.

Ho provato a utilizzare mytop per monitorare l'attività di questo database per assicurarsi che la query non sia bloccata da altri processi di interrogazione, ma non sembra. Dovrebbe durare tanto tempo? In realtà, ho appena riavviato la macchina prima di eseguire questo comando. Ora questo comando è ancora in esecuzione. Non sono sicuro di cosa fare.

+0

Ci vorrà lo ng time, a causa degli indici e della quantità di righe presenti nella tabella. Nota: Varchar (255) – Jauzsika

+0

Penso che dovrei aver specificato un valore predefinito per questo. Forse è per questo che ci vuole tempo? – Nilesh

+1

In questo caso, il valore predefinito è 'NULL', sicuramente non per quello che impiega molto tempo. – Romain

risposta

137

La tua affermazione implica ALTER TABLE mysql dovranno ri-scrivere ogni singola riga della tabella tra cui la nuova colonna. Dato che hai più di 2 milioni di righe, mi aspetto che ci voglia molto tempo, durante il quale il tuo server sarà probabilmente per lo più legato all'IO. Faresti solito trovare è più performante per effettuare le seguenti operazioni:

CREATE TABLE main_table_new LIKE main_table; 
ALTER TABLE main_table_new ADD COLUMN location varchar(256); 
INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table; 
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table; 
DROP TABLE main_table_old; 

In questo modo si aggiunge la colonna sul tavolo vuoto, e in fondo scrivere i dati in quella nuova tabella che si è sicuri che nessun altro sarà guardando senza bloccare tante risorse.

+48

+1 per la sintassi 'LIKE', che non avevo mai visto prima. – Malvolio

+0

@Malvolio degno di nota: penso che sia un'estensione SQL proprietaria di MySQL ... Non sicuro al 100% a riguardo. – Romain

+4

anche se lo è, quando è stata l'ultima volta che qualcuno ha utilizzato un RDBMS SQL non MySQL? Gli amici non permettono agli amici di acquistare Oracle. – Malvolio

9

Penso che la risposta appropriata per questo è utilizzando una funzionalità come pt-online-schema-change o gh-ost.

Abbiamo fatto la migrazione di oltre 4 miliardi di righe con questo, anche se può richiedere fino a 10 giorni, con meno di un minuto di inattività.

Percona funziona in modo molto simile come sopra

  • Creare una tabella temporanea
  • Crea trigger sulla prima tabella (per inserimenti, aggiornamenti, eliminazioni) in modo che siano replicati alla tabella temporanea
  • in piccoli lotti, la migrazione dei dati
  • al termine, rinomina tabella nuova tabella, e rilasciare l'altra tabella
+1

Questo è il tipo di domanda che dimostra che, soluzione meno votata o accettata a volte sono le soluzioni migliori o solo corrette. Quante persone votano per l'altra soluzione che non è corretta OMG. –

Problemi correlati