Je suis développeur PHP, alors ne soyez pas strict. J'ai une grande table ~ 5.5 Go de vidage. Notre PM a décidé de faire une nouvelle colonne pour effectuer une nouvelle fonctionnalité. La table est InnoDB donc ce que j'ai essayé:
Modifier la table en écran avec verrou de table. A pris environ 30 heures et rien. Alors je l'ai juste arrêté. J'ai d'abord fait une erreur parce que je n'ai pas mis fin à toutes les transactions, mais la deuxième fois, il n'y a pas eu de verrouillage multiple. Le statut était
copy to tmp table
.Puisque j'ai également besoin d'appliquer le partitionnement pour cette table, nous décidons de faire un vidage, de renommer et de créer une table avec le même nom et une nouvelle structure. Mais le vidage fait une copie stricte (au moins je n'ai pas trouvé autre chose). J'ai donc ajouté pour vider une nouvelle colonne avec
sed
et l'interroger. Mais d'étranges erreurs ont commencé. Je crois que cela a été causé par charset. La table dans utf-8 et le fichier sont devenus us-ascii aprèssed
. J'ai donc eu des erreurs (commande inconnue '\' ') sur 30% des données. C'est donc aussi une mauvaise façon.
Quelles sont les autres options pour accomplir cela et accélérer les performances (je peux le faire avec un script php, mais cela prendra des siècles). Quelle sera la performance de INSERT SELECT
dans ce cas.
Merci pour toute avance.
SET NAMES utf8
et.COLLATION
Mais meh idk pourquoi 30% des données sont corrompues aprèssed
. Je pense que la charge en vrac sera la plus rapide mais peut-être que quelque chose de plus existe qui me manque. Merci MarkVotre idée sed est une méthode décente, mais sans les erreurs ou la commande que vous avez exécutée, nous ne pouvons pas vous aider.
Cependant, une méthode bien connue pour apporter des modifications en ligne à de grandes tables est pt-online-schema-change . L'oubli simpliste de ce que fait cet outil est copié à partir de la documentation:
Cette méthode peut également prendre un certain temps, mais pendant le processus, la table d'origine sera complètement utilisable.
la source
'D\'agostini'
, provoquera une erreurunknown command '\''
. Mais pas toujours, comme dans 30% des cas. C'est étrange et buggy. La même chose vient même avec les vidages hex-blob. Merci Derek.alter table add column, algorithm=inplace, lock=none
modifiera une table MySQL 5.6 sans copier la table et sans impact de verrouillage.Je viens de le tester hier, une masse a inséré 70 000 lignes dans une table de partition à 280 000 lignes 7, 10 000 lignes dans chaque partition, avec 5 secondes de sommeil entre les deux pour permettre un autre débit.
A commencé les insertions en masse, puis dans une session distincte a commencé la
alter
déclaration en ligne ci-dessus dans MySQL Workbench, laalter
fin avant les insertions, deux nouvelles colonnes ont été ajoutées, et aucune ligne n'a résulté de la modification, ce qui signifie que MySQL n'a copié aucune ligne.la source
Actuellement, la meilleure option pour modifier des tables énormes est probablement https://github.com/github/gh-ost
gh-ost est une solution de migration de schéma en ligne sans déclencheur pour MySQL. Il est testable et offre une pause, un contrôle / reconfiguration dynamique, un audit et de nombreux avantages opérationnels.
gh-ost génère une charge de travail légère sur le maître tout au long de la migration, découplée de la charge de travail existante sur la table migrée.
Il a été conçu sur la base d'années d'expérience avec les solutions existantes et change le paradigme des migrations de tables.
la source
Je pense que Mydumper / Myloader est un bon outil pour des opérations comme celle-ci: s'améliore chaque jour. Vous pouvez utiliser vos processeurs et charger des données en parallèle: http://www.percona.com/blog/2014/03/10/new-mydumper-0-6-1-release-offers-several-performance-and- fonctionnalités d'utilisation /
J'ai réussi à charger des centaines de gigaoctets de tables MySQL en quelques heures.
Maintenant, quand il s'agit d'ajouter une nouvelle colonne, c'est difficile car MySQL copie la table entière dans la
TMP
zone de mémoire avecALTER TABLE...
Bien que MySQL 5.6 dise qu'il peut faire des changements de schéma en ligne, je n'ai pas réussi à les faire en ligne pour des tables massives sans verrou contention encore.la source
j'ai juste eu le même problème. Un petit contournement:
CREATE TABLE new_table SELECT * FROM oldtable;
SUPPRIMER DE new_table
ALTER TABLE new_table ADD COLUMN new_column int (11);
INSERT INTO new_table select *, 0 from old_table
drop table old_table; renommer la table new_table TO old_table;
la source