Question

J'ai un serveur MySQL 5.1 avec une base de données d'environ 450 tables, prenant 4 Go. La grande majorité de ces tables (tous sauf 2) sont MyISAM. Cela a été très bien pour la plupart (ne pas besoin de transactions), mais la demande a été gagner du trafic et certaines tables ont été touchés en raison de la table-blocage des mises à jour. C'est la raison pour laquelle deux des tables sont InnoDB maintenant.

La conversion sur les tables plus petites (100k lignes) ne prennent pas de temps du tout, ce qui provoque un minimum de temps. Cependant quelques-unes de mes tableaux de suivi sont près de 50 millions de lignes. Est-il possible d'accélérer un ALTER TABLE...ENGINE InnoDB sur de grandes tables? Et sinon, y at-il d'autres méthodes pour convertir les temps d'arrêt en minimisant sur ces tables d'écriture lourds?

Était-ce utile?

La solution

Permettez-moi de commencer par dire, je déteste ALTER. Il est mauvais, à mon humble avis.

Dis, ceci est votre schéma de la table en cours -

CREATE TABLE my_table_of_love (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=MyISAM CHARSET=utf8;

Voici le chemin que je recommande -

Créer un nouvel objet de table qui remplacera l'ancien:

CREATE TABLE my_table_of_love_NEW (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=InnoDB CHARSET=utf8

Insérez toutes les lignes de l'ancienne table par nom dans la nouvelle table:

INSERT INTO my_table_of_love_NEW (id,my_value,date_created)
SELECT id,my_value,date_created FROM my_table_of_love;

test de fumée migration:

SELECT COUNT(*) FROM my_table_of_love_NEW;
SELECT COUNT(*) FROM my_table_of_love;
SELECT a.id,a.my_value,a.date_created FROM my_table_of_love_NEW a
LEFT JOIN my_table_of_love b ON (b.id = a.id)
WHERE a.my_value != b.my_value;

Les noms de table de swap afin que vous puissiez maintenir une sauvegarde au cas où vous devez rollback.

RENAME TABLE my_table_of_love TO my_table_of_love_OLD;
RENAME TABLE my_table_of_love_NEW TO my_table_of_love;

Procéder à des tests de régression.

Cette approche devient de plus en plus préférable avec des tables avec plusieurs index et des millions de lignes.

Pensées?

Autres conseils

1) Protection de perte est une fonction de la paranoïa. Assurez-vous toujours une sauvegarde. Si vous êtes vraiment paranoïaque, faire une sauvegarde puis la restauration de la sauvegarde.

2) Cette page du manuel de MySQL a des instructions pour convertir les types de table.

  

Le meilleur moyen de modifier une table InnoDB est de faire les inserts directement à une table InnoDB. C'est, utilisez ALTER TABLE ... MOTEUR = InnoDB, ou créer une table InnoDB vide avec des définitions identiques et insérer les lignes avec INSERT INTO ... SELECT * FROM ....

3) PostgreSQL ne recherche en texte intégral , Sphinx du moteur semble faire pour MySQL

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top