Fehler treten auf und manchmal müssen Daten in der Produktion behoben werden. Was ist der sicherste Weg, dies vom Standpunkt eines großen Unternehmens aus zu tun? Gibt es Tools, die helfen können? Hier sind einige Überlegungen, die diese Anforderung antreiben ...
- Wir müssen protokollieren, wer die Abfrage ausgeführt hat und was sie ausgeführt hat
- Idealerweise müssen wir der Person Zugriff gewähren, um nur Abfragen für die gewünschten Tabellen und nur für kurze Zeit auszuführen
- Was auch immer ausgeführt wird, die Abfragen müssen einige Details haben, damit SQL ohne ausdrückliche Erlaubnis nicht lange ausgeführt und gesperrt werden kann
- Dieser Prozess muss DB-unabhängig sein oder zumindest DB2, Oracle und SQL Server verstehen.
Wir bemühen uns, das Risiko von Ad-hoc-Abfragen zur Fehlerbehebung zu verringern, indem wir das "Falsche" tun, und dem Prozess gleichzeitig etwas Sicherheit / Audits hinzuzufügen. Gedanken oder Ideen?
Antworten:
Aktualisieren Sie Produktionsdatenbanken niemals manuell.
Skripte schreiben.
Überprüfen Sie sie dreimal und lassen Sie das von mehreren Personen tun, nicht nur von einer einzigen Person, die es dreimal tut.
Fügen Sie in diese Skripten Überprüfungsabfragen nach der Änderung ein.
Wenn es die Situation zulässt, testen Sie die gesamte Änderung innerhalb einer Transaktion, die am Ende zurückgesetzt wird, nachdem die Validierung nach der Änderung ausgeführt wurde. Wenn Sie mit den Ergebnissen zufrieden sind, ändern Sie das Rollback in ein Commit.
Testen Sie diese Skripte ad nauseam mit einer Testdatenbank.
Erstellen Sie eine Sicherungskopie, bevor Sie das Skript für die Produktionsdatenbank ausführen.
Führen Sie die Skripte aus.
Überprüfen, validieren und verdreifachen Sie die geänderten Daten mithilfe der Post-Change-Validierungsskripte.
Machen Sie trotzdem eine Sichtprüfung.
Wenn etwas nicht funktioniert, ziehen Sie sich zurück und stellen Sie die Sicherung wieder her.
Fahren Sie erst mit den geänderten Daten als Produktionsdaten fort, wenn Sie absolut sicher sind, dass alles in Ordnung ist und Sie sich von den beteiligten (Geschäfts-) Managern abgemeldet haben.
quelle
WHERE
und deine Datenbank wird für den Rest des Tages nicht verfügbar sein . Oder woche.Die Antwort von Marjan Venema ist technisch gültig und sollte nach Möglichkeit befolgt werden. Ach, Marjan Antworten aus der Sicht eines Theoretiker oder ein puristisches Datenbankadministrator , der gerne Dinge sauber machen. In der Praxis machen es geschäftliche Zwänge manchmal unmöglich, Dinge auf saubere Weise zu erledigen.
Stellen Sie sich folgenden Fall vor:
Es gibt einen Fehler im Softwareprodukt, der dazu führt, dass es nicht mehr funktioniert, wenn es erkennt, was es für eine Dateninkonsistenz in der Datenbank hält.
Alle Entwickler, die möglicherweise den Fehler in der Anwendung beheben könnten, sind nicht erreichbar.
Das Unternehmen verliert derzeit Tausende von Dollar pro Stunde (sagen wir mal 6000 Dollar, was 100 Dollar pro Minute bedeutet).
Der Fehler betrifft mehrere Tabellen, von denen eine sehr umfangreich ist, und betrifft nur die Daten selbst, nicht das Schema.
Um den Fehler zu umgehen, sollten Sie ein wenig mit den Daten experimentieren, indem Sie sie entfernen und ändern.
Die Datenbank ist groß und es würde drei Stunden dauern, bis das Backup erstellt oder wiederhergestellt ist.
Das letzte vollständige Backup wurde vor drei Wochen erstellt. Es gibt auch tägliche inkrementelle Sicherungen. Die letzte tägliche inkrementelle Sicherung wurde vor 14 Stunden durchgeführt.
Datenbanksicherungen werden als zuverlässig vorausgesetzt. sie wurden streng getestet, einschließlich vor kurzem,
Der Verlust von 14 Stunden Daten ist nicht akzeptabel, aber der Verlust von ein bis zwei Stunden Daten
Die Staging-Umgebung wurde zuletzt vor sechs Monaten verwendet. es scheint nicht auf dem neuesten Stand zu sein, und es kann Stunden dauern, es einzurichten,
Die Datenbank ist Microsoft SQL Server 2008 Enterprise.
Die saubere Art Dinge zu tun ist:
Wiederherstellen der Sicherung in der Staging-Umgebung
Experimentiere dort,
Überprüfen Sie das endgültige Skript zweimal,
Führen Sie das Skript auf dem Produktionsserver aus.
Nur der erste Schritt kostet Ihr Unternehmen 18.000 US-Dollar. Das Risiko ist ziemlich gering, wenn Sie den dritten Schritt fehlerfrei ausführen. Da Sie jedoch unter extremem Druck arbeiten, ist das Risiko viel höher. Möglicherweise haben Sie ein Skript, das beim Staging einwandfrei funktioniert hat, und dann die Produktionsdatenbank durcheinander gebracht.
Stattdessen hättest du das so machen können:
Erstellen Sie einen Snapshot (Microsoft SQL Server unterstützt dies und es dauert Sekunden, um einen Snapshot einer Datenbank wiederherzustellen (und nichts, um ihn zu erstellen). Die Sicherung dauert eine Stunde. Ich stelle mir vor, dass andere Datenbankprodukte auch Snapshots unterstützen.)
Experimentieren Sie direkt in der Produktionsdatenbank und greifen Sie auf den Schnappschuss zurück, wenn etwas schief geht.
Während ein Purist die Datenbank auf saubere Weise reparieren würde und angesichts des Zeitdrucks und der Verschwendung von mehr als 20.000 US-Dollar seines Unternehmens immer noch die Gefahr besteht, Fehler zu machen, wird ein Datenbankadministrator, der geschäftliche Einschränkungen berücksichtigt, die Datenbank auf eine Art und Weise reparieren Dies minimiert die Risiken (dank Schnappschüssen), während Sie dies schnell tun.
Fazit
Ich bin selbst Purist und ich hasse es, Dinge auf eine unsaubere Art und Weise zu tun. Als Entwickler überarbeite ich den Code, den ich ändere, ich kommentiere die schwierigen Teile, die nicht überarbeitet werden konnten, ich teste die Codebasis und ich überprüfe den Code. Aber ich berücksichtige auch die Umstände, unter denen Sie entweder die Dinge sauber erledigen und am nächsten Tag entlassen werden, oder Sie minimieren sowohl die Risiken als auch die finanziellen Auswirkungen, indem Sie einen schnellen Hack ausführen, der funktioniert.
Wenn ein IT- Mitarbeiter Dinge nur aus Gründen der Sauberkeit sauber erledigen möchte, während dies dem Unternehmen Tausende von Dollar an Verlust einbringt , hat dieser IT-Mitarbeiter ein tiefes Missverständnis seiner Arbeit.
quelle
Es ist eine schlechte Praxis und ein Einladungstor für weitere Datenprobleme und -probleme. Es gibt sogar einen Satz, der diesen Ansatz als " schnell und schmutzig " beschreibt.
Das Fortführen von Fixes / Updates direkt auf einem Produktionsserver ist sehr gefährlich , da es Sie / Ihr Unternehmen ein Vermögen kostet ( Gerichtsverfahren, schlechte / schmutzige Daten, verlorene Geschäfte usw. ).
Es werden jedoch Fehler vorhanden sein, die behoben werden müssen. Der de-facto- Industriestandard besteht darin, Patches / (Bereitstellungsskripte) in einer Staging -Umgebung (Vorproduktionsumgebung mit der neuesten Kopie der Produktdatenbank) anzuwenden und Datenanalysten / QS zu überlassen, um den Fix zu überprüfen. Dasselbe Skript sollte versionskontrolliert und auf die Prod-Umgebung angewendet werden, um Probleme zu vermeiden.
Es gibt eine Reihe von bewährten Methoden, die in diesen bewährten Methoden für Post- Staging-Datenbanken erwähnt werden
Gute Referenzen zu suchen sind:
quelle
In den meisten Organisationen habe ich daran gearbeitet, Daten in der Live-Umgebung zu aktualisieren. Dies wurde immer von einer kleinen Gruppe von Personen durchgeführt, die über die entsprechenden Zugriffsrechte verfügten, normalerweise mit einer Berufsbezeichnung wie DBA. Da Aktualisierungen nur von wenigen Personen durchgeführt werden können, besteht zumindest die Möglichkeit, dass sie sich mit den Daten vertraut machen und das Risiko von Problemen verringern (aber nicht beseitigen).
Die Person, die das Aktualisierungsskript schreibt, würde dies im Test (wie in anderen Antworten angegeben) tun und von Nicht-Technikern (denen, die das System kennen, sowie von jemandem mit hoher Autorität) eine ernsthafte Bestätigung erhalten, dass die Funktionen in "wieder richtig" zu sein scheinen Neben ihren eigenen paranoiden Tests. Die Skripte und die Daten werden vor dem Start in der Produktion von einem anderen Techniker (häufig die von mir erwähnte DBA-Rolle) unabhängig überprüft. Die Ergebnisse werden mit den erwarteten Werten verglichen (eindeutig für jedes Szenario, aber häufig auch mit Zeilenzahlen usw.).
In einem Unternehmen, für das ich gearbeitet habe, war das Erstellen von Backups keine realistische Option, aber alle zu aktualisierenden Zeilen wurden vor dem Update in eine Textdatei geschrieben, um darauf zu verweisen. Nach dem Update sollte sich jemand darauf beziehen müssen. Die Skripte und diese Daten werden in einem ordnungsgemäß organisierten Datenänderungsprotokoll gespeichert.
Jedes Unternehmen ist einzigartig, und das Risiko bei der Aktualisierung einiger Daten ist deutlich höher als bei anderen.
Wir hoffen, dass Sie durch einen Prozess, der die Leute dazu bringt, diese Updates durchzuspringen, eine Kultur fördern, die die Leute dazu bringt, dies als letzten Ausweg zu betrachten, und eine gesunde Haltung "Double Check, Triple Check" in Bezug auf dieses Zeug schaffen.
quelle
Es gibt Zeiten, in denen Sie Daten auf Prod korrigieren müssen, die auf anderen Servern nicht vorhanden sind. Dies ist nicht nur auf Fehler zurückzuführen, sondern kann auch auf den Import von Daten aus einer von einem Client gesendeten Datei zurückzuführen sein, die falsch war, oder auf ein Problem, das durch einen Hacker in Ihr System verursacht wurde. Oder aufgrund eines Problems, das durch eine fehlerhafte Dateneingabe verursacht wurde. Wenn Ihre Datenbank groß oder zeitkritisch ist, haben Sie möglicherweise nicht die Zeit, die neueste Sicherung wiederherzustellen und auf dev zu reparieren.
Ihre erste Verteidigung (und etwas, worauf keine Unternehmensdatenbank verzichten kann!) Sind Audittabellen. Sie können sie verwenden, um fehlerhafte Datenänderungen zurückzusetzen. Darüber hinaus können Sie Skripts schreiben, um Daten auf den vorherigen Status zurückzusetzen und auf anderen Servern zu testen, lange bevor Sie die überwachten Daten wiederherstellen müssen. Dann besteht das einzige Risiko darin, dass Sie die richtigen Datensätze identifiziert haben, die wiederhergestellt werden sollen.
Als Nächstes sollten alle Skripte zum Ändern von Produktionsdaten Folgendes enthalten:
Sie sollten sich in expliziten Transaktionen befinden und einen TRY-Catch-Block haben.
Sie sollten einen Testmodus haben, mit dem Sie die Änderungen rückgängig machen können, nachdem Sie gesehen haben, was sie gewesen wären. Sie sollten eine ausgewählte Anweisung von vor der Änderung und eine Ausführung nach der Änderung haben, um sicherzustellen, dass die Änderung korrekt war. Das Skript sollte sicherstellen, dass die Anzahl der verarbeiteten Zeilen angezeigt wird. Wir haben einige davon in einer Vorlage voreingestellt, die sicherstellt, dass die Teile fertig sind. Mit Vorlagen für Änderungen können Sie Zeit sparen, wenn Sie das Update schreiben.
Wenn eine große Datenmenge geändert oder aktualisiert werden muss, sollten Sie das Skript so schreiben, dass es in Stapeln mit Festschreibungen für jeden Stapel ausgeführt wird. Sie möchten nicht das gesamte System sperren, während Sie eine Million Datensätze reparieren. Wenn Sie große Datenmengen reparieren müssen, stellen Sie sicher, dass ein DBA oder eine Person, die mit der Leistungsoptimierung vertraut ist, das Skript vor dem Ausführen überprüft und wenn möglich außerhalb der Geschäftszeiten ausführt.
Als nächstes werden alle Skripte, um irgendetwas in der Produktion zu ändern, Code überprüft und in die Quellcodeverwaltung gestellt. Alle - ausnahmslos.
Schließlich sollten Entwickler diese Skripte nicht ausführen. Sie sollten von dbas oder einer Konfigurationsverwaltungsgruppe ausgeführt werden. Wenn Sie keines von beiden haben, sollten nur Leute, die technologisch führend oder höher sind, das Recht haben, Dinge auf Prod auszuführen. Je weniger Leute Dinge auf Stacheln laufen lassen, desto einfacher ist es, ein Problem aufzuspüren. Skripte sollten so geschrieben werden, dass sie einfach ausgeführt werden, keine Teile hervorheben und schrittweise ausgeführt werden. Es ist das Hervorhebungsmaterial, das Menschen oft in Schwierigkeiten bringt, wenn sie vergessen haben, die where-Klausel hervorzuheben.
quelle
Ich habe Daten in laufenden Produktionsdatenbanken oft aktualisiert. Ich stimme der obigen Antwort zu, dass dies niemals eine Standardarbeitsanweisung wäre.
Es wäre auch teuer (wir würden jedem über die Schulter schauen und vielleicht 2 oder 3 besprechen)
Und die goldene Regel: Machen Sie immer eine select-Anweisung, um zu zeigen, was getan werden würde, bevor Sie eine update / delete / insert-Anweisung ausführen
Die goldene Regel wird von den anderen beiden Personen im Team durchgesetzt!
quelle
Betreff: MainMa's Antwort ...
quelle