2012-12-07 28 views
6

Ho una tabella con 21 milioni di righe. Devo cambiare uno dei nomi di riga. Quando provo con la query "alter table company id id new_id int (11)"; la query non finisce mai.Modifica il nome del campo mysql in una tabella enorme

C'è un modo semplice per modificare il nome del campo della tabella di mysql grande?

+0

Hai provato a farlo in phpMyAdmin? Ciò potrebbe utilizzare un metodo più efficiente – Swadq

+0

che ho provato con PHPMyAdmin e riga di comando. – demircan

+1

Si potrebbe fare un mySqldump e modificare il file di dump. Quindi reimportare i dati. – ethrbunny

risposta

0

Cosa ne pensi:

  1. l'esportazione di tutti i dati e troncare la tabella
  2. tavolo alter
  3. cambio di nome della riga nel file esportato
  4. file di importazione

E 'solo un'idea veloce, ma non sarà veloce (esportazione/importazione).

Oppure Provare a fare ALTER durante la notte qualche ora di manutenzione? :)

5

In primo luogo, prima di tutto, il backup della tabella:

mysqldump -uroot -p db big_table > /tmp/big_table.backup.sql 

Una cosa da tenere a mente quando si fa un comando ALTER è quello di assolutamente fare in modo di avere gli stessi dettagli della colonna per l'alter che non vorresti cambiare.

Così, per esempio:

ALTER TABLE big_table MODIFY COLUMN id INT(11) 

sarebbe escluso qualsiasi altra cosa simile AUTO_INCREMENT e NOT NULL. Quindi è meglio includerlo anche nella dichiarazione alter.

ALTER TABLE big_table MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT; 

In pratica basta copiare sopra l'area istruzione create per la colonna ID e sostituire ciò che si vuole e comprendono che nella dichiarazione di modifica.

+1

+1 per eseguire il backup di questa tabella prima di modificare qualcosa. – ethrbunny

+0

Inoltre, se l'alter altera per qualche motivo, puoi cercare e sostituire il campo 'id INT (11)' all'interno dell'istruzione 'CREATE TABLE' all'interno del file di backup' big_table.backup.sql' in modo che corrisponda a quello che vuoi e quindi importalo normalmente usando 'mysql -uroot -p db matsko

+0

Grazie. Ci sto provando. Pubblicherò il risultato. – demircan

1

si può semplicemente effettuare le seguenti operazioni:

tabella MyISAM

CREATE TABLE big_table_new LIKE big_table; 
ALTER TABLE big_table_new MODIFY COLUMN id INT(11); 
ALTER TABLE big_table_new DISABLE KEYS; 
INSERT INTO big_table_new SELECT * FROM big_table; 
ALTER TABLE big_table_new ENABLE KEYS; 
ALTER TABLE big_table RENAME big_table_bak; 
ALTER TABLE big_table_new RENAME big_table; 

tabella InnoDB

CREATE TABLE big_table_new LIKE big_table; 
ALTER TABLE big_table_new MODIFY COLUMN id INT(11); 
INSERT INTO big_table_new SELECT * FROM big_table; 
ALTER TABLE big_table RENAME big_table_bak; 
ALTER TABLE big_table_new RENAME big_table; 

Quando hai finito, big_table_bak è il backup.

Se si è soddisfatti della nuova big_table è possibile eseguire

DROP TABLE big_table_bak; 

Se si vuole tornare è possibile eseguire

DROP TABLE big_table; 
ALTER TABLE big_table_bak RENAME big_table; 

fare un tentativo !!!

+1

Questo non è così semplice se hai 21 milioni di righe ... –

+0

Come funziona con i vincoli esterni? – hugofcampos

1

Il meno tempo metodo che richiede di cambiare il nome di un campo in un enorme tavolo da MySQL a:

CREATE TABLE new_big_table SELECT id come new_id, campo1, campo2, campo3 DA big_table.

3

Utilizzare lo schema pt-online-change per eseguire modifiche ALTER TABLE di lunga durata, senza bloccarsi al di fuori della tabella.

http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html

di solito ci vogliono più per completare la modifica, ma si può ancora leggere e scrivere al tavolo mentre si sta facendo il suo lavoro.

È possibile anche ascoltare un webinar da parte dell'autore, parlando di come funziona e alcuni dei suoi avvertimenti:

http://www.percona.com/webinars/2012-05-02-zero-downtime-schema-changes-in-mysql

Problemi correlati