即席只读查询是不是存储在 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:的解决办法