Je dois périodiquement apporter des modifications aux tables dans mysql 5.1, principalement en ajoutant des colonnes. Très simple avec la commande alter table. Mais mes tables ont maintenant jusqu'à 40 millions de lignes et elles se développent rapidement ... Donc, ces commandes de modification de table prennent plusieurs heures. Dans quelques mois, cela prendra des jours, je suppose.
Étant donné que j'utilise amazon RDS, je ne peux pas avoir de serveurs esclaves avec lesquels jouer, puis promouvoir en tant que maître. Donc, ma question est de savoir s'il existe un moyen de le faire avec un temps d'arrêt minimal? Cela ne me dérange pas qu'une opération prenne des heures voire des jours si les utilisateurs peuvent toujours utiliser la base de données bien sûr ... Peuvent-ils au moins lire pendant l'ajout de colonnes? Que se passe-t-il si mon application essaie d'écrire? Insérer ou mettre à jour? S'il échoue immédiatement, ce n'est pas si grave, s'il se bloque et cause des problèmes au serveur de base de données, c'est un gros problème.
Cela doit être un problème de mise à l'échelle assez courant, tout le monde doit ajouter des colonnes. Que fait généralement une base de données de production? Esclave -> migration maître?
Mise à jour - J'ai oublié de mentionner que j'utilise le moteur de stockage innodb
Réponses:
Non. Pas vraiment. Mais ne le fais pas. Il devrait être une occasion très rare lorsque cela est toujours nécessaire.
En supposant que vos données soient normalisées au départ, la bonne façon de résoudre le problème consiste à ajouter une nouvelle table avec une relation 1: 1 à la table de base (non obligatoire sur la nouvelle table).
Devoir ajouter des colonnes régulièrement est généralement un indicateur d'une base de données qui n'est pas normalisée - si votre schéma n'est pas normalisé, c'est le problème que vous devez résoudre.
Enfin, si votre schéma est vraiment, vraiment normalisé et que vous devez vraiment, vraiment continuer à ajouter des colonnes alors:
la source
Je devais juste le faire récemment. Ce qu'Amazon recommandait était d'utiliser le Percona Toolkit. Je l'ai téléchargé et j'ai pu exécuter quelque chose comme:
et ça marche très bien. Il vous indique le temps restant dans le processus.
Il crée en fait une nouvelle table avec la nouvelle colonne, puis copie les données existantes. En outre, il crée un déclencheur afin que les nouvelles données soient également transférées vers la nouvelle table. Il renomme ensuite les tables automatiquement, supprime l'ancienne table et vous êtes opérationnel avec la nouvelle colonne et aucun temps d'arrêt pendant que vous attendez les mises à jour.
la source
symcbean fournit des recommandations solides .
Pour répondre à votre question, le moyen le plus simple et le meilleur d'atténuer l'impact consiste à répliquer plusieurs bases de données. Double maître avec une procédure de basculement appropriée arrêtant la réplication sur l'actif, ce qui permet une modification sur l'inactif sans impact sur l'actif.
Vous pouvez potentiellement le faire sur une seule base de données en direct et minimiser l'impact en utilisant une procédure similaire à celle que j'ai détaillée dans cette réponse . Certes, cela est similaire à ce que symcbean a décrit mais inclut des détails techniques. Vous pouvez également utiliser un champ auto_increment et pas seulement un horodatage.
En fin de compte, si votre ensemble de données devient si volumineux, vous devez également envisager l'archivage entre les bases de données OLTP et OLAP . Votre ensemble de données de transaction ne devrait pas avoir besoin d'être si grand, si vous le concevez de manière appropriée.
la source
Depuis le manuel: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
La lecture fonctionnera donc bien. Les écritures seront bloquées, mais exécutées par la suite. Si vous voulez éviter cela, vous devrez modifier votre logiciel.
la source
Je suis dans une situation similaire où je dois modifier 1 de ma table de transactions qui fait presque 65 Go. J'entends 2 solutions
la source