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 / 问题 / 337678
Accepted
Joe Obbish
Joe Obbish
Asked: 2024-03-13 03:53:24 +0800 CST2024-03-13 03:53:24 +0800 CST 2024-03-13 03:53:24 +0800 CST

如何防止 SQL Server 将 XE 会话的启动和停止记录到服务器日志文件中?

  • 772

我有一个启动和停止扩展事件会话的进程,以便将数据从事件文件传输到 SQL 表中。在 SQL Server 2022 RTM 服务器上,我看到此进程写入日志文件中的许多行:

在此输入图像描述

我希望 XE 会话的启动和停止不写入日志文件,因为我的日志文件现在充满了这些条目。Microsoft SQL Server 2019 (RTM-CU22-GDR) 实例上不会发生此行为。

如何防止 SQL Server 将 XE 会话的启动和停止记录到服务器日志文件中?

sql-server
  • 1 1 个回答
  • 53 Views

1 个回答

  • Voted
  1. Best Answer
    Sean Gallardy
    2024-03-13T09:10:28+08:002024-03-13T09:10:28+08:00

    读者注意:这是使用Microsoft Symbols Server中的公共符号完成的。

    对于 SQL Server 2022 RTM,错误日志启动项和停止项分别在XEventController::AlterEventSession和函数中生成。XEventController::VLR_StopXESession::CommitAndReleasesqllang.dll

    开始写入

    先看start函数,这是一个非常大的函数,0x107e之前的调用:

    sqllang!XEventController::AlterEventSession+0x106d:
    00007ff8`d1fa940d 488d95c80a0000  lea     rdx,[rbp+0AC8h]
    00007ff8`d1fa9414 b999640000      mov     ecx,6499h
    00007ff8`d1fa9419 e8a2f62301      call    sqllang!scierrlog 
    

    into正在加载并传递给mov我们,我们可以推断出写入消息的错误号,这确实( ) 与公共文档匹配。ecx0x6499sqllang!scierrlog0x64990n25753

    25753 XE 会话“%s”已启动。

    查看可能运行代码的项目,有一个分支指向该方向sqllang!XEventController::AlterEventSession+0x101f

    00007ff8`d1fa93d5 488d542468      lea     rdx,[rsp+68h]
    00007ff8`d1fa93da 488d8d900a0000  lea     rcx,[rbp+0A90h]
    00007ff8`d1fa93e1 ff1551e52a02    call    qword ptr [sqllang!XE_API::sm_ClientAPI+0xa8 (00007ff8`d4257938)]
    00007ff8`d1fa93e7 85c0            test    eax,eax
    00007ff8`d1fa93e9 7522            jne     sqllang!XEventController::AlterEventSession+0x106d
    

    似乎没有跟踪标志或其他容易设置的检查,事实上它似乎依赖于函数指针的返回sqllang!XE_API::sm_ClientAPI+0xa8。我想说,对于启动错误日志项,没有一种易于配置的方法来将其关闭。

    鉴于您现在知道在哪里可以找到它,您可以注入自己的代码和NOP(或)显然不支持的jmp调用。scierrlog

    查看 SQL Server 2019 CU24 实例,同一函数没有对错误日志的引用,并且有许多不同的更改。该功能似乎是在 2022 年添加的,但没有向后移植到 2019 年。

    停止写入

    有趣的是,停止不在同一个函数中,因为开始是AlterEventSession人们认为将用于ALTER事件会话的 T-SQL 命令🤷‍♂️

    幸运的sqllang!XEventController::VLR_StopXESession::CommitAndRelease是,它的函数要小得多。根据我们从之前的函数调查中学到的知识,将加载ecx相应的错误号,然后调用scierrlog. 果然,它就在那里,而且很容易在函数的开头找到!

    00007ff8`d1fa8105 488d9570020000  lea     rdx,[rbp+270h]
    00007ff8`d1fa810c 488b4938        mov     rcx,qword ptr [rcx+38h]
    00007ff8`d1fa8110 ff152af82a02    call    qword ptr [sqllang!XE_API::sm_ClientAPI+0xb0 (00007ff8`d4257940)]
    00007ff8`d1fa8116 488d95a8020000  lea     rdx,[rbp+2A8h]
    00007ff8`d1fa811d b99a640000      mov     ecx,649Ah
    00007ff8`d1fa8122 e899092401      call    sqllang!scierrlog
    

    这里我们可以看到( ) 加载了ecx32 位值,然后调用了,奇怪的是在此之前有一个类似的调用,但偏移量却大不相同。无论如何,调用的返回没有条件测试,因此它总是将其写入错误日志,并且似乎根本不受跟踪标志或其他机制的控制。这比开始组装要直接得多。0x649A0n25754scierrlogsqllang!XE_API::sm_ClientAPI

    25754 XE 会话“%s”正在停止。

    同样的选项也适用于此,用 s 覆盖 call 指令NOP。

    针对前面提到的相同 SQL 2019 CU24 实例检查此函数,还会在函数开头显示相当多不同的代码,这似乎没有错误日志调用,也没有向后移植(无论好坏)。

    最努力

    可以说可以支持的一种方法是制作一个非常小的文件系统过滤器驱动程序来检查专门对错误日志文件的文件写入,并检查正在写入的数据是否是您真正不想要的数据。然后你可以悄悄地把它扔掉,没有人会知道,日志也不会显示它,并且希望过滤器驱动程序不会有错误或破坏环境中的任何其他内容。

    最省力

    向 Microsoft 提交支持票证,并要求对产品进行更改,以选择关闭消息记录的选项,以便有支持的方式。

    • 5

相关问题

  • 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