首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL事务日志

SQL事务日志
EN

Database Administration用户
提问于 2019-12-19 17:51:18
回答 1查看 50关注 0票数 -1

是否有一个工具允许我们拥有一个由sql服务器执行的所有事务的日志?我目前正在使用数据分析器,但它会导致服务器大量崩溃。我需要一个工具来记录所有的日志,并将其存储在另一台服务器上,以便能够更快、更清晰地进行查询。提前感谢!

EN

回答 1

Database Administration用户

发布于 2019-12-19 21:31:42

听起来,您希望看到服务器上运行的所有查询。

有一些方法可以做到这一点,但是它会给您的系统增加开销--潜在的开销很大,以至于可能会对试图使用它的应用程序和工作负载造成干扰。

您提到使用分析器会导致系统不稳定。在Server 2008 R2上,您的主要其他选项是使用扩展事件会话。从理论上讲,这应该是较轻的重量,但对于生产使用来说,它可能还是有点太过了,除非您的系统不是很忙。

我没有方便的2008年R2实例,但为了查看2017年实例的所有内容,我将捕获以下事件:

  • sqlserver.error_reported
  • sqlserver.module_end
  • sqlserver.rpc_completed
  • sqlserver.sp_statement_completed
  • sqlserver.sql_batch_completed
  • sqlserver.sql_statement_completed

这些来自SSMS中提供的“查询详细跟踪”模板,脚本如下所示:

代码语言:javascript
复制
CREATE EVENT SESSION [query_detail_tracking] ON SERVER 
ADD EVENT sqlserver.error_reported(
    ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.query_hash,sqlserver.session_id)
    WHERE (([package0].[greater_than_uint64]([sqlserver].[database_id],(4))) AND ([package0].[equal_boolean]([sqlserver].[is_system],(0))))),
ADD EVENT sqlserver.module_end(SET collect_statement=(1)
    ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.query_hash,sqlserver.session_id)
    WHERE (([package0].[greater_than_uint64]([sqlserver].[database_id],(4))) AND ([package0].[equal_boolean]([sqlserver].[is_system],(0))))),
ADD EVENT sqlserver.rpc_completed(
    ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.query_hash,sqlserver.session_id)
    WHERE (([package0].[greater_than_uint64]([sqlserver].[database_id],(4))) AND ([package0].[equal_boolean]([sqlserver].[is_system],(0))))),
ADD EVENT sqlserver.sp_statement_completed(SET collect_object_name=(1)
    ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id)
    WHERE (([package0].[greater_than_uint64]([sqlserver].[database_id],(4))) AND ([package0].[equal_boolean]([sqlserver].[is_system],(0))))),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.query_hash,sqlserver.session_id)
    WHERE (([package0].[greater_than_uint64]([sqlserver].[database_id],(4))) AND ([package0].[equal_boolean]([sqlserver].[is_system],(0))))),
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id)
    WHERE (([package0].[greater_than_uint64]([sqlserver].[database_id],(4))) AND ([package0].[equal_boolean]([sqlserver].[is_system],(0)))))
ADD TARGET package0.event_file(SET filename=N'query_detail_tracking')
WITH 
(
    MAX_MEMORY=4096 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=30 SECONDS,
    MAX_EVENT_SIZE=0 KB,
    MEMORY_PARTITION_MODE=NONE,
    TRACK_CAUSALITY=ON,
    STARTUP_STATE=OFF
)

在Server 2016及以上版本上,“查询存储”功能可以帮助捕获系统上运行的大多数或所有查询。但我想从升级到那个版本还有很长的路要走。

FYI“事务日志”是Server中的一个加载术语,大多数人会看到这一点,并认为您的意思是用于实时可恢复性的预写日志

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/255982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档