Ändern des Datenbankschemas in der Produktionsumgebung

7

Ich habe einige Fragen zu Änderungen des Datenbankschemas in der Produktionsumgebung, ohne den Datenbankserver und die Webanwendung offline zu schalten.

Q1- Ich möchte in meiner Produktionsumgebung Änderungen am Datenbankschema (Hinzufügen, Entfernen von Spalten, Normalisieren von Tabellen usw.) vornehmen können, ohne den Datenbankserver und meine Webanwendung offline zu schalten. Was sind einige der besten Praktiken, um dies zu erreichen? Gibt es auch kostenlose Tools, die sich mit diesem Problem befassen? Ich benutze PostgresSQL .

F2- Während die Datenbank aktualisiert wird, arbeiten die App-Server in der Produktion mit der alten oder der neuen Datenbank. Oder gibt es normalerweise eine Art Hybrid, der möglicherweise ein Strategiemuster in der App verwendet? Was sind einige der Best Practices dafür? Wann ist es sicher, den Appserver auf die aktualisierte Datenbank zu verweisen? Wird es Ausfallzeiten geben oder kann das irgendwie vermieden werden?

Vielen Dank.

Abdul Rahman
quelle
1
Wir machen es die ganze Zeit. Google beschreibt im folgenden Artikel "Entwickeln wartungsarmer Datenbanken" das Refactoring von Tabellen ohne Ausfallzeiten.
AK

Antworten:

1

Es hängt wirklich davon ab, wie groß, kompliziert und aktiv Ihre Datenbank ist. Beachten Sie, dass während Sie Schemaänderungen vornehmen, viele der Tabellen schreibgeschützt oder vollständig unzugänglich sind, bis die Änderungen abgeschlossen sind. Denken Sie auch daran, dass das Gegenteil der Fall ist: Ihre Schemaänderungen müssen exklusive Sperren für ganze Tabellen und möglicherweise für alle ihre Beziehungen erhalten. Dies kann lange dauern oder sogar unmöglich sein, wenn die Anwendung im Weg steht. Theoretisch kann dies zu kreisförmigen Sperren führen, die den gesamten DB einfrieren. Grundsätzlich sollten Sie stattdessen Ausfallzeiten einplanen, wenn viele Lese- und Schreibvorgänge ausgeführt werden und Änderungen zu erheblichen Störungen Ihrer Anwendung führen.

Dann müssen Sie die Änderungen berücksichtigen, die Ihre Anwendung erfordert. Erfordert das Ändern des Schemas auch Änderungen in der Anwendung? Ist Ihre Anwendung klein genug oder modular genug, um diese Änderungen in Schritten vorzunehmen, wenn Sie die Datenbank ändern? Letztendlich ist es sehr schwierig, Änderungen in der Produktion vorzunehmen. Wenn Ihre App nicht von Grund auf dafür entwickelt wurde, lohnt sich der zusätzliche Aufwand für kleine Ausfallzeiten fast überall nicht.

Die andere Möglichkeit, Ausfallzeiten zu minimieren, besteht darin, eine neue Datenbank mit einem verbesserten Schema und einem damit verbundenen neuen App-Server zu erstellen und anschließend ein Widget zu erstellen, um die Daten zwischen der neuen und der alten Datenbank zu synchronisieren. Wenn Sie zur Bereitstellung bereit sind, leiten Sie den Datenverkehr einfach zum neuen App-Server. Dies ist wiederum ein Kompromiss zwischen der Schwierigkeit, das System zu erstellen, und der Schwierigkeit, Ausfallzeiten zu akzeptieren. Es gibt nur sehr wenige Anwendungen, die ein oder zwei Stunden mit einer Meldung "Geplante Wartung" ab 2 Uhr morgens am Dienstagabend nicht tolerieren können.

Andrew Brennan
quelle
0

Ich erstelle und teste ein Skript mit den Änderungen auf einem Entwicklungsserver. Es muss die Datenbank vollständig automatisiert und reproduzierbar aktualisieren. Dazu gehört, dass es mit demselben Benutzer und denselben Berechtigungen ausgeführt wird, mit denen es auf dem Produktionsserver ausgeführt wird. Diese Frage ist jedoch zu weit gefasst und sollte unter https://dba.stackexchange.com/ gestellt werden.

Clodoaldo
quelle
Danke Clodoaldo. Ich war hauptsächlich daran interessiert, jegliche Art von Anwendungsausfallzeiten zu vermeiden, während ich größere Upgrades für die Produktionsdatenbank durchführte. Was wären gute Praktiken dafür, wenn das überhaupt möglich ist?
Abdul Rahman