有人在我们的 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 Log或SQL Log Rescue(免费但仅限 SQL 2000)。
另一种选择是尝试使用未公开的函数 DBCC LOG 或 fn_dblog。这更复杂,但它是免费的。
| 归档时间: |
|
| 查看次数: |
308176 次 |
| 最近记录: |