我可以看到在SQL Server数据库上运行的历史查询吗?


38

有人在我们的SQL Server数据库上远程运行查询,并且系统崩溃了。

他们没有该查询的备份,想查看服务器上运行了什么。

是否可以在日志或历史记录中找到此查询?


不在日志中。已签入TFS或SourceSafe版本控制系统?结果设置为txt,以便可以重新创建?
2011年

2
对于将来的设计,您可能需要考虑添加触发器和审计/历史记录表。然后将能够利用上次更新的时间/用户。
托马斯·斯金格

Answers:


39

类似的Grant Fritchey遇到的问题是,他关闭了SSMS,并丢失了他一直在处理的查询...在此处发布了博客: 哦**********!

编辑

为了使答案更加详细,Grant上方的引用链接提供了一个查询,可简单地转到实例上的缓存以提取您刚刚执行(或至少尝试执行)的查询:

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

Grant博客的评论中还提到了一些其他选项:


1
那是一篇不错的文章!谢谢!按照Grant的文章,在SQL Server Management Studio中恢复备份的查询文件可能会有所帮助。
玛丽安

如果说明了可以使用的sqlserver版本,则可以导入此答案。尝试运行该错误时出现此错误:'。'附近的语法不正确。在2008
Michael Potter

可以进口吗?@MichaelPotter在浏览器和其他工具之间进行复制和粘贴通常会更改引号和其他文本,但我无法控制该部分。
肖恩·梅尔顿

抱歉,请纠正我的问题……s / imported / improved /
Michael Potter

16

2005年以上版本,默认跟踪为救援。

默认跟踪将滚动到20mb,但SQL保留5条跟踪的历史记录。通过访问服务器,您可以从MSSQL \ Log目录中检索* .trc文件。如果您无法访问服务器,则以下内容将为您提供当前默认跟踪文件的名称:

SELECT * FROM ::fn_trace_getinfo(default) 

例如,如果当前文件是E:\ MSSQL.1 \ MSSQL \ LOG \ log_200.trc,则先前的文件应该是log_199.trc,log_198.trc等。使用以下命令获取跟踪的内容:

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

13

也许能够从缓存的查询计划中检索信息,检查BOL上有关sys.dm_exec_query_stats的信息,或者从连接到同一数据库的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

过滤输出

WHERE text like '%something%'

缩小结果。


9

如果数据库处于完全恢复模式,则可能有机会恢复一些数据并通过读取事务日志来了解执行的操作。

不幸的是,默认情况下不支持此操作,但是有多种方法可以执行此操作。

您可以尝试使用第三方工具,例如ApexSQL LogSQL Log Rescue(免费,但仅限SQL 2000)。

另一个选择是尝试使用未记录的函数DBCC LOG或fn_dblog。这比较复杂,但是免费。



0

ApexSQL具有“执行查询”功能,可让您按日期搜索和过滤。

我不确定它是否从SSMS缓存中提取历史记录,或者实际上是单独跟踪它。您可以尝试安装它并希望获得最好的结果。


这仅适用于您直接在查询窗口中执行的内容,并且必须打开保存功能。
克里斯·鲍德曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.