2012-12-07 10 views
6

J'ai une table avec 21 millions de lignes.J'ai à changer l'un des nom de la ligne.Quand j'essaye avec la requête "modifier la table société modifier l'ID new_id int (11)"; la requête ne se termine jamais.Changer le nom du champ mysql dans une énorme table

Existe-t-il un moyen simple de changer le nom du champ de la grande table mysql?

+0

Avez-vous essayé de le faire dans phpMyAdmin? Cela pourrait utiliser une méthode plus efficace – Swadq

+0

J'ai essayé avec PHPMyAdmin et commandline. – demircan

+1

Vous pouvez faire un mySqldump et éditer le fichier de vidage. Puis réimporter les données. – ethrbunny

Répondre

0

Que pensez-vous:

  1. exporter toutes les données et truncate table
  2. alter table
  3. modifier le nom de la ligne dans le fichier exporté
  4. fichier d'importation

Il est juste une idée rapide, mais elle ne sera pas rapide (export/import).

Ou Essayez-vous de faire ALTER pendant la maintenance de quelques heures? :)

5

Tout d'abord, avant tout, la sauvegarde de la table:

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

Une chose à garder à l'esprit lorsque vous faites une commande ALTER est à absolument assurez-vous que vous avez les mêmes détails de colonne pour l'alter que vous aimeriez ne pas changer.

Ainsi, par exemple:

ALTER TABLE big_table MODIFY COLUMN id INT(11) 

sauterait quoi que ce soit d'autre comme AUTO_INCREMENT et NOT NULL. Il est donc préférable d'inclure cela dans la déclaration alter.

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

Fondamentalement copie un peu plus de la création de la zone déclaration pour la colonne d'identité et remplacer ce que vous voulez et inclure cela dans la déclaration modify.

+1

+1 pour sauvegarder cette table avant de modifier quoi que ce soit. – ethrbunny

+0

Aussi, si l'alt se trompe pour une raison quelconque, vous pouvez rechercher et remplacer le champ 'id INT (11)' dans l'instruction 'CREATE TABLE' dans le fichier de sauvegarde' big_table.backup.sql' pour correspondre à ce que vous voulez et puis importez-le normalement en utilisant 'mysql -uroot -p db matsko

+0

Merci. J'essaie.Je posterai le résultat. – demircan

1

Vous pouvez simplement faire ce qui suit:

table 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; 

table 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; 

Lorsque vous avez terminé, big_table_bak est votre sauvegarde.

Si vous êtes satisfait de la nouvelle big_table vous pouvez exécuter

DROP TABLE big_table_bak; 

Si vous souhaitez revenir en arrière, vous pouvez exécuter

DROP TABLE big_table; 
ALTER TABLE big_table_bak RENAME big_table; 

Lui donner un essai !!!

+1

Ce n'est pas si simple si vous avez 21 millions de lignes ... –

+0

Comment cela fonctionne avec des contraintes externes? – hugofcampos

1

La méthode moins de temps consommer de changer le nom d'un champ dans une grande table Mysql est à:

CREATE TABLE new_big_table id SELECT comme new_id, champ1, champ2, field3 DE big_table.

3

Utilisez pt-online-schema-change pour effectuer des modifications ALTER TABLE de longue durée sans vous exclure de la table.

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

Il faut généralement plus pour terminer le changement, mais vous pouvez toujours lire et écrire à la table pendant qu'il fait son travail.

Vous pouvez également écouter un webinaire de l'auteur, en parlant de la façon dont cela fonctionne et certaines de ses mises en garde:

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

Questions connexes