2017-07-18 3 views
0

Ich habe gerade ein Problem beim Ausführen einer Produktionsbereitstellung mit capistrano gemeldet. Wir hatten gerade einen großen Refactor fertiggestellt, der viele Datenbankmigrationen enthielt.Verbindung unterbrochen während der Capistrano-Migration

Während der Bereitstellung ist das Schlimmste passiert, und meine SSH-Verbindung ist gesunken, während Cap die Migrationen durchlaufen hat.

Ich denke, es gibt ein Problem mit sshing durch unseren Load Balancer, aber das ist neben dem Punkt.

Ich konnte die Migrationen vollständig ausführen, indem ich den Bildschirm auf dem Server ausführte, migrierte und anschließend implementierte.

Die App ist jetzt auf und scheint gut zu funktionieren, aber ich fragte mich gerade, ob jemand weiß, wie Capistrano Migrationen behandelt, wenn die Verbindung unterbrochen wird?

Kann ich sicher sein, dass die Migration ausgeführt wurde, als die Verbindung unterbrochen wurde?

Wie hoch ist die Wahrscheinlichkeit, dass die Hälfte oder zwei Migrationen zweimal durchgeführt wurden?

Ich würde davon ausgehen, dass Cap jede Migration in einer DB-Transaktion, die Rollback würde, wenn ein Fehler auftrat, würde dies der Fall sein?

Antwort

0

Das Verlieren des SSH bedeutet nur, dass Sie den Zugriff auf die Instanz verloren haben, die Instanz und der Befehl jedoch bereits ausgeführt wurden (und noch immer ausgeführt werden).

Capistrano führt rake db:migrate nur unter der Haube aus, was bedeutet, dass Sie sich darauf verlassen können, dass die Migrationen vollständig ausgeführt oder ein Fehler gefunden wurde. Auch wenn der Prozess angehalten wird, da nach jeder Migration das Schema geändert wird, wird die Migration nicht erneut ausgeführt. Wenn es angehalten wird, ändert sich das Schema nicht und die Migration wird erneut ausgeführt, wenn Sie (oder capistrano) ein anderes Mal rake db:migrate ausführen.

Wenn Sie immer sicher sein wollen, keine Probleme auftreten (oder kann effektiv behandelt werden) schreiben Migrationen, die perfekt umkehrbar sind - dies stellt sicher, dass auf einem Migrationsfehler Rake können zuvor Migrationen laufen Rollback (auf der gleichen Reihenfolge ausgeführt, die aufgerufen der Fehler). Normalerweise sind die meisten Migrationen standardmäßig ohne zusätzlichen Code umkehrbar, aber wenn Sie komplexeres Verhalten haben, benötigen sie möglicherweise eine bestimmte umgekehrte Methode, um geschrieben zu werden (sagen Sie, Sie ändern Spalten und werfen Werte in etwas anderes). Das einzige, was standardmäßig nicht reversibel ist, ist das Löschen von Tabellen/Spalten, es sei denn, Sie fügen den Typ der remove-Anweisung hinzu, da dies bei einem Drop optional ist. Wenn column type vorhanden ist, wissen die Schienen auch, wie sie den Fall rückgängig machen können (ohne eine spezifische umgekehrte Methode zu benötigen).

+0

Sind Sie sicher, dass die Migrationen vollständig ausgeführt werden? Als ich mich anmeldete und die Migrationen manuell ausführte, starteten sie bei der Migration, die auf die Migration folgte, die ausgeführt wurde, als die Verbindung unterbrochen wurde. Ich verstehe, dass ausgeführten Migrationen nicht wieder ausgeführt werden, weshalb ich fühlte sicher d-migrieren, aber ich weiß nicht, wie zuversichtlich ich bin über die spezifische Migration die Verbindung fiel auf ... – Dalaigh88

+0

Hm, dann wahrscheinlich Du hast Recht, und es hört auf, wenn die Verbindung abbricht, aber was ich mit "Und wenn es angehalten wird ..." gemeint war, war im Grunde genommen, dass sich das Schema für die nicht ausgeführten Migrationen nicht ändert, also wenn du zurückkommst und rufe 'db: migrieren' es wird bei der ersten" un-run "migration nach links gehen und von dort gehen. Ich würde annehmen, dass die Datenbank selbst (abgesehen von Rails, Ruby und Rake) Schutz für Fehler mit "nicht persistenten" Änderungen bietet, entweder für Datensätze selbst (ACID) und für das Schema/die Tabelle. –

Verwandte Themen