SQL Server löscht Daten von sich selbst aus ?!
Hallo liebe Administrator-Fachwissenden ,
wir benutzen bei uns im Haus seit Jahren ein Programm, dass Daten auf einem SQL-Server speichert. Mittlerweile liegen diese Daten auf einem SQL Server 2008 R2 mit passendem Management Studio. Auf dem Server ist ebenfalls Windows Server Standard 2008 R2 installiert.
Letzte Woche merkten wir, das in einer einzigen Tabelle Daten fehlten. Daraufhin haben wir das ganze untersucht und haben festgestellt dass 60.000 von 62.000 Datensätzen verschwunden sind. Weder im Ereignisprotokoll des Servers, noch im SQL Reporting oder unser Programminternes Reporting Tool hatte irgendeine auffällige Meldung drin.
Das Ganze beunruhigt mich doch sehr und wollte daher mal fragen, ob ihr Ideen habt, was das ganze verursacht haben oder wo man noch nach Fehlerquellen schauen könnte.
Kann es z.B. sein, dass so etwas in der Art passieren könnte, wenn das Programm abschmiert während es eine Anweisung ausführt? Oder wenn von extern die Leute per VPN zugreifen und das dann abschmiert, das da was passieren kann?
Es ist halt sehr seltsam weil es das erste mal in über 10 Jahren ist, das so etwas passiert. Ich hoffe ihr könnt mir weiterhelfen.
Falls ihr noch Infos braucht oder etwas wissen wollt, fragt ruhig.
Grüße
Kev
wir benutzen bei uns im Haus seit Jahren ein Programm, dass Daten auf einem SQL-Server speichert. Mittlerweile liegen diese Daten auf einem SQL Server 2008 R2 mit passendem Management Studio. Auf dem Server ist ebenfalls Windows Server Standard 2008 R2 installiert.
Letzte Woche merkten wir, das in einer einzigen Tabelle Daten fehlten. Daraufhin haben wir das ganze untersucht und haben festgestellt dass 60.000 von 62.000 Datensätzen verschwunden sind. Weder im Ereignisprotokoll des Servers, noch im SQL Reporting oder unser Programminternes Reporting Tool hatte irgendeine auffällige Meldung drin.
Das Ganze beunruhigt mich doch sehr und wollte daher mal fragen, ob ihr Ideen habt, was das ganze verursacht haben oder wo man noch nach Fehlerquellen schauen könnte.
Kann es z.B. sein, dass so etwas in der Art passieren könnte, wenn das Programm abschmiert während es eine Anweisung ausführt? Oder wenn von extern die Leute per VPN zugreifen und das dann abschmiert, das da was passieren kann?
Es ist halt sehr seltsam weil es das erste mal in über 10 Jahren ist, das so etwas passiert. Ich hoffe ihr könnt mir weiterhelfen.
Falls ihr noch Infos braucht oder etwas wissen wollt, fragt ruhig.
Grüße
Kev
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 332024
Url: https://administrator.de/contentid/332024
Ausgedruckt am: 23.11.2024 um 16:11 Uhr
20 Kommentare
Neuester Kommentar
Moin,
wenn das Programm korrekt geschrieben ist (also Transactions verwendet), können durch "Abschmieren" keine Records aus den Tabellen verschwinden. Genauere Auskunft erteilt sicher der Hersteller/Programmierer.
Wahrscheinlicher ist allerdings eine versehentliche/vorsätzliche Löschung der Datensätze durch einen User/Admin. Wer hat denn bei euch alles die Möglichkeit direkt SQL-Scripts/Befehle auf der DB auszuführen?
lg,
Slainte
wenn das Programm korrekt geschrieben ist (also Transactions verwendet), können durch "Abschmieren" keine Records aus den Tabellen verschwinden. Genauere Auskunft erteilt sicher der Hersteller/Programmierer.
Wahrscheinlicher ist allerdings eine versehentliche/vorsätzliche Löschung der Datensätze durch einen User/Admin. Wer hat denn bei euch alles die Möglichkeit direkt SQL-Scripts/Befehle auf der DB auszuführen?
lg,
Slainte
Moin,
ich vermute mal, da ist irgendwo versehentlich ein
ausgeführt worden. Insbesondere, wenn es nur diese eine Tabelle getroffen hat...
Von selbst fängt kein SQL-Server an, irgendwas zu löschen. Das würde das Produkt ja dann direkt vom MArkt weg befördern...
Und auch ein Verbindungsabbruch während ein Statement übertragen wird, lässt sich zu 99,9% ausschließen. Wenn dann wären da nur fragmente angekommen, aber ein Abbruch löst kein Löschen aus (außer die Where-Clause ist nicht vollständig angekommen)
Werden da Daten irgendwo über ein Formular reingeschrieben?
Vllt. ist es ja auch eine SQL-Injection gewesen....
Könnt ihr das denn zeitlich eingrenzen? Also wisst ihr, ab welchem Zeitpunkt genau die Datensätze fehlen (weil z.B. ein Zeitstempel in der Tabelle enthalten ist)? Wenn ja, wäre das Zeitfenster schon mal stark einzugrenzen....
Ansonsten müsste man mehrere Datensicherungen mit dem aktuellen Stand abgleichen, um herauszufinden wann die Daten (also ab welchem Tag) verloren gegangen sind
Gruß
em-pie
ich vermute mal, da ist irgendwo versehentlich ein
DELETE FROM [TABLE_NAME] (WHERE ... )
Von selbst fängt kein SQL-Server an, irgendwas zu löschen. Das würde das Produkt ja dann direkt vom MArkt weg befördern...
Und auch ein Verbindungsabbruch während ein Statement übertragen wird, lässt sich zu 99,9% ausschließen. Wenn dann wären da nur fragmente angekommen, aber ein Abbruch löst kein Löschen aus (außer die Where-Clause ist nicht vollständig angekommen)
Werden da Daten irgendwo über ein Formular reingeschrieben?
Vllt. ist es ja auch eine SQL-Injection gewesen....
Könnt ihr das denn zeitlich eingrenzen? Also wisst ihr, ab welchem Zeitpunkt genau die Datensätze fehlen (weil z.B. ein Zeitstempel in der Tabelle enthalten ist)? Wenn ja, wäre das Zeitfenster schon mal stark einzugrenzen....
Ansonsten müsste man mehrere Datensicherungen mit dem aktuellen Stand abgleichen, um herauszufinden wann die Daten (also ab welchem Tag) verloren gegangen sind
Gruß
em-pie
Und wie sieht es mit folgender Theorie aus:
Jemand hat versehentlich das Delete * from ausgelöst und es 1 Sekunde später bemerkt und das Löschen abgebrochen....
Und wenn über die Transaction-Logs nicht zu identifizieren ist, kann/ wird das löschen ggf. nicht via der Transaction-Statements ausgeführt worden sein...
Habt ihr mal in die Transaction-Logs reingeschaut?
http://stackoverflow.com/questions/4507509/how-to-view-transaction-logs ...
Jemand hat versehentlich das Delete * from ausgelöst und es 1 Sekunde später bemerkt und das Löschen abgebrochen....
Und wenn über die Transaction-Logs nicht zu identifizieren ist, kann/ wird das löschen ggf. nicht via der Transaction-Statements ausgeführt worden sein...
Habt ihr mal in die Transaction-Logs reingeschaut?
http://stackoverflow.com/questions/4507509/how-to-view-transaction-logs ...
Dann schaue dir einmal diesen Code an
Quelle: http://dba.stackexchange.com/questions/4269/how-to-find-out-who-deleted ...
Das müsste dir auch helfen
DECLARE @TableName sysname
SET @TableName = 'dbo.Table_1'
SELECT
u.[name] AS UserName
, l.[Begin Time] AS TransactionStartTime
FROM
fn_dblog(NULL, NULL) l
INNER JOIN
(
SELECT
[Transaction ID]
FROM
fn_dblog(NULL, NULL)
WHERE
AllocUnitName LIKE @TableName + '%'
AND
Operation = 'LOP_DELETE_ROWS'
) deletes
ON deletes.[Transaction ID] = l.[Transaction ID]
INNER JOIN
sysusers u
ON u.[sid] = l.[Transaction SID]
Quelle: http://dba.stackexchange.com/questions/4269/how-to-find-out-who-deleted ...
Das müsste dir auch helfen
Ohne genaues Verständnis der Daten und der Vorgänge in der DB läßt sich von Außen leider nicht viel sagen. Ich würde aber blind Wetten, das der Server nicht "ausversehen" oder unabsichtlich Daten verloren hat. Auch würde ich einen Hardware-Fehler ausschließen.
Auch sehe ich es als warscheinlich an, das die Daten eine oder (wenige) mehrere Gemeinsamkeiten haben oder hatten. Mehrere einzelne Löschvorgänge auf zufällige Daten wären aufwendig, Zufälliges Löschen ist auch nicht so einfach und müsste mutwillig so geschrieben worden sein. Bleiben also nur drei Möglichkeiten:
- Mutwillig
- Gemeinsamkeit(en) vorhanden
- Abgebrochene Transaktion wie es em-pie beschrieben hat
Der Zeitpunkt der Löschnung der Datensätze wird immer dann eine Rolle spielen, wenn der Vorgang aus dem Inneren kommt. Wenn irgendwer irgendwas ausgeführt hat oder verändert hat. Wenn jemand Code getestet hat oder grade gefeuert wurde. Ist das ganze Bestandteil einer Aktion von Außen (Angriff auf ein Webinterface) ist der Zeitpunkt vermutlich purer Zufall.
Für zukünftige Datenverluste kannst du auf jeden Fall einen Trigger auf die Tabelle setzen und kannst den Datum, Zeit, User und / oder die Daten mit loggen.
Auch sehe ich es als warscheinlich an, das die Daten eine oder (wenige) mehrere Gemeinsamkeiten haben oder hatten. Mehrere einzelne Löschvorgänge auf zufällige Daten wären aufwendig, Zufälliges Löschen ist auch nicht so einfach und müsste mutwillig so geschrieben worden sein. Bleiben also nur drei Möglichkeiten:
- Mutwillig
- Gemeinsamkeit(en) vorhanden
- Abgebrochene Transaktion wie es em-pie beschrieben hat
Der Zeitpunkt der Löschnung der Datensätze wird immer dann eine Rolle spielen, wenn der Vorgang aus dem Inneren kommt. Wenn irgendwer irgendwas ausgeführt hat oder verändert hat. Wenn jemand Code getestet hat oder grade gefeuert wurde. Ist das ganze Bestandteil einer Aktion von Außen (Angriff auf ein Webinterface) ist der Zeitpunkt vermutlich purer Zufall.
Für zukünftige Datenverluste kannst du auf jeden Fall einen Trigger auf die Tabelle setzen und kannst den Datum, Zeit, User und / oder die Daten mit loggen.
Also zufällig löschen ist, wie du auch selbst festgestellt hast, ungewöhnlich und aufwendig, daher gehe ich davon aus das es irgendeinen Zusammenhang geben wird oder es wirklich mutwillig war. Du siehst keinen Zusammenhang, das macht es schwer, aber er könnte dennoch da sein. Der Zusammenhang könnte sehr viel Aufschluss darüber geben warum es passiert ist, daher würde ich an deiner Stelle Zeit in die Suche investieren.
Hmm..
naja, je nachdem, wir eure Tabellen aufgebaut sind, wäre es ja u.U. so möglich:
Deine lückenhafte Tabelle nennt sich Tbl_A, die gejointe Tabelle wäre Tbl_B, dann könnte es wie folgt aussehen
Ob das denkbar ist, weiss ich nicht, da wir ja eure Tabellen- und Beziehungsstruktur nachvollziehbarerweise nicht kennen (kein Vorwurf, nur eine Anmerkung).
naja, je nachdem, wir eure Tabellen aufgebaut sind, wäre es ja u.U. so möglich:
Deine lückenhafte Tabelle nennt sich Tbl_A, die gejointe Tabelle wäre Tbl_B, dann könnte es wie folgt aussehen
delete from Tbl_A
INNER JOIN Tbl_B on Tbl_A.Field1 = Tbl_B.Field1
where Tbl_B.Field3 <'2017-03-01 12:25:00.000'
Ob das denkbar ist, weiss ich nicht, da wir ja eure Tabellen- und Beziehungsstruktur nachvollziehbarerweise nicht kennen (kein Vorwurf, nur eine Anmerkung).
Das kann auch ein zunächst total abwegig erscheinender Zusammenhang sein, z.B. eine von 3 Spalten ist NULL während es die anderen 2 nicht sein dürfen. Aber auch eben nur ein frei gewähltes Beispiel.
Es ist eigentlich unmöglich auszuschließen, das es einen Zusammenhang gibt. Der Zusammenhang kann aber Aufschluss darüber geben warum die Daten vielleicht versehentlich gelöscht wurden.
Wie anonym sind denn die Daten, könnte man einen Auszug von sagen wir den ersten 100 Zeilen bei einem Select ohne Sortierung hier posten?
Es ist eigentlich unmöglich auszuschließen, das es einen Zusammenhang gibt. Der Zusammenhang kann aber Aufschluss darüber geben warum die Daten vielleicht versehentlich gelöscht wurden.
Wie anonym sind denn die Daten, könnte man einen Auszug von sagen wir den ersten 100 Zeilen bei einem Select ohne Sortierung hier posten?