由于应用程序的数据一致性问题(零星数据丢失),我必须深入研究事务处理。我创建了一个扩展事件会话:
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 版本过时,我必须使用服务器端跟踪来收集一些信息,但如果我尝试实现它,则会收到错误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)
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 2016 中的延迟持久性设置进行评估。
微软明确表示,这会带来数据丢失的风险,因为事务是在内存中而不是在磁盘上提交的。
这种风险不仅限于 SQL Server 崩溃,其他原因也可能导致这种风险,例如服务器重新启动。
如果有人尝试重新启动服务器,是否有任何方法可以通过将 SQL Server 将数据闪存到磁盘来降低风险?我搜索过诸如事件触发之类的内容,但一无所获。
除了我上面提到的风险之外,您还认为我应该考虑其他风险吗?这是一个独立的 SQL Server,不参与故障转移群集,也不属于可用性组的一部分。
我提到的性能不佳与日志延迟有关;此 SQL Server 实例中等待时间最长的是 CX*,其次是 WriteLog。目前将事务写入磁盘需要 3-4 毫秒。这是关于云的,即使在 SQL Server 中激活 T1800 后,系统也会受到日志延迟的影响。我猜这与虚拟化/vSAN 固件和更深层次的卷设置有关;我们已经打开了供应商服务票,但为了以防万一供应商无法提供帮助,我必须调查所有可能提高性能的可能性。