即席只读查询是不是存储在 SQL Server 事务日志中?

Posted

技术标签:

【中文标题】即席只读查询是不是存储在 SQL Server 事务日志中?【英文标题】:Are ad-hoc read-only queries stored in SQL Server transaction log?即席只读查询是否存储在 SQL Server 事务日志中? 【发布时间】:2011-07-27 20:17:14 【问题描述】:

在数据库恢复模式配置为full 的 SQL Server 2008 中,查询如下:

从表名中选择 col1,col2,col3

记录到事务日志文件。

换句话说,我能否使用事务日志备份确定特定日期在数据库上运行了哪些查询?

【问题讨论】:

您是在尝试调整性能、排除故障,还是需要某种审计跟踪? 根本不是为了性能调优。我可以使用 DMV 的。我只需要确定是否有人查询了数据库上的特定表。我知道的远射;但我想我还是会问这个问题。 【参考方案1】:

没有。事务日志根本不记录查询。它只记录前滚或回滚事务所需的信息(SELECT 查询根本不会生成任何记录的活动)

你可以试试

select top 100 *
from sys.fn_dblog(default,default)

查看记录的内容。

如果您需要此类信息,则需要设置跟踪/扩展事件会话/audit session 来记录它。在大多数环境中,这可能是令人望而却步的重量。

您可以使用以下内容大致了解正在运行的即席查询。

SELECT text 
from sys.dm_exec_cached_plans
cross apply sys.dm_exec_sql_text(plan_handle)
where objtype='Adhoc'

【讨论】:

其实SELECT查询可以生成日志(在tempdb中)如果工作表被计划使用。它们当然没有备份,所以这与@op 无关,但我想我只是为了正确起见而提到它:) @Quassnoi - (不争辩这可能是这种情况,但是......)为什么需要记录? tempdb 只需要 ACI 而不是 ACID。每次重新启动都会重新创建它。 @Martin:因为事务日志提高了性能(使用顺序写访问)。当然,并非所有内容都被记录下来:只有页面分配或缓存计划中的持久工作表之类的内容。 technet.microsoft.com/en-us/library/cc966545.aspx @Quassnoi - 这些会出现在什么样的SELECT 查询中?我刚刚尝试了一个带假脱机的查询,tempdb 中没有其他记录条目 - 它需要哈希连接还是什么? - 啊刚刚注意到你的链接。也许大型排序操作会做到这一点。 感谢您的信息。所以看起来我可以使用 dm_exec_cached_plans 查询来查找最近的临时查询,但很旧的查询可能不会存在(即使 SQL Server 没有重新启动)。

以上是关于即席只读查询是不是存储在 SQL Server 事务日志中?的主要内容,如果未能解决你的问题,请参考以下文章

Impala使用SQL即席查询出现AnalysisException: Could not resolve table reference:的解决办法

为啥需要以只读方式输入 SQL Server 存储过程的表值参数?

SQL Server 2008 是不是支持表级只读?

高可用性副本 SQL Server 2014 中的只读意图

sql server 创建只读帐号

SQl server 2010数据库附加文件为只读,修改是出错,怎么办