Dies ist eine leicht belastete Frage, da ich bereits angenommen habe, dass das beschriebene Szenario falsch ist.
Ein DBA stellt eine von mir geschriebene Anwendung bereit, die eine MS SQL Server 2008-Datenbank enthält. Er hat mich gebeten, eine Datenbanksicherung von meinem Entwicklungscomputer zu erstellen, damit er sie auf dem Produktionsserver wiederherstellen und somit bereitstellen kann. Dies ist eine Bereitstellung auf der grünen Wiese, sodass keine Daten migriert werden müssen. Ich hatte erwartet, ein DDL-Skript bereitzustellen, das ich sorgfältig getestet und sichergestellt habe, dass es alles enthält, was erforderlich ist. Wenn ich es in SSMS ausführe, wird die Datenbank mit einem Klick erstellt.
Die Verwendung der Sicherungsfunktion für die Bereitstellung scheint mir nicht richtig zu sein, aber ohne ein Experte für SQL Server zu sein, kann ich mir keinen soliden Grund vorstellen, dies nicht zu tun. Ich hätte zum Beispiel gedacht, dass die Datenbank von der Entwicklungsmaschine „kontaminiert“ wird - vielleicht der Computername, die Verzeichnisstruktur oder die dort irgendwo gespeicherten Benutzernamen. Ist dies der Fall oder ist das Sichern und Wiederherstellen einer gültigen Bereitstellungstechnik?
quelle
Antworten:
Bei der Verwendung von Sicherungsdateien als Bereitstellung ist alles falsch. Die Last für die Bereitstellung der DDL liegt jedoch nicht beim DBA, sondern bei der Entwicklung. Ihre Design- und Entwicklungsartefakte sollten Datenbankinstallations- und Upgrade-Skripte gewesen sein. Ändern Sie niemals etwas in der Datenbank manuell, alles sollte mit Ihrer App geändert werden. Rails bekommt dies mit der gesamten Migrationsinfrastruktur in den Griff, und Sie sollten versuchen, es auch zu übernehmen. Ich habe mich lange für die Verwendung ähnlicher Techniken ausgesprochen, siehe Versionskontrolle und Ihre Datenbank .
Lassen Sie mich zunächst erläutern, warum die quellcodebasierte Bereitstellung / Aktualisierung der binärbasierten Bereitstellung (.bak- oder diff-Tools) überlegen ist:
CREATE TABLE Foo (...)
, was die Absicht klar vermittelt. Wenn Sie das Objekt durch die Binärverteilung extrahieren möchten, werden Sie in einer Vielzahl von Standardeigenschaften angezeigt. Sie verlieren die ursprüngliche Absicht.Und ich habe auch Argumente, warum die Bereitstellung per Backup schlecht (sehr schlecht) ist:
quelle
Nein, es ist nichts falsch mit der Verwendung einen Backup für anfängliche Bereitstellung, in der Tat würde ich sagen , dass dies oft der sicherste Weg , es zu tun. Es gibt keine "Kontamination", die auftreten kann, es sei denn, Sie haben fest codierte Dinge wie Servernamen oder Datenbanknamen, die sich in der Produktion von denen in der Testumgebung unterscheiden.
Eine Sicherung / Wiederherstellung (ähnlich wie Ihr eigenes DDL-Skript, das auf die Datenbank beschränkt ist) bringt jedoch keine Anmeldungen auf Serverebene, Verbindungsserver, SQL Agent-Jobs usw. mit sich.
Es gibt einige andere Nebeneffekte, die Sie mit einem Backup erhalten, die Sie nicht unbedingt mit einem DDL-Skript erhalten, beispielsweise wenn Sie Ihre ursprüngliche Tabelle wie folgt erstellt haben:
Alle diese Einschränkungen haben systemgenerierte Namen, wie z
PK__foo__DE90ECFFA28BBAB8
. Wenn Sie dasselbe Skript in der Produktion ausführen, unterscheidet sich der Name, es sei denn, Sie haben die genaue Tabellendefinition in der Testumgebung geschrieben. Dies kann später zu Problemen führen, wenn Sie aus dem Test Drop / Create / Alter-Skripte generieren und diese in der Produktion ausführen müssen.Sie erhalten auch alle Daten in Nachschlagetabellen usw., wenn Sie eine Sicherung erstellen, die Sie manuell skripten müssen, um diese Daten in die Produktion zu bringen. (Sie müssen jedoch sicherstellen, dass Sie alle Testdaten löschen, die Sie auch in der Produktion nicht benötigen .)
Und eine Schwäche beim Herausschreiben selbst besteht darin, dass Sie sicherstellen müssen, dass alle Objekte in der richtigen Abhängigkeitsreihenfolge erstellt werden. Möglicherweise sind im Test Abhängigkeiten vorhanden, die in der Produktion fehlen, da die Objekte nicht in der richtigen Reihenfolge generiert wurden.
Wenn es darauf ankommt, ist ein Backup einfach sauberer. Und Sie sollten die Datenbank testen, wenn sie bereitgestellt wird, damit Sie alle "Kontaminationen" schnell finden und in beiden Umgebungen korrigieren können.
Sobald die Datenbank zum ersten Mal bereitgestellt wurde, besteht die einzige Möglichkeit, Änderungen zu einem späteren Zeitpunkt bereitzustellen, darin, sie per Skript bereitzustellen. Ich hatte großes Glück, Vergleichs- / Bereitstellungsskripte mit SQL Compare von Red-Gate zu erstellen. Während Remus absolut Recht hat, ist diese Quellcodeverwaltung die beste Lösung dafür. In Wirklichkeit speichert die Quellcodeverwaltung normalerweise ein
CREATE TABLE
Skript, das Sie nicht weit bringt, wenn Sie eine Spalte hinzugefügt und den Datentyp einer anderen Spalte geändert haben. Sie müssen noch eine Art Diff-Skript erstellen, das nur die Änderungen auf die Produktion anwendet, nicht die Tabelle löscht und neu erstellt.Wenn Sie Dinge wie lokale Nachschlagetabellen haben, die sich in anderen Datenbanken befinden oder sich auf anderen Servern befinden könnten, sollten Sie Synonyme verwenden, anstatt diese Namen in Ihrem Code fest zu codieren. Dann müssen Sie nur sicherstellen, dass die Synonyme in jeder Umgebung korrekt sind, anstatt alle drei / vier Teilenamen in allen Ihren Modulen zu finden und sie bei der Bereitstellung zu aktualisieren. Wenn Sie lokale Dateipfade haben, die sich zwischen den Umgebungen unterscheiden, verwenden Sie eine zentrale Eigenschaftentabelle, anstatt diese Pfade in Ihre Prozeduren usw. fest zu codieren.
Theoretisch könnten Sie später eine Sicherungs- und Wiederherstellungsmethode verwenden, aber das funktioniert nicht gut, wenn die Produktionsdatenbank bereits verwendet wird. Es wird schwierig, eine Datenbank aus dem Test wiederherzustellen und keine der in der Produktion gesammelten Daten zu verlieren .
quelle
Ich sage, tu es nicht. Verwenden Sie ein SQL-Skript, das aus möglichst standardmäßigen Anweisungen erstellt wurde, und notieren Sie sich, für welche SQL Server-Versionen diese Version des Skripts funktioniert hat.
Ich hatte Probleme mit Software, die über ein Backup verteilt wurde, als ich die Software zu einem viel späteren Zeitpunkt erneut installieren musste.
Aufgrund des Alters des ursprünglichen Sicherungsabbilds, das für die Bereitstellung verwendet wurde und kein neueres verfügbar war, musste ich eine alte Version von SQL Server verwenden, da die neueren Versionen von SQL Server die Sicherung im alten Format nicht unterstützten. Während ich fast alle Anwendungsupdates nacheinander anwendete, musste ich ein SQL Server-Upgrade über die alte SQL Server-Version hinaus anwenden, da für das Anwendungsupdate eine neuere SQL Server-Version erforderlich war, als ursprünglich von der alten Version erforderlich Image "Deployment Backup".
Als DBA fand ich es SEHR frustrierend, herauszufinden und dann tatsächlich die erforderlichen Schritte auszuführen. Als zusätzlichen Bonus habe ich dies während einer Disaster Recovery-Situation getan, damit ich die aktuelle Produktionsdatenbank aus dem Backup wiederherstellen konnte, da die neueste Version der Software erforderlich war, die ohne die Installation des ursprünglichen "Deployment Backup" nicht installiert werden konnte.
quelle
Ich denke, die Antwort darauf ist sowohl Ja als auch Nein. Du sagtest:
Wenn es sich um eine Erstbereitstellung handelt, besteht kein Problem darin, eine Sicherungskopie einer Entwicklungsdatenbank für die Produktion zu erstellen. Wenn Sie das sagen, müssten Sie (oder hoffentlich Ihr DBA) offensichtlich die Datenbank bereinigen und alle Sicherheitsbenutzer und andere Gubbins entfernen, die möglicherweise mit der Datenbanksicherung wiederhergestellt wurden.
Jedoch:
Als langfristige Lösung ist dies keine gute Bereitstellungstechnik, da ein Client, sobald er die Datenbank verwendet, seine Daten dort hat, sodass Sie Ihre Datenbank nicht über ihre Datenbank wiederherstellen können.
Wenn Sie also zur ersten Bereitstellung zurückkehren, ist es in Ordnung, eine Sicherung einer leeren Datenbank wiederherzustellen. An diesem Punkt beginnen Sie jedoch mit der Versionskontrolle, um Updates und zukünftige Bereitstellungen zu verwalten und so eine saubere bereitstellbare Version der Datenbank beizubehalten.
Schritte:
Alle Aktualisierungen, die Sie an der Datenbank vornehmen, werden vor der Bereitstellung lokal getestet, und beim Aktualisieren einer Clientdatenbank werden lediglich die Skripts ausgeführt, mit denen sie von einer Version in eine andere übertragen werden. Die Quellcodeverwaltung gibt Ihnen den Verlauf zwischen sauberen Versionen der Datenbank und den angewendeten Skripten an.
quelle