Wie gehen Sie mit Bereitstellungen von Datenbankänderungen um?

13

Wir haben heute über Datenbankbereitstellungstechniken gesprochen, hatten kürzlich einige Fehler in unserem aktuellen Prozess und haben Situationen gesehen, in denen wir eine Bereitstellung rückgängig machen möchten, die alte Version der Anwendung jedoch nie mit der neuen Version von getestet wurde Datenbank.

Auf der einen Seite gibt es Bereitstellungen im Migrationsstil, bei denen Sie eine Anweisung zum Auf- und Absenken der Version (unabhängig davon, ob diese in SQL oder in Ihrer Anwendungssprache geschrieben sind) haben und Ihre App weiß, auf welche Version sie zugreifen muss.

Diese sind einfach, und da wir nicht oft zurücksetzen, sind die Entwickler sehr an einfachen interessiert. Es gibt jedoch Risiken, wenn Sie ein Feld / eine Tabelle hinzufügen und dieses Feld vor dem Zurücksetzen ausgefüllt wird. Oder schlimmer noch, wenn Sie Daten löschen, die für die vorherige Version relevant waren.

Auf der anderen Seite können wir einen Upgrade-, Rollback- und Rollforward-Ansatz in Betracht ziehen, bei dem das Rollback nicht so drastisch ist wie bei Migrationen. Zum Beispiel kann ein Upgrade ein nicht nullbares Feld hinzufügen. Rollback macht es nullbar, so dass es der alten App egal ist; rollforward füllt die Nullfelder und macht sie wieder nicht nullbar.

Dies speichert Daten, ist jedoch sowohl beim Codieren als auch beim Testen kompliziert (leider sind unsere automatisierten Integrationstests so gut wie nicht vorhanden, und während wir dies korrigieren, haben wir in der Zwischenzeit ein Problem).

Gibt es sichere Möglichkeiten, um die Probleme damit zu mildern? Gibt es andere Optionen, die ich in Betracht ziehen sollte? Haben Sie schlechte Erfahrungen gemacht, die Sie gerne teilen möchten, um mir später Schmerzen zu ersparen?

pdr
quelle

Antworten:

9

Datenbankänderungen sollten wie alle anderen Änderungen behandelt und als Skripte im Rahmen der Bereitstellung bereitgestellt (und natürlich in der Quellcodeverwaltung gespeichert) werden. Da sie mit dem Code für dieselbe Anwendungsversion bereitgestellt werden, wissen Sie genau, was zurückgesetzt werden muss. Sie können Lust haben und ein Skript schreiben, um jede Änderung zum Zeitpunkt des Schreibens des Datenbankskripts rückgängig zu machen. Wenn Rollbacks jedoch nicht häufig sind, möchten Sie dies möglicherweise nicht tun. Wenn eine neue Spalte ausgefüllt wird, gehen Daten verloren, wenn Sie zur ursprünglichen Datenbank zurückkehren.

In SQL Server können Sie unmittelbar vor einer Bereitstellung einen Snapshot erstellen und sofort zu diesem zurückkehren, wenn die Bereitstellung fehlschlägt. Dies setzt voraus, dass die Bereitstellung NICHT stattfindet, wenn sich Benutzer im System befinden (Sie möchten ihre Datenänderungen nicht verlieren). Dies ist während einer Hauptversion am nützlichsten, wenn Sie möglicherweise das gesamte System vorübergehend herunterfahren müssen, um das Upgrade durchzuführen. Sie können auch den Snapshot erstellen und einen Datenbankvergleich zwischen dem Snapshot und der Datenbank durchführen, um die Unterschiede zu ermitteln, wenn Sie ein Rollback durchführen müssen. Ein Tool wie SQLCompare kann sogar den Code generieren, um zur Snapshot-Struktur zurückzukehren. Ich weiß nicht, was für andere Datenbanken verfügbar ist.

HLGEM
quelle
3

Änderungen an einer Datenbankstruktur sollten automatisiert / skriptgesteuert und in einer Testumgebung getestet werden. Manuelle Änderungen sind in einer Produktionsumgebung zu riskant

Die einzig vernünftige Rollback-Strategie (die mit der geringsten Wahrscheinlichkeit, dass sich die Situation verschlechtert) besteht darin, zu einem Snapshot vor dem Upgrade zurückzukehren. Wenn etwas schief geht, geschieht dies entweder schnell genug, um die Rückkehr zum Snapshot zu vereinfachen, oder zu spät für einen Rollback (der nächste Wochenendbericht schlägt aufgrund von Problemen in der Datenbank fehl).

Änderungen können schrittweise vorgenommen werden (z. B. Hinzufügen eines Felds) und so live mit weniger Risiko getestet werden, als wenn alle in einem Durchgang durchgeführt werden.

Mit der Planung können Sie Änderungen an der Datenbank vornehmen, um mehrere bevorstehende Versionen zu unterstützen, anstatt das Software- und Datenbank-Upgrade mit jeder Version konfrontieren zu müssen.

Seien Sie darauf vorbereitet, an den Tagen nach einem Datenbank-Upgrade im Notfallmodus zu sein , genau wie bei einem Software-Upgrade.

Widerstehen Sie dem Drang, Probleme manuell zu beheben. Verwenden Sie Ihre Notfallstrategie (Rollback, Snapshot) und überlegen Sie, warum etwas schief gelaufen ist, bevor Sie das Upgrade erneut versuchen.

Apalala
quelle