小编Mai*_*n21的帖子

捕捉并理解事务回滚

由于应用程序的数据一致性问题(零星数据丢失),我必须深入研究事务处理。我创建了一个扩展事件会话:

CREATE EVENT SESSION [system_rollback_error] ON SERVER 
ADD EVENT sqlserver.error_reported(
    ACTION(
        package0.event_sequence,
        sqlserver.client_app_name,
        sqlserver.client_hostname,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.server_principal_name,
        sqlserver.session_id,
        sqlserver.session_nt_username,
        sqlserver.sql_text,
        sqlserver.transaction_id,
        sqlserver.transaction_sequence
    )
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))
        AND [severity]>(10))),
ADD EVENT sqlserver.sql_transaction(
    ACTION(
        package0.event_sequence,
        sqlserver.client_app_name,
        sqlserver.client_hostname,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.server_principal_name,
        sqlserver.session_id,
        sqlserver.session_nt_username,
        sqlserver.sql_text,
        sqlserver.transaction_id,
        sqlserver.transaction_sequence
    )
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))
        AND [transaction_state]='Rollback'
        AND [transaction_type]='System'))

ADD TARGET package0.event_file(
    SET filename=N'system_rollback_error',
        max_file_size=(100)
    )
    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=OFF,
        STARTUP_STATE=OFF
    )
GO 
Run Code Online (Sandbox Code Playgroud)

现在,我收到此 ext-event 会话中显示的大量 DUI 语句,所有这些语句都处于自动提交模式,但没有任何错误消息。没有关键违规,没有错误的语法或让我知道为什么事务被回滚的东西。我已经使用检查了事务日志

select * from sys.fn_dblog(NULL,NULL) where …
Run Code Online (Sandbox Code Playgroud)

sql-server

5
推荐指数
1
解决办法
360
查看次数

为什么我无法在 SQL Server 中的跟踪上创建筛选器?

由于 SQL Server 版本过时,我必须使用服务器端跟踪来收集一些信息,但如果我尝试实现它,则会收到错误Filters with the same event column ID must be grouped together。我的代码:

exec sp_trace_setfilter 2, 10, 0, 7, N'SQL Server Profiler%'
exec sp_trace_setfilter 2, 10, 0, 7, N'DatabaseMail%'
exec sp_trace_setfilter 2, 10, 0, 7, N'SQLAgent%'
Run Code Online (Sandbox Code Playgroud)

知识库示例(https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-trace-setfilter-transact-sql?view=sql-server-ver16):

sp_trace_setfilter  1, 10, 0, 6, N'SQLT%';  
sp_trace_setfilter  1, 10, 0, 6, N'MS%';
Run Code Online (Sandbox Code Playgroud)

通常它可能是显而易见的事情,但我不知道为什么它不起作用(它不是分号)。
你们中有人有想法吗?

sql-server trace

4
推荐指数
1
解决办法
546
查看次数

是否有可能减轻延迟持久性造成的数据丢失风险

由于磁盘性能较差,我需要使用 SQL Server 2016 中的延迟持久性设置进行评估。

微软明确表示,这会带来数据丢失的风险,因为事务是在内存中而不是在磁盘上提交的。

这种风险不仅限于 SQL Server 崩溃,其他原因也可能导致这种风险,例如服务器重新启动。

如果有人尝试重新启动服务器,是否有任何方法可以通过将 SQL Server 将数据闪存到磁盘来降低风险?我搜索过诸如事件触发之类的内容,但一无所获。

除了我上面提到的风险之外,您还认为我应该考虑其他风险吗?这是一个独立的 SQL Server,不参与故障转移群集,也不属于可用性组的一部分。


我提到的性能不佳与日志延迟有关;此 SQL Server 实例中等待时间最长的是 CX*,其次是 WriteLog。目前将事务写入磁盘需要 3-4 毫秒。这是关于云的,即使在 SQL Server 中激活 T1800 后,系统也会受到日志延迟的影响。我猜这与虚拟化/vSAN 固件和更深层次的卷设置有关;我们已经打开了供应商服务票,但为了以防万一供应商无法提供帮助,我必须调查所有可能提高性能的可能性。

sql-server transaction-log sql-server-2016

3
推荐指数
1
解决办法
294
查看次数