我正在尝试添加扩展事件会话来跟踪备份完成事件。
我这样做是在可用性组的辅助节点上执行此操作的先导RESTORE HEADERONLY ... LOADHISTORY
,目的是两个 AG 节点在msdb.dbo.backupset
相关表中都具有准确的详细信息。 由于我们使用的是 SQL Server 2019,因此无法选择包含可用性组。我们还使用分布式可用性组,这排除了包含 AG,因此即使我们可以升级到 SQL Server 2022,包含 AG仍然无济于事。
扩展事件定义是:
CREATE EVENT SESSION [backup_finished]
ON SERVER
ADD EVENT [D5149520-6282-11DE-8A39-0800200C9A66].[sqlserver].[backup_restore_progress_trace]
(
ACTION
(
[sqlserver].[client_app_name]
, [sqlserver].[client_hostname]
, [sqlserver].[database_name]
, [sqlserver].[nt_username]
, [sqlserver].[server_principal_name]
, [sqlserver].[session_id]
, [sqlserver].[sql_text]
)
WHERE
(
/* this is the database name where the BACKUP operation took place, not the database being backed up. */
[CE79811F-1A80-40E1-8F5D-7445A3F375E7].[sqlserver].[database_name] = N'maintenance'
/* this is the name of the database that was backed up */
AND [database_name] = N'<database_of_interest>'
/* 'Backup' or 'Restore' */
AND [operation_type] = N'Backup'
/*
0 -> Information of major steps in the operation
1 -> Verbose I/O related information
*/
AND [trace_level] = 0
AND
(
/* the trace_message contains one or more characters at the end */
[trace_message] LIKE N'BACKUP DATABASE finished%'
OR [trace_message] LIKE N'BACKUP LOG finished%'
)
)
)
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
[D5149520-6282-11DE-8A39-0800200C9A66]
是 的模块 GUID sqlmin.dll
,其中包含扩展事件的代码[backup_restore_progress_trace]
。
[CE79811F-1A80-40E1-8F5D-7445A3F375E7]
是 的模块 GUID sqllang.dll
,其中包含大部分[sqlserver]
扩展事件代码。
在 where 子句中,我有两个谓词[database_name]
; 第一个[CE79811F-1A80-40E1-8F5D-7445A3F375E7].[sqlserver].[database_name] = N'maintenance'
将捕获的事件限制为在数据库上下文中执行的语句maintenance
。该谓词完全使用模块 GUID 进行限定,以将其与同名的[database_name]
事件字段名称区分开来。
[database_name]
、[operation_type]
、[trace_level]
和谓词[trace_message]
不完全限定,因为我无法确定如何完全限定它们。
我尝试使用我能找到的每个模块 GUID 来限定不合格谓词,但是它们都没有解析,当我尝试创建扩展事件时返回此错误:
消息 25706,级别 16,状态 8,第 62
行 找不到事件属性或谓词源“6D503F55-3041-4A62-BB8C-57C3CF081B7B.sqlserver.database_name”。
消息 15151,级别 16,状态 22,第 105 行
无法更改事件会话“backup_finished”,因为它不存在或您没有权限。
此查询中列出了模块列表及其 guid:
SELECT
[module_guid] = QUOTENAME([dxp].module_guid)
, [package_name] = QUOTENAME([dxp].[name])
, [module_file_name] = RIGHT([dolm].[name], CHARINDEX(N'\', REVERSE([dolm].[name])) - 1)
FROM
[sys].[dm_xe_packages] [dxp]
INNER JOIN [sys].[dm_os_loaded_modules] [dolm] ON [dxp].[module_address] = [dolm].[base_address]
ORDER BY
[dxp].[name];
我的服务器的结果:
模块向导 | 包裹名字 | 模块文件名 |
---|---|---|
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [文件流] | sqllang.dll |
[5B2DA06D-898A-43C8-9309-39BBBE93EBBD] | [包0] | sqldk.dll |
[30E37A45-E152-4943-9189-2B235FCC4A6F] | [质量要求] | qds.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [安全审计] | sqllang.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [sqlclr] | sqllang.dll |
[5B2DA06D-898A-43C8-9309-39BBBE93EBBD] | [sqlos] | sqldk.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [SQL卫星] | sqllang.dll |
[6D503F55-3041-4A62-BB8C-57C3CF081B7B] | [sql服务器] | sqllang.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [sql服务器] | sqllang.dll |
[D5149520-6282-11DE-8A39-0800200C9A66] | [sql服务器] | sqlmin.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [sqlsni] | sqllang.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [UCS] | sqllang.dll |
[C2FE5706-A411-4F95-AFB1-5430439C8DE6] | [xesvlpkg] | svl.dll |
[DD554AF1-C3F5-4C5E-8F83-C31C49957F3F] | [Xtp编译] | hk编译.dll |
[D0234D96-8A83-4636-A717-41459AF88D71] | [Xtp引擎] | hkengine.dll |
[DE0EFEC2-B9F3-45C8-9FCA-8247CB57109C] | [Xtp运行时] | hkruntime.dll |
有谁知道我应该使用什么来完全限定不合格的谓词?
您可以使用事件名称限定字段以区分它们。
例如
[backup_restore_progress_trace].[database_name]
与[sqlserver].[database_name]
。完整会议:
回顾
为了简化问题:有一个名为冲突的列
database_name
(一个来自全局操作,另一个是事件的列)。您希望具有确定性,因此添加更多资格是有意义的。但少用实际上是有效的。
事件列不必是限定的。操作列应该被限定
sqlserver.
(即使它们都位于同一个包中)。我猜想有一些短路逻辑首先搜索最近的上下文。
MVP
这按预期工作。
在 GUI 中设置过滤器向我们展示了同样的事情。
从 GUI 中编写脚本将为我们提供类似于上面示例的 TSQL(尽管有更多的括号)
模块指南
我也测试了完全合格的路径。CREATE SESSION文档提到了可选选项
module_guid
,根据我的测试,它有效:database_name
它不适用于任何谓词 - 与您的问题相同。
我不明白为什么它不起作用,但它不起作用。我已经
error_reported
用一个callstack
动作捕获了 并得到了这个(我已经缩进了有趣的部分)因此它在绑定过程中失败,但我认为我们无法获得比这更多的信息。我找到的关于此的唯一一篇文章是:Secrets,hints,andtipsforSQLServerExtendEvents