schuppsl 0 Geschrieben 5. August 2014 Melden Teilen Geschrieben 5. August 2014 Hallo Leute. Ich weiss, dass das hier ein MS SQL Forum ist, aber wir haben ja auch haufenweise SQL Server :) Ich wende mich an Euch, da Ihr immer sehr kompetent seid! Also: Wir haben hier auch noch eine alte IBM Informix Datenbank, welche unser altes ERP darstellt. Unsere SQL Befehle setzen nicht mit dem Management Studio ab, sondern mit einem Hilfsprogramm, welches auch hervorragend von jedem Client in der IT funktioniert. Heute habe ich auf eine Tabelle den DELETE Befehl abgesetzt und vergessen eine weitere WHERE Klausel anzugeben. Sofort habe ich die Ausführung abgebrochen. Und wie es aussieht Glück gehabt, denn wie es scheint sind keine Daten verloren gegangen. Jetzt bin ich mir aber trotzdem noch unsicher ob das sein kann und wie das Ganze abläuft. Warum ich mich nun an Euch wende, hat folgenden Hintergrund: Kann ich mir sicher sein, daß keine Daten gelöscht wurden? (Ich weiss: Nein) Doch von vorne: Die Tabelle hat ca. 850 000 Datensätze. Setze ich einen SELECT * Befehl ab, dauert es ca. zwei Minuten bis das Hilfsprogramm die Datensätze anzeigt. Setze ich einen DELETE Befehl ab, erscheint die im Programm Meldung, dass es läuft mit einem Abbrechen Button. Diesen habe ich sofort gedrückt, trotzdem lief es noch ca. zehn Sekunden weiter. Der DELETE Befehl lautete: DELETE FROM meinetabelle WHERE meinezeile <> 'test' Hier fehlt noch eine weitere, einschänkende WHERE Bedingung. Nachdem ich den Schock überwunden hatte, haben wir festgestellt, dass es von der Datenmenge her auf jeden Fall aktuell sein müsste, ich meine in 10 Sekunden werden ja schon zehntausende Datensätze gelöscht. Hat das System ein Rollback ausgeführt? Laut Entwickler des Hilfsprogrammes, wird bei Klick auf Abbrechen die Funktion cancel() ausgeführt. Einen Rollback gibt es laut ihm eher nicht. Meine Theorie ist, daß der DELETE Befehl erst alle Datensätze selektiert und dann, wenn er die Datenmenge hat auf die die WHERE Bedingung zutrifft anfängt mit dem Löschen. Laut Entwickler fängt es gleich an mit Löschen. Zum Test habe ich die Tabelle geklont und auf dem Klon denselben Befehl ausgeführt und sogleich abgebrochen. Mit COUNT(*) zähle ich nach dem Abbruch die Datensätze des Klons, welche Tatsächlich um ca. 10 000 weniger waren. Führe ich den COUNT Befehl nach ein paar Sekunden dann nochmals aus, ist die (Anzahl) Datensätze wieder vollständig! Also wird doch irgendwo ein Rollback ausgeführt??? Oder wird das Ergebnis zuerst irgendwo zwischengespeichert? Kann sich das jemand erklären? Wie ist der Ablauf eines DELETE Befehles? Wird zuerst selektiert und dann gelöscht? Meine o.G. Anfrage löscht nahezu 100 % Der Datensätze, also er findet sofort passende Sätze zum Löschen! Danke schonmal! Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 5. August 2014 Melden Teilen Geschrieben 5. August 2014 Moin, die Frage kann man in der Tat ohne genaue Kenntnis der betreffenden Version der Informix-Datenbank nicht beantworten. Wenn du keine zuverlässige Möglichkeit hast, die Integrität der Daten zu prüfen, solltest du also eine Datensicherung einspielen. Gruß, Nils Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 5. August 2014 Melden Teilen Geschrieben 5. August 2014 Ich kenne den Client nicht. Schreibende Operationen werden durch ein Commit abgeschlossen. Das macht der Client entweder automatisch "Auto Commit" oder man macht es manuell. Wenn kein Commit erfolgt und z.B. die aktuelle DB-Verbindung getrennt wird, macht die DB i.d.R. einen Rollback aus dem Transaktions-Log. Möglicherweise hat die "Cancel-Funktion" auch den Rollback ausgelöst. Eventuell protokolliert Informix das ja auch irgendwo. Zitieren Link zu diesem Kommentar
schuppsl 0 Geschrieben 5. August 2014 Autor Melden Teilen Geschrieben 5. August 2014 (bearbeitet) Hallo Ihr beiden und vielen Dank für die wahnsinnig schnelle Antwort. Ich denke, dass die DB einen Rollback gemacht hat wie zahni geschrieben hat. Der Client macht einen Autocommit, aber die Verbindung zur DB wurde getrennt, dies hat der Client mit einer Fehlermeldung quittiert (Communication Link Failure). Die Informix ist sehr starr und man kann leider nur die komplette DB wiederherstellen und das auch nur auf den gleichnahmigen Server... Für den Notfall müssten wir alles entsptechend einrichten, aber ich denke dass dies nicht nötig sein wird. So habe ich nun wenigsens eine Erklärung, warum auch auf dem Klon die Datenmenge wieder ansteigt nach dem DELETE und Abbruch. Das beruhigt mich doch sehr und ich denke genau so ist es. Vielen Dank! bearbeitet 5. August 2014 von schuppsl Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 5. August 2014 Melden Teilen Geschrieben 5. August 2014 Wir haben hier auch eine Informix-DB innerhalb einer Anwendung) Die schreibt auf jeden Fall Log-Files im Installationsordner. Dort würde mal reinschauen. Ansonsten könntest Du mit einer Rücksicherung in eine Kopie eine Summenabstimmung der Tabelle machen. Das musst Du Dir halt was einfallen lassen;) Zitieren Link zu diesem Kommentar
schuppsl 0 Geschrieben 5. August 2014 Autor Melden Teilen Geschrieben 5. August 2014 Alles klar, vielen Dank. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.