Kann ich sehen, wie historische Abfragen in einer SQL Server -Datenbank ausgeführt werden?
-
16-10-2019 - |
Frage
Jemand führte eine Abfrage in unserer SQL Server -Datenbank aus der Ferne aus und sein System stürzte ab.
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 irgendwo in einer Geschichte zu finden?
Lösung
Ähnliche Grant Fritchey hatte das Problem, in dem er SSMS geschlossen und die Frage verloren hatte, an der er gearbeitet hatte ... über hier gebloggt: hier:Oh **********!
BEARBEITEN
Um dies ein bisschen detaillierter für eine Antwort zu machen, enthält der oben verwandte Linked Grant eine Abfrage, um einfach zum Cache der Instanz zu gehen, um die gerade ausgeführte Abfrage herauszuziehen (oder mindestens Versuch):
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%';
Ein paar weitere Optionen, die in den Kommentaren von Grants Blog festgestellt wurden:
- Jamie Thomson zeigt, wo SSMS tatsächlich einen "Wiederherstellungsbereich" hat Unter Ihrem Windows -Profil, ähnlich wie die Word- oder Excel -Wiederherstellung.
- Eine andere einzelnen Notizen in Kommentaren zum SSMS -Tools -Paket, Aber dieses Add-On ist nur für SQL Server 2008 kostenlos. Ab SQL Server 2012 wird es nur bezahlt, bietet jedoch viele Funktionen, die Sie möglicherweise nützlich finden.
Andere Tipps
2005+, Standardverfolgung zur Rettung.
Die Standardverfolgung rollt bei 20 MB um, aber SQL behält die Geschichte von 5 Spuren bei. Mit Zugriff auf den Server können Sie die *.trc -Dateien aus dem MSSQL Log -Verzeichnis 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. Holen Sie sich den Inhalt der Ablaufverfolgung mit:
SELECT * FROM fn_trace_gettable('E:\MSSQL.1\MSSQL\LOG\log_199.trc', default)
Du könnte In der Lage sein, Informationen aus zwischengespeicherten Abfrageplänen abzurufen, BOL nach Informationen zu sys.dm_exec_query_stats überprüfen oder diese aus dem 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 den Ausgang mit
WHERE text like '%something%'
um die Ergebnisse einzugrenzen.
Wenn die Datenbank im vollständigen Wiederherstellungsmodus wäre, besteht möglicherweise die Möglichkeit, einige Daten wiederherzustellen und Einblicke in das zu erhalten, was durch das Lesen von Transaktionsprotokollen getan wurde.
Leider wird dies standardmäßig nicht unterstützt, aber es gibt Möglichkeiten, dies zu tun.
Sie können versuchen, Drittanbieter -Tools wie zu verwenden, z. ApexSQL -Protokoll oder SQL Log Rescue (Nur frei, aber nur SQL 2000).
Eine andere Option besteht darin, die DBCC -Protokoll- oder FN_Dblog -Funktionen undokumentierte Funktionen zu verwenden. Dies ist komplexer, aber frei.
Wenn Ihre Datenbank auf das vollständige Wiederherstellungsmodell eingestellt ist, können Sie Ihre Transaktionsprotokollsicherungen untersuchen. Sehen fn_dump_dblog
für weitere Informationen.
ApexSQL Hat eine Funktionalität von "ausgeführte Abfragen", mit der Sie nach Datum suchen und filtern können.
Ich bin mir nicht sicher, ob es die Geschichte aus dem SSMS -Cache abzieht oder es tatsächlich selbst im Auge behält. Sie könnten versuchen, es zu installieren und auf das Beste zu hoffen.