Jemand hat eine Abfrage in unserer SQL Server-Datenbank remote ausgeführt und das System ist abgestürzt.
Sie haben keine Sicherung dieser Abfrage und möchten sehen, was auf dem Server ausgeführt wurde.
Ist es möglich, diese Abfrage in einem Protokoll oder in einem Verlauf irgendwo zu finden?
Ähnlich hatte Grant Fritchey das Problem, dass er SSMS geschlossen und die Abfrage verloren hatte, an der er gearbeitet hatte ... hier gebloggt: Oh **********!
[~ # ~] edit [~ # ~]
Um die Antwort etwas detaillierter zu gestalten, bietet der oben verlinkte Grant eine Abfrage, mit der Sie einfach in den Cache der Instanz wechseln können, um die gerade ausgeführte Abfrage abzurufen (oder zumindest zu versuchen):
SELECT dest.text
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE deqs.last_execution_time > '5/19/2011 11:00'
AND dest.text LIKE 'WITH%';
Einige weitere Optionen, die in den Kommentaren von Grants Blog erwähnt wurden:
2005+, Standardverfolgung zur Rettung.
Die Standardablaufverfolgung wird mit 20 MB verlängert, SQL behält jedoch den Verlauf von 5 Ablaufverfolgungen bei. Mit Zugriff auf den Server können Sie die * .trc-Dateien aus dem Verzeichnis MSSQL\Log abrufen. Wenn Sie nicht auf den Server zugreifen können, erhalten Sie im Folgenden den Namen der aktuellen Standard-Trace-Datei:
SELECT * FROM ::fn_trace_getinfo(default)
Wenn die aktuelle Datei beispielsweise E:\MSSQL.1\MSSQL\LOG\log_200.trc ist, sollten die vorherigen Dateien log_199.trc, log_198.trc usw. sein. Rufen Sie den Inhalt des Trace ab mit:
SELECT * FROM fn_trace_gettable('E:\MSSQL.1\MSSQL\LOG\log_199.trc', default)
Sie möglicherweise können Informationen aus zwischengespeicherten Abfrageplänen abrufen, BOL auf Informationen zu sys.dm_exec_query_stats überprüfen oder diese von Management Studio ausführen, das mit derselben Datenbank verbunden ist:
SELECT d.plan_handle ,
d.sql_handle ,
e.text
FROM sys.dm_exec_query_stats d
CROSS APPLY sys.dm_exec_sql_text(d.plan_handle) AS e
Filtern Sie die Ausgabe mit
WHERE text like '%something%'
die Ergebnisse einzugrenzen.
Wenn sich die Datenbank im vollständigen Wiederherstellungsmodus befand, besteht möglicherweise die Möglichkeit, einige Daten wiederherzustellen und Einblicke in die Vorgehensweise beim Lesen des Transaktionsprotokolls zu erhalten.
Leider wird dies nicht standardmäßig unterstützt, aber es gibt Möglichkeiten, dies zu tun.
Sie können versuchen, Tools von Drittanbietern wie ApexSQL Log oder SQL Log Rescue (kostenlos, aber nur SQL 2000) zu verwenden.
Eine andere Möglichkeit besteht darin, die undokumentierten Funktionen DBCC LOG oder fn_dblog zu verwenden. Dies ist komplexer, aber kostenlos.
ApexSQL verfügt über eine Funktion 'Ausgeführte Abfragen', mit der Sie nach Datum suchen und filtern können.
Ich bin nicht sicher, ob es den Verlauf aus dem SSMS-Cache abruft oder ihn tatsächlich selbst verfolgt. Sie könnten versuchen, es zu installieren und auf das Beste hoffen.
Wenn Ihre Datenbank auf das vollständige Wiederherstellungsmodell eingestellt ist, können Sie Ihre Transaktionsprotokollsicherungen untersuchen. Sehen fn_dump_dblog
für weitere Informationen.