17. Changements du schéma de la base (DDL)

Lorsque des changements sont faits sur la base, tels que l'ajout de champs à une table, il est nécessaire de le faire prudemment, pour éviter que certains nœuds ne soient bloqués lors de la création de certaines tables.

Si vous opérez les changements à travers Slony-I™ via SLONIK EXECUTE SCRIPT(7) (slonik) / schemadocddlscript_complete( integer, text, integer ) (procédure stockée), cela vous garantie que les changements prendront effet au même niveau dans les flux de transactions sur tous les nœuds. Cela n'a pas la même importance si vous pouvez arrêter votre système pour appliquer vos modifications de schéma mais si vous voulez faire vos mises à jour alors que vos transactions continuent leur vie, cela devient nécessaire.

Il est essentiel d'utiliser EXECUTE SCRIPT si vous modifiez des tables pour changer leurs structures. Si vous ne le faites pas, vous pouvez rencontrer des problèmes identiques à ceux décrits ici où les triggers des tables modifiées ne tiennent pas compte des changements de schéma réalisés. Cela peut conduire à une corruption des données sur le nœud abonné.

Il est utile de faire quelques « recommandations » sur SLONIK EXECUTE SCRIPT(7) :

Malheureusement, cela conduit à une vulnérabilité du script DDL, suivant la manière dont les changements DDL sont écrits. Si vos applications n'ont pas de schémas SQL suffisamment stables, l'utilisation de Slony-I™ pour le mécanisme de réplication peut ne pas être adaptée. Voir la section sur les questions de verrous pour plus de discussion sur le sujet.

Voici un article sur l'administration des changements de schémas avec Slony-I™ : Varlena General Bits.

17.1. Changements hors utilisation de EXECUTE SCRIPT

Alors qu'il est vital d'utiliser EXECUTE SCRIPT pour propager des modifications DDL sur des tables répliquées, il y a plusieurs autres modifications que vous pouvez vouloir réaliser d'une autre façon :

  • Il y a plusieurs types d'objets n'ayant pas de trigger que Slony-Ine peut pas répliquer, tels que les procédures stockées. Et il est assez probable que cela vous posera problème de propager ces mises à jour en association avec un ensemble de réplication où EXECUTE SCRIPT va verrouiller tout un jeu de tables qui n'ont pas réellement besoin de l'être.

    Si vous propagez une procédure stockée qui n'est pas utilisée tout le temps (de telle sorte que vous acceptiez une petite désynchronisation entre les nœuds), alors vous pouvez simplement la soumettre à chaque nœud par l'intermédiare d'une commande psql, ne faisant pas d'utilisation particulière de Slony-I™.

    Si vous avez besoin d'une parfaite synchronisation sur l'ensemble des nœuds, vous devez utiliser EXECUTE SCRIPT pour verrouiller vos travaux.

  • Vous pouvez avoir besoin d'index supplémentaires sur quelques nœuds répliqués pour accroître les performances.

    Par exemple, une table consistant en des transactions peut seulement avoir besoin des index relatifs à l'intégrité référentielle sur le nœud « origine ». Maximiser les performances dicte l'impératif de n'avoir que les index nécessaires. Mais rien ne vous empêche d'ajouter des index supplémentaires pour améliorer les performances des rapports qui s'exécutent via les nœuds répliqués.

    Il serait imprudent d'ajouter des indicateurs qui contraindraient les évènements sur les nœuds répliqués. En cas de problème, cela conduirait la réplication à s'arrêter car le ou les nœuds abonnés ne pourraient appliquer les changements provenant du nœud origine violant ainsi la contrainte.

    Cela ne pose pas de difficultés d'ajouter quelques mesures d'améliorations de performances. Il ne faut pratiquement jamais utiliser EXECUTE SCRIPT dans ce cadre ; cela conduit certains jeux de réplication à verrouiller/déverrouiller des tables et potentiellement échouer à l'application de l'événement à cause de verrous en cours sur les objets, puis devoir ré-essayer un certain nombre de fois avant de pouvoir effectuer le changement. À la place, si vous appliquez l'index « directement » au travers de psql, vous pouvez déterminer le moment auquel le verrou s'exerce sur la table. Ajouter un index à une table nécessite un verrou exlusif pour la durée de création de cet index : cela va implicitement stopper la réplication pendant la durée de construction de l'index, mais sans causer de problemes particuliers. Si vous ajoutez un index sur une table et que sa construction dure 20 minutes, la réplication sera stoppée pendant 20 minutes, mais repartira juste après la fin de la création.

  • Slony-I™ stocke le nom de l'« index primaire » dans sl_table, et utilise ce nom pour contrôler les colonnes considérées comme les « colonnes clés » lorsque le declencheur de table est présent. Il pourrait être envisageable de supprimer cet index et de le remplacer par une autre clé primaire potentielle, mais un changement de nom de cette clé primaire casserait certainement certaines choses.

17.2. Tester les changements DDL

Une méthode de test des changements DDL a été validée comme « bonne pratique ».

Vous devez tester les scripts DDL de façon non destructrice.

Si les nœuds sont, pour une raison ou une autre, totalement désynchonisés, la replication va très certainement échouer, et cela a lieu la plupart du temps au plus mauvais moment : celui où vous vouliez que cela fonctionne.

Vous pouvez vérifier si vos scripts DDL fonctionnent bien ou pas en les exécutant manuellement, en ajoutant BEGIN; au début et ROLLBACK; à la fin. De cette façon, les changements effectuent un retour arrière.

Si le script s'effectue correctement sur tous les nœuds, cela semble dire qu'il devrait s'exécuter également correctement via slonik(1). Si des problèmes apparaissent sur certains nœuds, cela devrait vous permettre de remettre ces machines à niveau, de façon à ce que le script s'exécute sans erreur.

[Avertissement]

Avertissement

Attention, si le script contient un COMMIT; n'importe où avant le ROLLBACK;, cela va effectuer des changements auxquels vous ne vous attendiez pas.