5

Angenommen, es gibt eine Datenbank mit mehr als 100 Tabellen, und es wurde ein Hauptmerkmal hinzugefügt, bei dem 20 vorhandene Tabellen geändert und 30 weitere hinzugefügt werden müssen. Die Änderungen wurden über eine lange Zeit (6 Monate) von mehreren Entwicklern in der Entwicklungsdatenbank durchgeführt. Nehmen wir an, dass die Änderungen keine vorhandenen Produktionsdaten ungültig machen (z. B. sind in addierten Spalten Standardwerte/Nullen erlaubt, es gibt keine neuen Beziehungen oder Einschränkungen, die nicht erfüllt werden konnten).Empfohlene Vorgehensweise zum Ändern des Schemas einer Produktions-SQL-Datenbank?

Was ist der einfachste Weg, diese Änderungen im Schema in der Produktionsdatenbank zu veröffentlichen? Vorzugsweise ohne die Datenbank für eine längere Zeit herunterzufahren.

+0

Ist Ihre Frage "wie kann ich zwei Datenbanken unterscheiden, um die Änderungen zu finden" oder ist es "wie kann ich bekannte Änderungen anwenden?"? – tpdi

+0

@ tpdi: die Frage ist, wie das Problem zu lösen, so denke ich, sowohl "finden und pflegen Änderungen" und "Änderungen anwenden". Deshalb habe ich die Antwort akzeptiert, die beide abdeckt. – Marek

Antwort

2

Es gibt keine allgemeine Antwort darauf, wie Änderungen ohne Ausfallzeiten vorgenommen werden können. Die Antwort hängt wirklich von Fall zu Fall ab, basierend auf genau was die Änderungen sind. Einige Änderungen haben keinen Einfluss auf die Ausfallzeit (z. B. Hinzufügen neuer Tabellen), einige Änderungen haben minimale Auswirkungen (z. B. das Hinzufügen von Spalten zu vorhandenen Tabellen ohne Änderung der Datengröße, wie eine neue Nullable-Spalte, die die Null-Bitmap-Größe erhöht) andere Änderungen werden die Ausfallzeit zerstören (jede Operation, die die Datengröße ändert, wird die Wiederherstellung erzwingen und indexieren und die Tabelle für die Dauer sperren). Einige Änderungen sind ohne signifikante Ausfallzeiten nicht möglich. Ich kenne Fälle, in denen die Änderungen parallel angewendet wurden: Eine Kopie der Datenbank wird erstellt, die Replikation wird so eingerichtet, dass sie aktuell bleibt, dann wird die Kopie geändert und synchron gehalten, schließlich werden die Operationen in die geänderte Kopie verschoben Stammdatenbank. Es gibt eine Präsentation unter PASS 2009 given by Michelle Ufford, die erwähnt, wie Gottaddy durch solch eine Veränderung, die dauerte Wochen dauerte.

Aber in einem geringeren Maßstab müssen Sie die Änderungen durch ein gut getestetes Skript anwenden und die Auswirkungen auf die Testauswertung messen.

Aber die eigentliche Frage ist: wird dies die letzten Änderungen, die Sie jemals an das Schema vornehmen? Schließlich haben Sie das perfekte Schema für die Anwendung entdeckt und die Produktionsdatenbank wird sich nie ändern. Gratulation, wenn du das einmal gemacht hast, kannst du zur Ruhe gehen. Aber realistisch gesehen, werden Sie das gleiche Problem in 6 Monaten begegnen. Das eigentliche Problem ist Ihr Entwicklungsprozess, mit Entwicklern und Änderungen von SSMS oder VS Server Explored direkt in die Datenbank.Ihr Entwicklungsprozess muss sich bewusst bemühen, eine Schemaänderungsstrategie auf Basis von Versions- und T-SQL-Skripten zu übernehmen, wie sie in Version Control and your Database beschrieben ist.

+0

Danke für die erschöpfende Antwort - Ich stimme zu, dass es einen Prozess geben muss, um sicherzustellen, dass Entwickler keine Änderungen ad hoc vornehmen - lustigerweise zeigt das Klicken auf den letzten Link "Fehler beim Herstellen einer Datenbankverbindung" – Marek

+0

Fehler beim Einrichten einer Datenbank Verbindung ': Alles, was ich sagen kann, ist, dass hostingmonster.com Hosting-Qualität weit unterdurchschnittlich ist –

6

Schreiben Sie ein T-SQL-Skript, das die erforderlichen Änderungen durchführt. Testen Sie es auf einer Kopie Ihrer Produktionsdatenbank (Wiederherstellen von einer aktuellen Sicherung, um die Kopie zu erhalten). Beheben Sie die unvermeidlichen Fehler, die der Test entdecken wird. Wiederholen Sie den Vorgang, bis das Skript einwandfrei funktioniert.

Dann, wenn es Zeit für die eigentliche Migration ist: sperren Sie die DB, so dass nur Administratoren anmelden können. Machen Sie eine Sicherungskopie. Führen Sie das Skript aus. Überprüfen Sie die Ergebnisse. DB wieder online stellen

Der längste Teil wird die Sicherung sein, aber Sie wären verrückt, es nicht zu tun. Sie sollten wissen, wie lange Backups dauern, der gesamte Prozess wird nicht viel länger dauern, so lange dauert Ihre Ausfallzeit. Die Mitte der Nacht funktioniert gut für die meisten Unternehmen.

+0

Das bedeutet, dass mitten in der Nacht, direkt nach dem normalen Backup, ein idealer Zeitpunkt für die Konvertierung sein könnte. Auf diese Weise wird das Konvertierungs-Backup nicht zusätzlich zur normalen Sicherung durchgeführt. – MJB

+0

@MJB - Solange es nach einer vollständigen Sicherung und nicht nur eine tlog-Sicherung ist. – Donnie

+0

Und ich stimme den anderen Posts zu, die vorschlagen, SQL zu vergleichen, um das Skript zu generieren. Dies kann Ihnen möglicherweise viel Zeit sparen, aber stellen Sie sicher, dass Sie das generierte Skript mindestens einmal testen. – Donnie

1

Ich verwende dbdeploy seit einigen Jahren erfolgreich. Es ermöglicht Ihren Entwicklern kleine SQL-Änderungsdeltas zu erstellen, die dann auf Ihre Datenbank angewendet werden können. Die Änderungen werden von einer Changelog-Tabelle in der Datenbank verfolgt, sodass sie weiß, was zu beachten ist.

+0

+1 für dbdeploy. Ich benutze es auch - einfach, aber effektiv - und es ist großartig, wenn das Schema in der Quellcodeverwaltung geändert wird. – Tom

2

ein Werkzeug Verwenden Sie ein diff-Skript zu erstellen und während eines Wartungsfenster ausgeführt. Ich benutze dafür RedGate SQL Compare und bin sehr zufrieden damit.

+0

+1 für Red-Gate-Tools - ausgezeichnete Sachen! –

+0

Aber verwenden Sie sorgfältig, möglicherweise gibt es Objekte, die Sie in dieser Version nicht verschieben möchten. Möglicherweise müssen Sie auch die Reihenfolge der Änderungsskripte anpassen. – HLGEM

Verwandte Themen