Sichere Fixierung von Produktionsdatenbankdaten


23

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 ...

  1. Wir müssen protokollieren, wer die Abfrage ausgeführt hat und was sie ausgeführt hat
  2. 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
  3. 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
  4. 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?


26
Lassen Sie das Management niemals annehmen, dass dies die Standardarbeitsanweisung ist. Dies ist eine Notfalloperation am offenen Herzen ohne Masken oder Handschuhe, KEINE normale Art, mit Fehlern umzugehen, die beim Testen hätten entdeckt werden müssen.
Dan Pichelman

2
Weil Sie auf diese Weise arbeiten möchten, sind die Fehler an erster Stelle aufgetreten.
Reactgular

7
@MathewFoscarini Dieser Kommentar fügt der Konversation nichts hinzu und klärt auch nichts. Es ist auch falsch, dass ich nie gesagt habe, dass ich möchte, dass die Dinge so funktionieren, nur dass wir einige Überlegungen haben, die stattfinden müssen. Einige der folgenden Antworten sprechen alle meine Punkte gut an.
Andrew White

1
@ AndrewWhite ich entschuldige mich Andrew war kein Vergehen beabsichtigt.
Reactgular

Antworten:


52

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.


21
@ Andrew, das ist keine Entschuldigung: Vergiss eine WHEREund deine Datenbank wird für den Rest des Tages nicht verfügbar sein . Oder woche.
CodeCaster

9
@AndrewWhite Sie haben nach dem sichersten Weg gefragt , die Daten zu reparieren, nicht nach dem schnellsten . :-)
Eric King

9
@ AndrewWhite - Sie haben bereits ein Problem. Wenn Sie die Korrektur beschleunigen, werden Sie ZWEI Probleme haben, wenn nicht mehr, und / oder Sie könnten die Probleme SCHLECHTER anstatt besser machen.
Michael Kohne

6
@ AndrewWhite - ehrlich gesagt, wäre es für mich ein Plus, wenn es ein nicht trivialer Prozess wäre. Jeder wird sich der Kosten und des Risikos bewusst sein, im Gegensatz zu der "gut, wir haben es schon 23 Mal ohne Probleme gemacht" -Blase, die ich an einer Reihe von Orten gesehen habe.
DaveE

3
@EricKing: xkcd.com/349
Robin

20

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:

  1. 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.

  2. Alle Entwickler, die möglicherweise den Fehler in der Anwendung beheben könnten, sind nicht erreichbar.

  3. Das Unternehmen verliert derzeit Tausende von Dollar pro Stunde (sagen wir mal 6000 Dollar, was 100 Dollar pro Minute bedeutet).

  4. Der Fehler betrifft mehrere Tabellen, von denen eine sehr umfangreich ist, und betrifft nur die Daten selbst, nicht das Schema.

  5. Um den Fehler zu umgehen, sollten Sie ein wenig mit den Daten experimentieren, indem Sie sie entfernen und ändern.

  6. Die Datenbank ist groß und es würde drei Stunden dauern, bis das Backup erstellt oder wiederhergestellt ist.

  7. 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.

  8. Datenbanksicherungen werden als zuverlässig vorausgesetzt. sie wurden streng getestet, einschließlich vor kurzem,

  9. Der Verlust von 14 Stunden Daten ist nicht akzeptabel, aber der Verlust von ein bis zwei Stunden Daten

  10. 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,

  11. Die Datenbank ist Microsoft SQL Server 2008 Enterprise.

Die saubere Art Dinge zu tun ist:

  1. Wiederherstellen der Sicherung in der Staging-Umgebung

  2. Experimentiere dort,

  3. Überprüfen Sie das endgültige Skript zweimal,

  4. 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:

  1. 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.)

  2. 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.


2
Und machen Sie Ihre Arbeit nach Möglichkeit außerhalb der Geschäftszeiten - wenn die tatsächliche Kundenaktivität minimal ist
Dan Pichelman

3
Selbst wenn Ihre Datenbank groß ist und das Sichern viel Zeit in Anspruch nimmt, können Sie wahrscheinlich nur einen Teil dieser Daten nehmen und damit experimentieren.
Radu Murzea

3
Ein upvote für deine Bearbeitung, aber: wenn die Daten , dass von entscheidender Bedeutung und kostspielig für das Unternehmen ist es absolut idiotisch , dass die betrieblichen Abläufe in einem solchen äußerst schlechten Zustand sind. Keine zuverlässigen Backups, keine Umgebung, die die Produktionsumgebung minimiert und das Experimentieren mit Live-Daten erfordert: Ich würde definitiv nicht in einem so stressigen und unprofessionellen Unternehmen arbeiten wollen.
CodeCaster

3
@CodeCaster: Es ist traurig, aber ich sehe das oft in der Praxis, auch in großen Unternehmen.
Arseni Mourzenko

3
Höchstwahrscheinlich geriet das Unternehmen gerade deshalb in eine schwierige Lage, weil sie den Ratschlägen in Marjans Posten nicht gefolgt waren, als sie eine Chance hatten.
Eric King

4

Sichere Fixierung von Produktionsdatenbankdaten. Was ist der sicherste Weg, dies vom Standpunkt eines großen Unternehmens aus zu tun? Gibt es Tools, die helfen können?

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:


2

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.


Oh, und natürlich, wenn immer möglich, analysieren Sie den Code in der Anwendung, um sicherzustellen, dass alle in der Logik verborgenen abhängigen Aktualisierungen berücksichtigt werden. Und wenn die Möglichkeit besteht, dass Trigger in den Tabellen, die Sie aktualisieren, nach ihnen suchen und darüber nachdenken ob sie deaktiviert werden müssen oder nicht.
Wayne M

2

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.


0

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!


0

Betreff: MainMa's Antwort ...

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.

  • Woher weißt du, dass es ein "Bug" ist? Die Daten stimmen nicht mit den vom Software-Produktentwickler festgelegten Regeln überein.

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).

  • Anscheinend ist ein Verlust von 100 US-Dollar pro Minute für die Unternehmensleitung nicht wichtig genug, um zu ermitteln und sicherzustellen, dass kompetente Entwickler zurückkehren, um ihren Fehler zu beheben und Ihnen bei der Wiederherstellung der Datenbank zu helfen.

Der Fehler betrifft mehrere Tabellen, von denen eine sehr umfangreich ist, und betrifft nur die Daten selbst, nicht das Schema.

  • Alle Datenbankprobleme "betreffen" das Schema. Wie das Schema aufgebaut ist, bestimmt, wie Sie dieses Problem lösen.

Um den Fehler zu umgehen, sollten Sie ein wenig mit den Daten experimentieren, indem Sie sie entfernen und ändern.

  • Dafür ist Ihre Staging-Datenbank gedacht. Möglicherweise müssen Sie es mit "beschädigten" Daten aus der Produktionsdatenbank neu füllen, nachdem Sie eine vollständige Online-Sicherung der Produktion erstellt haben.

Die Datenbank ist groß und es würde drei Stunden dauern, bis das Backup erstellt oder wiederhergestellt ist.

  • Dann sollten Sie sofort loslegen, damit es ausgeführt werden kann, während Sie das Problem analysieren, Ihre Korrektur-Skripte entwickeln, testen und zusammen mit den Entwicklern und anderen DBAs, die Ihnen helfen, verfeinern.

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.

  • Sie haben nicht mindestens tägliche vollständige Online-Backups? Du bist beschissen. Aber du bist wahrscheinlich daran gewöhnt. Gut, dass das oben gestartete vollständige Backup ausgeführt wird. Stellen Sie sicher, dass das Management jede Minute die Kosten protokolliert, die mit täglichen Online-Backups hätten vermieden werden können.

Datenbanksicherungen werden als zuverlässig vorausgesetzt. sie wurden streng getestet, einschließlich vor kurzem,

  • Ausgezeichnet! In diesem Fall müssen Sie die Datenbank möglicherweise nicht mehr als einmal wiederherstellen.

Der Verlust von 14 Stunden Daten ist nicht akzeptabel, aber der Verlust von ein bis zwei Stunden Daten

  • In dem von Ihnen beschriebenen Szenario sind alle Wetten deaktiviert. Dies ist eine "Information Disaster Management" Situation. Eine gute Sache für das Management ist es, die Kosten zu dokumentieren, die in Zukunft durch schnellere Sicherungs- und Wiederherstellungsverfahren und -ressourcen vermieden werden könnten.

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,

  • Wenn Ihr Backup-System Online-Backups unterstützt (dh die Datenbank ist während des Backups voll funktionsfähig), können Sie den Extrakt ausführen, um die Staging-Datenbank gleichzeitig neu zu füllen, wenn Sie über ausreichende Hardwareressourcen verfügen, um eine Verlangsamung des Backups zu vermeiden.

Die Datenbank ist Microsoft SQL Server 2008 Enterprise.

  • Das alles ist schwerer, aber nicht unmöglich. Viel Glück!
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.