Comment le système de base de données le plus "populaire" (MySQL, Postgres ...) gère-t-il la modification des tables sur les bases de données de production en direct (comme l'ajout, la suppression ou le changement du type de colonnes)?
Je sais que la bonne façon est de sauvegarder tout le temps d'arrêt planifié et de faire ensuite les modifications.
Mais ... un système de base de données actuel prend-il en charge ces opérations "en ligne" sans rien arrêter? (peut-être simplement retarder les requêtes qui font référence à une colonne qui vient d'être modifiée / supprimée)
Et que se passe-t-il lorsque je fais juste une ALTER TABLE...
sur une base de données en cours d'exécution? Tout s'arrête-t-il lorsque cela se produit? Les données peuvent-elles être corrompues? etc.
Encore une fois, je me réfère principalement à Postgres ou MySQL car ce sont ce que je rencontre.
(Et, oui, à chaque fois que je devais le faire avant de le faire "de la bonne façon", sauvegarder les choses, planifier le downtine, etc. ... mais je veux juste savoir s'il est possible de faire ce genre de choses "rapidement et sale "ou s'il existe un système de base de données qui prend réellement en charge les modifications de schéma" rapides, en direct et sales ")
Quelqu'un vient de suggérer un changement de schéma en ligne pour MySQL à partir du script Facebook (avec un tutoriel ici et la source ici ) ... semble être une bonne façon d'automatiser un ensemble de façons "hacky" de le faire ... quelqu'un l'a-t-il déjà utilisé dans quelque chose qui ressemble à une production?
la source
pg_reorg
peut aider dans les scénarios les plus difficiles.Réponses:
Lorsque vous émettez un
ALTER TABLE
dans PostgreSQL, il faudra unACCESS EXCLUSIVE
verrou qui bloque tout, y comprisSELECT
. Cependant, ce verrou peut être bref si la table ne nécessite pas ré-écriture, aucune nouvelleUNIQUE
,CHECK
ou lesFOREIGN KEY
contraintes ont besoin des analyses coûteuses tables complet pour vérifier, etc.En cas de doute, vous pouvez généralement l'essayer! Tous les DDL dans PostgreSQL sont transactionnels, il est donc très bien d'annuler un
ALTER TABLE
si cela prend trop de temps et commence à suspendre d'autres requêtes. Les niveaux de verrouillage requis par diverses commandes sont documentés dans la page de verrouillage .Certaines opérations normalement lentes peuvent être accélérées pour être exécutées en toute sécurité sans temps d'arrêt. Par exemple, si vous avez une table
t
et que vous souhaitez remplacer la colonnecustomercode integer NOT NULL
partext
parce que le client a décidé que tous les codes client doivent maintenant commencer par unX
, vous pouvez écrire:... mais cela verrouillerait toute la table pour la réécriture. Il en va de même pour l'ajout d'une colonne avec un
DEFAULT
. Cela peut être fait en quelques étapes pour éviter le verrouillage long, mais les applications doivent être capables de faire face à la duplication temporaire:Cela empêchera seulement écrit au
t
cours du processus; le nom de la serrureEXCLUSIVE
est quelque peu trompeur en ce qu'il exclut tout saufSELECT
; leACCESS EXCLUSIVE
mode est le seul qui exclut absolument tout. Voir les modes de verrouillage . Il y a un risque que cette opération puisse entraîner un blocage-retour en raison de la mise à niveau du verrou requise par leALTER TABLE
, mais au pire, vous devrez simplement la refaire.Vous pouvez même éviter que le verrouillage et faire le tout en direct en créant une fonction de déclenchement sur
t
que chaque fois qu'unINSERT
ouUPDATE
arrive, automatiquement Remplitcustomercode_new
decustomercode
.Il existe également des outils intégrés tels que
CREATE INDEX CONCURRENTLY
et quiALTER TABLE ... ADD table_constraint_using_index
sont conçus pour permettre aux administrateurs de base de données de réduire les durées de verrouillage exclusives en travaillant plus lentement de manière conviviale.L'
pg_reorg
outil ou son successeurpg_repack
peut également être utilisé pour certaines opérations de restructuration de tables.la source
ALTER TABLE t ADD COLUMN i INT
est une opération rapide (généralement <1 ms) une fois le verrou acquis. L'acquisition du verrou peut cependant mettre en file d'attente les connexions, donc ce n'est pas "gratuit" ... bien que ce soit mieux que ce que vous devez faire dans MySQL. Ajouter uneNOT NULL
contrainte est plus difficile et pas pour le feint de cœur.pg_repack
soit le meilleur successeur depg_reorg
.Percona propose son propre outil pour effectuer des modifications de schéma en ligne
L'outil s'appelle pt-online-schema-change
Cela implique des déclencheurs, veuillez donc lire attentivement la documentation.
Selon la documentation, les principales opérations effectuées sont
la source
Arrêter le système et effectuer toutes les modifications en même temps peut être très risqué. Si quelque chose ne va pas, et souvent, il n'y a pas de moyen facile de revenir en arrière.
En tant que développeur Agile, j'ai parfois besoin de refactoriser les tables sans aucun temps d'arrêt, car ces tables sont en cours de modification et de lecture.
L'approche suivante présente un faible risque, car le changement se fait en plusieurs étapes à faible risque qui sont très faciles à annuler:
Nous avons utilisé cette approche à plusieurs reprises pour modifier de grandes tables de production en direct sans interruption, sans aucun problème.
la source
rollback
si quelque chose se passe mal.Oui, de nombreuses bases de données modernes vous permettront d'ajouter simplement une colonne ou de modifier les caractéristiques d'une colonne, comme l'ajout ou la suppression de nullable.
Si vous supprimez une colonne, les données seront perdues, mais il n'y a pas beaucoup de peur de la corruption.
la source
L'outil Percona utilise des déclencheurs pour faciliter sa modification, et il ne fonctionne pas correctement si votre table a déjà des déclencheurs existants. J'ai fini par en écrire un qui gère bien les déclencheurs existants, car ils sont très importants pour notre base de données https://github.com/StirlingMarketingGroup/smg-live-alter
la source
Pour répondre à la question de savoir ce qui se passe avec une
ALTER TABLE
déclaration, cela dépend de l'étendue de vos modifications. Dans des cas spécifiques, si vous ajoutez une nouvelle colonne, au moins dans MS SQL Server, le moteur crée une copie temporaire de la table, tandis qu'il crée la nouvelle définition de table, puis insère les données à l'intérieur. Pendant la durée du changement, le tableau serait donc inaccessible aux utilisateurs.Un exemple des opérations spécifiques pour le serveur MSSQL est ici: http://support.microsoft.com/kb/956176/en-us
Je suppose que d'autres RMDB ont des méthodes similaires, bien que l'implémentation exacte soit quelque chose que vous devrez vérifier avec la documentation du fournisseur.
la source