web-dev-qa-db-fra.com

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

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

Ils n'ont aucune sauvegarde de cette requête et souhaitent 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?

40
user87094

Grant Fritchey similaire avait le problème où il avait fermé SSMS et perdu la requête sur laquelle il travaillait ... blogué ici: Oh **********!

[~ # ~] modifier [~ # ~]

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

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 options supplémentaires qui ont été notées dans les commentaires du blog de Grant:

44
user507

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

La trace par défaut est restaurée à 20 Mo, mais SQL conserve l'historique de 5 traces. Avec l'accès au serveur, vous pouvez récupérer les fichiers * .trc du répertoire MSSQL\Log. Si vous ne pouvez pas accéder au serveur, les informations suivantes vous donneront 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)
18
Mark Storey-Smith

Vous pourriez être en mesure de récupérer des informations à partir de plans de requête mis en cache, vérifier BOL pour plus d'informations sur sys.dm_exec_query_stats, ou l'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

Filtrez la sortie avec

WHERE text like '%something%'

pour affiner les résultats.

14
SqlACID

Si la base de données était en mode de récupération complète, il pourrait y avoir une chance de récupérer certaines données et d'obtenir des informations sur ce qui a été fait en lisant le journal des transactions.

Malheureusement, cela n'est pas pris en charge 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 à essayer d'utiliser les fonctions non documentées DBCC LOG ou fn_dblog. C'est plus complexe mais c'est gratuit.

9
Stanley Norman

ApexSQL a une fonctionnalité '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 garde la trace par lui-même. Vous pouvez essayer de l'installer et espérer le meilleur.

0
bvh9000

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

0
Matthias Elflein