Puis-je voir les requêtes historiques s'exécuter sur une base de données SQL Server?

38

Quelqu'un exécutait une requête sur notre base de données SQL Server à distance et leur système était en panne.

Ils n'ont aucune sauvegarde de cette requête et veulent voir ce qui a été exécuté sur le serveur.

Est-il possible de trouver cette requête dans un journal ou dans un historique quelque part?

utilisateur87094
la source
Pas dans un journal. Enregistré dans un système de contrôle de version TFS ou SourceSafe? Résultat défini sur un txt afin qu'il puisse être recréé?
jl01
2
Pour une conception future, vous pouvez envisager d'ajouter des déclencheurs et des tables d'audit / historique. Alors serait en mesure d'utiliser la dernière heure / utilisateur mis à jour.
Thomas Stringer

Réponses:

40

Un problème similaire, Grant Fritchey, avait le même problème: il avait fermé SSMS et perdu la requête sur laquelle il travaillait ... blogué à propos de ici: Oh **********!

MODIFIER

Pour rendre cela un peu plus détaillé dans une réponse, le lien référencé ci-dessus, Grant, fournit une requête pour accéder simplement au cache de l'instance afin d'extraire la requête que vous venez d'exécuter (ou au moins d'essayer de):

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%';

Quelques autres options mentionnées dans les commentaires du blog de Grant:

Shawn Melton
la source
1
C'est un bel article! Merci! Et après l'article de Grant, Récupérer des fichiers de requête sauvegardés dans SQL Server Management Studio peut être utile.
Marian
Cette réponse peut être importée si elle indique les versions de sqlserver sur lesquelles elle fonctionne. Je reçois cette erreur en essayant de l'exécuter: syntaxe incorrecte près de '.'. sur 2008.
Michael Potter
Pourrait être importé? @MichaelPotter Copier et coller entre le navigateur et d'autres outils changera généralement les guillemets et autres textes, je n'ai aucun contrôle sur cette partie.
Shawn Melton
Désolé, s'il vous plaît, corrigez ma question ... s / importé / amélioré /
Michael Potter
17

2005+, trace par défaut à la rescousse.

La trace par défaut est reportée à 20 Mo. SQL conserve l'historique de 5 traces. Avec un accès au serveur, vous pouvez récupérer les fichiers * .trc à partir du répertoire MSSQL \ Log. Si vous ne pouvez pas accéder au serveur, voici ce qui vous donnera le nom du fichier de trace par défaut actuel:

SELECT * FROM ::fn_trace_getinfo(default) 

Si le fichier actuel est par exemple E: \ MSSQL.1 \ MSSQL \ LOG \ log_200.trc, les fichiers précédents doivent être log_199.trc, log_198.trc, etc. Obtenez le contenu de la trace avec:

SELECT * FROM fn_trace_gettable('E:\MSSQL.1\MSSQL\LOG\log_199.trc', default)
Mark Storey-Smith
la source
13

Vous pourrez peut- être récupérer des informations à partir de plans de requête en cache, rechercher des informations dans BOL sur sys.dm_exec_query_stats ou les exécuter à partir du studio de gestion connecté à la même base de données:

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

Filtrer la sortie avec

WHERE text like '%something%'

pour affiner les résultats.

SqlACID
la source
9

Si la base de données était en mode de récupération complète, il serait peut-être possible de récupérer des données et de mieux comprendre ce qui a été fait en lisant le journal des transactions.

Malheureusement, ceci n'est pas supporté par défaut, mais il existe des moyens de le faire.

Vous pouvez essayer d'utiliser des outils tiers tels que ApexSQL Log ou SQL Log Rescue (gratuit, mais SQL 2000 uniquement).

Une autre option consiste à utiliser des fonctions non documentées DBCC LOG ou fn_dblog. C'est plus complexe mais c'est gratuit.

Stanley Norman
la source
0

Si votre base de données est définie sur le modèle de récupération complète, vous pouvez examiner vos sauvegardes du journal des transactions. Voir fn_dump_dblogpour plus d'informations.

Matthias Elflein
la source
0

ApexSQL possède une fonctionnalité de "requêtes exécutées" qui vous permet de rechercher et de filtrer par date.

Je ne sais pas s'il extrait l'historique du cache SSMS ou s'il en assure le suivi seul. Vous pouvez essayer de l'installer et espérer le meilleur.

bvh9000
la source
Cela concerne uniquement les éléments que vous exécutez directement dans les fenêtres de requête et vous devez activer la sauvegarde.
Chris Bordeman le