Was ist Ihre erste Möglichkeit, mit einer Live-Datenbank vorsichtig zu sein? [geschlossen]


80

Für meinen Kunden arbeite ich gelegentlich in seiner Live-Datenbank, um ein Problem zu beheben, das er selbst erstellt hat, oder um fehlerhafte Daten zu beheben, die durch die Fehler meines Produkts verursacht wurden. Ähnlich wie beim Unix-Root-Zugriff ist es nur gefährlich. Welche Lektionen sollte ich vorher lernen?

Was ist die Nummer 1, die Sie tun, um vorsichtig mit Live-Daten umzugehen?

Antworten:


101

Drei Dinge, die ich im Laufe der Jahre auf die harte Tour gelernt habe ...

Wenn Sie Live-Daten aktualisieren oder löschen, schreiben Sie zunächst eine SELECT-Abfrage mit der WHERE-Klausel, die Sie verwenden. Stellen Sie sicher, dass es funktioniert. Stellen Sie sicher, dass es korrekt ist. Stellen Sie dann die Anweisung UPDATE / DELETE der bekannten funktionierenden WHERE-Klausel voran.

Das willst du nie haben

DELETE FROM Customers

Sie sitzen in Ihrem Abfrageanalysator und warten darauf, dass Sie die WHERE-Klausel schreiben. Drücken Sie versehentlich auf "Ausführen", und Sie haben gerade Ihre Kundentabelle getötet. Hoppla.

Erfahren Sie außerdem, wie Sie je nach Plattform schnell und einfach eine Tabelle sichern können. In SQL Server 2005

SELECT *
INTO CustomerBackup200810032034
FROM Customer

kopiert jede Zeile aus der gesamten Kundentabelle in eine neue Tabelle mit dem Namen CustomerBackup200810032034, die Sie dann löschen können, sobald Sie Ihre Aktualisierungen vorgenommen und sichergestellt haben, dass alles in Ordnung ist. Im schlimmsten Fall ist es viel einfacher, fehlende Daten aus dieser Tabelle wiederherzustellen, als zu versuchen, das Backup der letzten Nacht von Festplatte oder Band wiederherzustellen.

Seien Sie schließlich vorsichtig bei Kaskadenlöschungen, um Dinge zu entfernen, die Sie nicht löschen wollten. Überprüfen Sie die Beziehungen und wichtigsten Einschränkungen Ihrer Tabellen, bevor Sie Änderungen vornehmen.


1
meinst du nicht LÖSCHEN VON Kunden, die nur technisch sind :-)
craigmoliver

5
Oder noch besser, verwenden Sie keine Kaskadierung.
dkretz

108
BEGIN TRANSACTION;

Auf diese Weise können Sie nach einem Fehler einen Rollback durchführen.


Ja, so ziemlich der einzige Weg, um den Wahnsinn von Gesichtspalmen zu verhindern.
Willasaywhat

11
@Graeme, Sie sollten DDL nicht für Produktionsdatenbanken ausführen. Sie sollten ein Skript schreiben, es in Ihrer Testdatenbank ausführen. Nachdem Ihre Testdatenbank die Qualitätssicherung bestanden hat, sollten Sie es auf dem Produktionsserver ausführen.
Paul Tomblin

1
@ Paul: absolut. Es könnte jedoch argumentiert werden, dass Sie dasselbe mit jeder Art von Änderung an Ihrer Produktionsdatenbank tun sollten, egal ob DDL oder DML. In diesem Fall ist diese ganze Frage bedeutungslos.
Graeme Perrow

3
Eduardo, es hat bisher 45 Stimmen erhalten, weil - meistens - Ihr kaltes Schwitzen beginnt, bevor sich Ihr Finger vollständig auf der Tastatur nach unten bewegt hat - aber einfach zu spät, um den Finger anzuhalten.
Euro Micelli

1
Dies ist auch insofern nützlich, als Sie eine Reihe von Auswahlen innerhalb derselben Transaktion ausführen können, um die Ergebnisse zu überprüfen, bevor Sie einen Commit durchführen. Wenn diese unerwartet sind, wird kein Schaden angerichtet.
Dave Cluderay

50

Machen Sie zuerst ein Backup: Es sollte sowieso das Gesetz Nummer 1 der Systemadministration sein

BEARBEITEN : Wenn Sie berücksichtigen, was andere gesagt haben, stellen Sie sicher, dass Ihre UPDATES die entsprechenden WHERE-Klauseln enthalten.

Im Idealfall sollte eine Live-Datenbank niemals geändert werden (über INSERTs und grundlegende Wartung hinaus). Das Ändern der Struktur der Live-DB ist besonders mit potenziell schlechtem Karma behaftet.


25

Nehmen Sie Ihre Änderungen an einer Kopie vor. Wenn Sie zufrieden sind, wenden Sie den Fix auf live an.


In den meisten Fällen unterscheidet sich copy db von live und nicht alle Änderungen sind gleich wie copy and live.
BugBurger

Wenn sich die Kopierdatenbank von der Live-Datenbank unterscheidet, heißt das nicht, dass es sich tatsächlich nicht um eine Kopierdatenbank handelt? Der gesamte Zweck einer Test- / QA- / Kopierdatenbank besteht darin, Änderungen zu testen, bevor sie auf eine Live- / Produktionsdatenbank angewendet werden.
Wilco

22

Oft schreibe ich, bevor ich ein UPDATE oder DELETE mache, das entsprechende SELECT.


Zur schnellen und einfachen Überprüfung mag ich auch diese Methode. Abhängig von der Anzahl der Ergebnisse funktioniert es möglicherweise nicht, aber es ist zumindest ein Anfang für UPDATES und DELETES.
osp70

18

Führen Sie NIEMALS ein Update durch, es sei denn, Sie befinden sich in einem BEGIN TRAN t1 - nicht in einer Entwicklungsdatenbank, nicht in der Produktion, nirgendwo. Führen Sie NIEMALS einen COMMIT TRAN t1 außerhalb eines Kommentars aus - geben Sie immer ein

--COMMIT TRAN t1

und wählen Sie dann die Anweisung aus, um sie auszuführen. (Dies gilt natürlich nur für GUI-Abfrage-Clients.) Wenn Sie diese Dinge tun, wird es zur zweiten Natur, sie zu tun, und Sie werden kaum Zeit verlieren.

Ich habe tatsächlich ein "Update" -Makro, das dies eingibt. Ich füge dies immer ein, um meine Updates einzurichten. Sie können eine ähnliche für Löschvorgänge und Einfügungen erstellen.

begin tran t1
update 
set 
where 
rollback tran t1
--commit tran t1

Ja, genau das mache ich. Zu viele Leute sagen "Vergiss die where-Klausel nicht", aber was ist, wenn es falsch ist? Aktualisieren Sie niemals eine Live-Datenbank ohne dieses Muster begin / rollback / - commit.
Eric Z Beard

Eine zusätzliche Verbesserung besteht darin, zuerst mit der where-Klausel ein "select * from" durchzuführen, um sicherzustellen, dass es richtig ist, und dann das Update mit derselben where-Klausel auszuführen.
Eric Z Beard

Eric hat recht, obwohl ich dies aus meinem Makro herauslasse, um ein Kriechen des Oszilloskops zu vermeiden. Ich habe ein anderes Makro, das "select * from" für den allgemeinen Gebrauch eingibt.
Patrick Szalapski

Es gibt keinen guten Grund, es nicht so zu machen. Wenn ich bei einem früheren Job Aktualisierungsskripte schreiben musste, habe ich dies auf diese Weise getan, zusammen mit einem SELECT vor dem Update und einem SELECT nach dem Update , damit ich die Ergebnisse sehen konnte. Nachdem ich es mehrmals ausgeführt und festgestellt hatte, dass die Ergebnisse korrekt waren, änderte ich das ROLLBACK in COMMIT.
Ryan Lundy

13

Stellen Sie immer sicher, dass Ihre UPDATEs und DELETEs die richtige WHERE-Klausel haben.


Ja, ich habe mich schon einmal verbrannt.
Ian Jacobs

Ich auch. Seitdem habe ich mir gewünscht, dass SQL so konzipiert wurde, dass die where-Klausel an erster Stelle steht.
Greg Hewgill

Ich muss dieses sinkende Gefühl lieben, wenn ich ein schnelles UPDATE durchführe und es heißt "1279209394 Datensatz (e) betroffen". Oh, oh. ;)
Kevin Fairchild

13

Um meine eigene Frage zu beantworten:

Wenn Sie eine Update-Anweisung schreiben, schreiben Sie sie nicht in der richtigen Reihenfolge.

  1. Schreiben UPDATE [table-name]
  2. Schreiben WHERE [conditions]
  3. Geh zurück und schreibe SET [columns-and-values]

Die Auswahl der Zeilen, die Sie aktualisieren möchten, bevor Sie angeben, welche Werte Sie ändern möchten, ist viel sicherer als die Auswahl in der anderen Reihenfolge. Es macht es unmöglich fürupdate person set email = 'bob@bob.com' , in Ihrem Abfragefenster zu sitzen und bereit zu sein, von einem falsch platzierten Tastenanschlag ausgeführt zu werden, und bereit zu sein, jede Zeile in der Tabelle durcheinander zu bringen.

Bearbeiten: Wie andere gesagt haben, schreiben Sie die WHEREKlausel für Ihre Löschungen, bevor Sie schreiben DELETE.


11

Als Beispiel erstelle ich SQL wie folgt

--Update P Set
--Select ID, Name as OldName, 
    Name='Jones'
From Person P
Where ID = 1000

Ich hebe den Text vom Ende bis zur Auswahl hervor und führe diese SQL aus. Sobald ich überprüft habe, ob der Datensatz, den ich aktualisieren möchte, abgerufen wird, drücke ich auf Umschalttaste, um die Update-Anweisung hervorzuheben und auszuführen.

Beachten Sie, dass ich einen Alias ​​verwendet habe. Ich aktualisiere niemals eine explizite Tabellenname. Ich benutze immer einen Alias.

Wenn ich dies in Verbindung mit Transaktionen und Rollback / Commits mache, bin ich wirklich sehr, sehr sicher.


Ich verwende auch eine Auswahlprüfung - ich habe auf diese Weise mehrere where-Klauselfehler festgestellt. Es ist eine gute Überprüfung der geistigen Gesundheit, insbesondere wenn die Aussagen komplex sind.
Bob Probst

Diese Methode wurde über einen kurzen Zeitraum verbessert, nachdem mein Vorgesetzter mitten am Tag eine wichtige Tabelle in der Produktion gelöscht hatte.
wcm

Ich wechsle die Auswahl und aktualisiere und entferne die Kommentare zur Auswahl. Wenn ich fertig bin, markiere ich den Bereich und renne. Funktioniert auch zum Löschen.
Ball

11

Meine erste Möglichkeit, mit einer Live-Datenbank vorsichtig zu sein? Fass es nicht an. :) :)

Backups können Schäden, die Sie der Datenbank zufügen, rückgängig machen. In dieser Zeit treten jedoch wahrscheinlich immer noch negative Nebenwirkungen auf.

Egal, wie solide Sie das Skript finden, mit dem Sie arbeiten, führen Sie es durch einen Testzyklus. Auch wenn ein "Testzyklus" bedeutet, dass das Skript für Ihre eigene Instanz der Datenbank ausgeführt wird, stellen Sie sicher, dass Sie dies tun. Es ist viel besser, Fehler in Ihre lokale Box einzuführen als in eine Produktionsumgebung.


6
  1. Überprüfen, überprüfen und überprüfen Sie alle Anweisungen, die Aktualisierungen durchführen. Selbst wenn Sie glauben, dass Sie nur ein einfaches, einspaltiges Update durchführen, werden Sie früher oder später nicht genug Kaffee trinken und eine 'where'-Klausel vergessen, die eine ganze Tabelle zerstört.

Ein paar andere Dinge, die ich hilfreich fand:

  • Wenn Sie MySQL verwenden, aktivieren Sie sichere Updates

  • Wenn Sie einen DBA haben, bitten Sie ihn, dies zu tun.

Ich habe festgestellt, dass diese drei Dinge mich davon abgehalten haben, ernsthaften Schaden anzurichten.


Ja, klassisch: UPDATE TABLE_NAME SET FIELD_X = 'was auch immer' [WO = fehlt]
Stefan Steiger

6
  • Niemand will Unterstützung, aber jeder schreit nach Genesung
  • Erstellen Sie Ihre Datenbank mit Fremdschlüsselreferenzen, da Sie:
  • Machen Sie es sich so schwer wie möglich, Daten zu aktualisieren / löschen und damit die strukturelle Integrität / etwas anderes zu zerstören
  • Führen Sie nach Möglichkeit ein System aus, auf dem Sie die Änderungen festschreiben müssen, bevor Sie sie dauerhaft speichern (dh die automatische Festschreibung während der Reparatur der Datenbank deaktivieren).
  • Versuchen Sie, die Klassen Ihres Problems zu identifizieren, damit Sie verstehen, wie Sie diese problemlos beheben können
  • Holen Sie sich eine Routine zum Abspielen von Backups in eine Datenbank. Halten Sie immer eine zweite Datenbank auf einem Testserver bereit, damit Sie einfach daran arbeiten können
  • Denn denken Sie daran: Wenn etwas völlig ausfällt, müssen Sie so schnell wie möglich wieder einsatzbereit sein

Nun, das ist ungefähr alles, woran ich jetzt denken kann. Nehmen Sie die kühnen Passagen und Sie sehen, was für mich die Nummer 1 ist. ;-);


Ich möchte nur die Erwähnung von Autocommit ergänzen, da dies ein wichtiger Sicherheitsmechanismus ist. Wenn Sie eine direkte Verbindung zur Datenbank herstellen, können Sie die automatische Festschreibung in den Datenbankverbindungsparametern normalerweise deaktivieren. Andernfalls (DB-Front-End-Produkt) müssen Sie möglicherweise nach einer Anwendungseinstellung suchen.
Mike Monette

3

Vielleicht sollten Sie überhaupt keine Löschvorgänge oder Löschvorgänge verwenden. Oder reduzieren Sie die Benutzerberechtigungen, sodass nur ein spezieller DB-Benutzer Dinge löschen / löschen kann.


3

Wenn Sie Oracle oder eine andere Datenbank verwenden, die dies unterstützt, überprüfen Sie Ihre Änderungen, bevor Sie ein COMMIT ausführen.


Sie müssen vorsichtig sein, da die Datensätze möglicherweise gesperrt sind, während Ihre Transaktion aussteht.
Greg Ogle

Normalerweise verwende ich SQL Developer für Oracle und es wird auch nach der Ausführung nie automatisch festgeschrieben. Wir haben also eine Vorschau und legen dann fest. Coole Funktion !!
Lakshminb7

3

Daten sollten immer live bereitgestellt werden, und zwar über Skripte, die so oft einstudiert werden können, wie es erforderlich ist, um sie auf dev richtig zu machen. Wenn abhängige Daten für das Skript auf dev korrekt ausgeführt werden müssen, stellen Sie sie entsprechend bereit. Sie können diesen Schritt nicht ausführen, wenn Sie wirklich vorsichtig sein möchten.




2

Um das, was @ Wayne gesagt hat, zu ergänzen , schreiben Sie Ihren WHEREvor dem Tabellennamen in eine DELETEoder- UPDATEAnweisung.


2

SICHERN SIE IHRE DATEN. Ich habe gelernt, dass man auf die harte Tour regelmäßig mit Kundendatenbanken arbeitet.



2

Meine Regel (als App-Entwickler): Fass es nicht an! Dafür sind die ausgebildeten Datenbankadministratoren da. Ich möchte nicht einmal die Erlaubnis, es zu berühren. :) :)


2

Unterschiedliche Farben pro Umgebung: Wir haben unseren PL \ SQL-Entwickler (IDE für Oracle) so eingerichtet, dass bei der Anmeldung bei der Produktionsdatenbank alle Fenster hellrot sind. Einige haben sogar eine andere Farbe für Entwickler und Tests zugewiesen.



1

Testen Sie Fragen, die über die Auswahl hinausgehen, immer zuerst auf Entwicklungsdaten, um sicherzustellen, dass sie die richtigen Auswirkungen haben.


1
  1. Wenn möglich, bitten Sie um eine Paarung mit jemandem
  2. Zählen Sie immer bis 3, bevor Sie die Eingabetaste drücken (wenn Sie alleine sind, wird dies Ihren Partner wütend machen!)

1

Wenn ich eine Datenbank mit einem Skript aktualisiere, stelle ich immer sicher, dass ich am Anfang meines Skripts einen oder zwei Haltepunkte setze, nur für den Fall, dass ich versehentlich auf Ausführen / Ausführen stoße.


1

Ich werde die Empfehlungen zu BEGIN TRAN vor Ihrem UPDATE ergänzen. Vergessen Sie jedoch nicht, das COMMIT tatsächlich durchzuführen. Sie können genauso viel Schaden anrichten, wenn Sie Ihre nicht festgeschriebene Transaktion offen lassen. Lassen Sie sich nicht von Telefonen, Kollegen, Mittagessen usw. ablenken, wenn Sie sich mitten in Updates befinden. Andernfalls werden Sie feststellen, dass alle anderen Personen gesperrt sind, bis Sie COMMIT oder ROLLBACK ausführen.


1

Ich kommentiere immer destruktive Abfragen (Einfügen, Aktualisieren, Löschen, Löschen, Ändern), wenn ich Ad-hoc-Abfragen in Query Analyzer schreibe. Auf diese Weise können Sie sie nur ausführen, indem Sie sie markieren, ohne den kommentierten Teil auszuwählen, und F5 drücken.

Ich denke auch, dass es eine gute Idee ist, wie bereits erwähnt, zuerst Ihre where-Anweisung mit einer Auswahl zu schreiben und sicherzustellen, dass Sie die richtigen Daten ändern.


1
  1. Sichern Sie immer, bevor Sie wechseln.
  2. Mach Mods (zB ALTER TABLE) immer über ein Skript.
  3. Ändern Sie Daten (z. B. LÖSCHEN) immer über eine gespeicherte Prozedur.

1

Erstellen Sie einen schreibgeschützten Benutzer (oder lassen Sie den DBA dies tun) und verwenden Sie diesen Benutzer nur, um die Datenbank anzuzeigen. Fügen Sie dem Schema die entsprechenden Berechtigungen hinzu, damit Sie den Inhalt gespeicherter Prozeduren / Ansichten / Trigger / etc. Anzeigen können. aber nicht die Fähigkeit haben, sie zu ändern.

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.