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?
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:
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)
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.
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.
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.
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.