it-swarm-eu.dev

Kann ich sehen, dass historische Abfragen in einer SQL Server-Datenbank ausgeführt werden?

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?

40
user87094

Ä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:

44
user507

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)
18

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.

14
SqlACID

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.

9
Stanley Norman

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.

0
bvh9000

Wenn Ihre Datenbank auf das vollständige Wiederherstellungsmodell eingestellt ist, können Sie Ihre Transaktionsprotokollsicherungen untersuchen. Sehen fn_dump_dblog für weitere Informationen.

0