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


38

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 zu finden?


Nicht in einem Protokoll. In ein TFS- oder SourceSafe-Versionskontrollsystem eingecheckt? Ergebnis auf einen txt gesetzt, damit es neu erstellt werden kann?
jl01

2
Für den zukünftigen Entwurf können Sie Trigger und Prüfungs- / Verlaufstabellen hinzufügen. Dann wäre in der Lage, die zuletzt aktualisierte Zeit / Benutzer zu nutzen.
Thomas Stringer

Antworten:


39

Ähnlich hatte Grant Fritchey das Problem, bei dem er SSMS geschlossen und die Abfrage verloren hatte, an der er gearbeitet hatte ... bloggte hier: Oh **********!

BEARBEITEN

Um eine Antwort ein wenig detaillierter zu gestalten, enthält der oben verlinkte Link 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:


1
Das ist ein schöner Artikel! Vielen Dank! Im Anschluss an Grants Artikel kann das Wiederherstellen von gesicherten Abfragedateien in SQL Server Management Studio hilfreich sein.
Marian

Diese Antwort könnte importiert werden, wenn angegeben wird, auf welchen Versionen von sqlserver sie funktioniert. Ich erhalte diesen Fehler, wenn ich versuche, ihn auszuführen: Falsche Syntax in der Nähe von '.'. am 2008.
Michael Potter

Könnte importiert werden? @MichaelPotter Durch Kopieren und Einfügen zwischen dem Browser und anderen Tools werden normalerweise Anführungszeichen und anderer Text geändert. Ich habe keine Kontrolle über diesen Teil.
Shawn Melton

Entschuldigung, bitte korrigieren Sie meine Frage ... s / importiert / verbessert /
Michael Potter

16

2005+, Standardablaufverfolgung zur Rettung.

Die Standardablaufverfolgung wird bei 20 MB übertragen, 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. Den Inhalt der Ablaufverfolgung erhalten Sie mit:

SELECT * FROM fn_trace_gettable('E:\MSSQL.1\MSSQL\LOG\log_199.trc', default)

13

Sie könnten der Lage sein , Informationen von zwischengespeicherten Abfragepläne abzurufen, überprüfen BOL für Informationen über sys.dm_exec_query_stats, oder diese auf die gleiche Datenbank verbunden von Management Studio:

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 einschränken.


9

Wenn sich die Datenbank im vollständigen Wiederherstellungsmodus befindet, besteht möglicherweise die Möglichkeit, einige Daten wiederherzustellen und Einblicke in die durch das Lesen des Transaktionsprotokolls ausgeführten Vorgänge 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, jedoch nur SQL 2000) zu verwenden.

Eine andere Möglichkeit besteht darin, undokumentierte Funktionen wie DBCC LOG oder fn_dblog zu verwenden. Dies ist komplexer, aber kostenlos.


0

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


0

ApexSQL verfügt über eine Funktion zum Ausführen von Abfragen, mit der Sie nach Datum suchen und filtern können.

Ich bin nicht sicher, ob der Verlauf aus dem SSMS-Cache abgerufen wird oder ob er tatsächlich von alleine verfolgt wird. Sie könnten versuchen, es zu installieren und auf das Beste hoffen.


Das gilt nur für Dinge, die Sie direkt in Abfragefenstern ausführen, und Sie müssen das Speichern einschalten.
Chris Bordeman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.