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

use*_*094 46 sql-server logs

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

他们没有该查询的备份,并希望查看服务器上运行的内容。

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

小智 52

类似的 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%';
Run Code Online (Sandbox Code Playgroud)

Grant 的博客评论中提到的更多选项:


Mar*_*ith 21

2005+,默认跟踪救援。

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

SELECT * FROM ::fn_trace_getinfo(default) 
Run Code Online (Sandbox Code Playgroud)

如果当前文件是例如 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)
Run Code Online (Sandbox Code Playgroud)


Sql*_*CID 16

可能能够从缓存的查询计划中检索信息,检查 BOL 以获取有关 sys.dm_exec_query_stats 的信息,或从连接到同一数据库的管理工作室运行它:

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
Run Code Online (Sandbox Code Playgroud)

过滤输出

WHERE text like '%something%'
Run Code Online (Sandbox Code Playgroud)

缩小结果。


小智 10

如果数据库处于完全恢复模式,那么可能有机会恢复一些数据并通过读取事务日志了解所做的事情。

不幸的是,这在默认情况下不受支持,但有一些方法可以做到这一点。

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

另一种选择是尝试使用未公开的函数 DBCC LOG 或 fn_dblog。这更复杂,但它是免费的。