2012-06-12 11 views
8

Voglio correre questo sul mio tavolo:Modifica del tipo di dati di una colonna in una tabella ENORME. Prestazioni emette

ALTER TABLE table_name MODIFY col_name VARCHAR(255) 

Ma il mio tavolo è enorme, ha più di 65M (65 milioni) righe. Ora quando eseguo, ci vogliono quasi 50 minuti per eseguire questo comando. Qual è il modo migliore per alterare la tabella?

+4

No, che sta per essere lento. Un'istruzione ALTER è un'azione una tantum. Aspettalo e spero che tu non abbia bisogno di farlo di nuovo. –

+3

Tavolo enorme? no. Molto largo? sì. –

risposta

3

bene, è necessario

ALTER TABLE table_name CHANGE col_name new_name VARCHAR(255) 

Ma, hai ragione, ci vuole un po 'per fare il cambiamento. Non c'è davvero un modo più veloce per cambiare la tabella in MySQL.

I tuoi tempi di inattività durante il cambio sono preoccupanti? In tal caso, ecco un possibile approccio: copia la tabella in una nuova, quindi modifica il nome della colonna sulla copia, quindi rinomina la copia.

Probabilmente avete capito che i nomi delle colonne che cambiano di routine nelle tabelle in un sistema di produzione non è una buona idea.

+0

Sì. Non posso permettermi di avere tempi di inattività di 50 minuti, dal momento che tutte le file saranno bloccate durante questa operazione che impedirà altre azioni (CRUD) su questa tabella. – Kiran

+0

Uh. Oh. Ciò significa che se copi la tabella, le nuove e le nuove righe verranno visualizzate nella tabella precedente mentre stai riorganizzando quella nuova. Se questo fosse il mio progetto, ora starei cercando di decidere quanto sia importante cambiare il nome di questa colonna. –

+0

sì. Posso fare una cosa. Annuncia il tempo di inattività di 1 ora e apporta le modifiche quando il carico è inferiore. Probabilmente a mezzanotte. Tuttavia, grazie per i tuoi input. – Kiran

0

È possibile gestire il cambiamento dello schema senza tempi di inattività utilizzando Oak.

oak-online-alter-table copia lo schema della tabella originale, applica le modifiche e quindi copia i dati. Le operazioni CRUD possono ancora essere invocate poiché la quercia inserisce alcuni trigger nella tabella originale, quindi nessun dato andrà perso durante l'operazione.

Si prega di fare riferimento a other question dove autore di quercia fornisce una spiegazione dettagliata su questo meccanismo e suggerisce anche altri strumenti.