AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 339371
Accepted
Hannah Vernon
Hannah Vernon
Asked: 2024-05-10 01:44:23 +0800 CST2024-05-10 01:44:23 +0800 CST 2024-05-10 01:44:23 +0800 CST

如何完全限定 [backup_restore_progress_trace] 扩展事件的事件谓词?

  • 772

我正在尝试添加扩展事件会话来跟踪备份完成事件。

我这样做是在可用性组的辅助节点上执行此操作的先导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

有谁知道我应该使用什么来完全限定不合格的谓词?

sql-server
  • 2 2 个回答
  • 76 Views

2 个回答

  • Voted
  1. Best Answer
    Paul White
    2024-05-15T05:51:28+08:002024-05-15T05:51:28+08:00

    您可以使用事件名称限定字段以区分它们。

    例如[backup_restore_progress_trace].[database_name]与[sqlserver].[database_name]。

    完整会议:

    CREATE EVENT SESSION [backup_finished] 
    ON SERVER 
    ADD EVENT 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 
        (
            (
                (
                    (
                        (
                            [sqlserver].[database_name]=N'maintenance'
                        )
                        AND 
                        (
                            [backup_restore_progress_trace].[database_name]=N'database_of_interest'
                        ) 
                    ) 
                    AND 
                    (
                        [backup_restore_progress_trace].[operation_type]=(0)
                    )
                ) 
                AND 
                (
                    [backup_restore_progress_trace].[trace_level]=(0)
                )
            ) 
            AND 
            (
                [sqlserver].[like_i_sql_unicode_string]
                (
                    [backup_restore_progress_trace].[trace_message],
                    N'BACKUP DATABASE finished%'
                )
                OR
                [sqlserver].[like_i_sql_unicode_string]
                (
                    [backup_restore_progress_trace].[trace_message],
                    N'BACKUP LOG finished%'
                )
            )
        )
    );
    
    • 5
  2. Zikato
    2024-05-15T04:04:20+08:002024-05-15T04:04:20+08:00

    回顾

    为了简化问题:有一个名为冲突的列database_name(一个来自全局操作,另一个是事件的列)。

    您希望具有确定性,因此添加更多资格是有意义的。但少用实际上是有效的。

    • 操作列指的是正在运行代码的数据库
    • 事件列指备份/恢复操作的目标

    事件列不必是限定的。操作列应该被限定sqlserver.(即使它们都位于同一个包中)。

    我猜想有一些短路逻辑首先搜索最近的上下文。

    MVP

    /* minimal definition */
    DROP EVENT SESSION [backup_restore_progress_trace] ON SERVER 
    go
    CREATE EVENT SESSION [backup_restore_progress_trace] ON SERVER 
    ADD EVENT sqlserver.backup_restore_progress_trace
    (
        ACTION
        (
            sqlserver.[database_name]
        )
        WHERE 
            [database_name] = N'msdb'
            AND sqlserver.[database_name] = N'master'
    )
    GO
    
    /* ran a backup command of msdb from the context of master db - this should be captured */
    USE master
    go
    BACKUP database msdb TO DISK = 'NUL'
    
    * ran a backup command of msdb from the context of msdbdb - this should NOT be captured */
    go
    USE msdb
    go
    BACKUP database msdb TO DISK = 'NUL'
    

    这按预期工作。

    在此输入图像描述

    在 GUI 中设置过滤器向我们展示了同样的事情。

    在此输入图像描述

    从 GUI 中编写脚本将为我们提供类似于上面示例的 TSQL(尽管有更多的括号)

    模块指南

    我也测试了完全合格的路径。CREATE SESSION文档提到了可选选项module_guid,根据我的测试,它有效:

    • 在事件层面上
    • 为了行动 database_name

    它不适用于任何谓词 - 与您的问题相同。

    我不明白为什么它不起作用,但它不起作用。我已经error_reported用一个callstack动作捕获了 并得到了这个(我已经缩进了有趣的部分)

    sqllang!XeSqlPkg::CollectClientAppNameActionInvoke
    sqllang!XeSqlPkg::CollectSessionIdActionInvoke
    sqllang!XeSqlPkg::CollectSqlText<XE_ActionForwarder>
    sqllang!XeSqlPkg::CollectSqlTextActionInvoke
    sqllang!XeSqlPkg::CollectTSqlStack<XE_ActionForwarder>
    sqllang!XeSqlPkg::CollectTSqlStackActionInvoke
    sqllang!XeSqlPkg::error_reported::Publish
    sqllang!ErrorReportedAutoPublish::Publish
    sqllang!CErrorReportingManager::CwchFormatAndPrint
    sqllang!ex_vcallprint_no_dump
    sqllang!MSQLErrorHandlerFunc
    sqldk!CallExceptionHandler
        sqldk!ex_raise2
        sqldk!ex_raise
        sqllang!CXE_PredicateCompiler::CompilePredicate
        sqllang!CXE_PredicateCompiler::CompilePredicate
        sqllang!CXE_Predicate::Bind
        sqllang!CXE_Event::Bind
        sqllang!XEventController::StoreEventSession
    sqllang!CStmtCreateEventSession::XretExecute
    sqllang!CMsqlExecContext::ExecuteStmts<0,1>
    sqllang!CMsqlExecContext::FExecute
    sqllang!CSQLSource::Execute
    sqllang!process_request
    

    因此它在绑定过程中失败,但我认为我们无法获得比这更多的信息。我找到的关于此的唯一一篇文章是:Secrets,hints,andtipsforSQLServerExtendEvents

    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve