将变更事件流(预览版)配置到 Azure 事件中心

适用于: SQL Server 2025 (17.x)Azure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

本文介绍如何在 SQL Server 2025 (17.x)、Azure SQL 数据库、Azure SQL 托管实例 和 Microsoft Fabric 中的 SQL 数据库中配置变更事件流(CES)功能,以流式传输到 Azure 事件中心。

要将 CES 配置为 Fabric Eventstream,请参见 流式传输到 Fabric Eventstream

注释

变更事件流目前处于 预览阶段,不同 产品在支持性上存在差异。 在预览期间,此功能可能会更改。

变更事件流操作步骤

  1. 使用现有或创建新的 Azure 事件中心 命名空间和事件中心实例。 事件中心实例接收事件。
  2. 为用户数据库启用更改事件流式处理。
  3. 创建一个直播组。 使用此组,配置目标、凭据、消息大小限制和分区架构。
  4. 向流组添加一个或多个表。

本文的以下部分详细介绍了每个步骤。

先决条件

重要

截至2026年8月15日,AMQP协议在变更事件流(CES)中被弃用。 不同平台之间存在差异。 有关迁移步骤和时间表,请参见 AMQP协议弃用

若要配置更改事件流式处理,需要以下资源、权限和配置:

在 Azure SQL 托管实例中使用更改事件流式处理时,必须使用 SQL Server 2025 或 Always-up-to-date 更新策略配置实例。

配置 Azure 事件中心

若要了解如何创建 Azure 事件中心,请查看 使用 Azure 门户创建事件中心

Azure 事件中心访问控制

将 SQL 资源的访问控制配置为 Azure 事件中心。 Microsoft Entra身份验证是最安全的方法。 CES 支持 Azure SQL 数据库 和 Azure SQL 托管实例 中的 Microsoft Entra 认证。 对于 SQL Server 2025,从累积更新 3 (CU3) 开始,Microsoft Entra 身份验证支持由 Azure Arc 启用 或在 Azure 虚拟机上运行的实例。 虽然支持共享访问策略,但仅在Microsoft Entra身份验证不是选项时使用它们。

共享访问策略 向 Azure 事件中心提供身份验证和授权。 每个共享访问策略都需要名称、访问级别(ManageSendListen和资源绑定(事件中心命名空间或特定事件中心实例)。 实例级别策略通过遵循最低特权原则来提供更高的安全性。 虽然SQL 数据库引擎产品支持共享访问策略,但尽可能使用Microsoft Entra认证,因为它提供了更好的安全性。

如果你使用共享访问策略进行认证和授权,向事件中心实例发送数据的客户端需要提供他们想使用的策略名称以及该策略的 服务密钥

要配置流媒体到Azure 事件中心,请创建或重用带有发送权限的共享访问策略。 你可以用 服务密钥 (主密钥或次密钥值)进行认证。

注释

为了提高安全性,请尽可能使用基于 Microsoft Entra 的访问控制。 如果无法实现基于 Microsoft Entra 的访问控制,且你使用共享访问策略,最佳做法是定期轮换服务密钥。 使用 Azure 密钥保管库 或类似服务安全地存储所有机密。

定义策略

你需要一个带有 发送 权限的共享访问政策。 您可以选择:

  • 创建新策略

  • 使用现有策略

注释

策略必须具有 “发送” 权限。

确定策略后,记录服务键值。 在配置CES之前,你在SQL创建凭证时会用它和策略名称一起使用。

启用和配置变更事件流式处理

重要

截至2026年8月15日,AMQP协议在变更事件流(CES)中被弃用。 不同平台之间存在差异。 有关迁移步骤和时间表,请参见 AMQP协议弃用

若要启用和配置更改事件流式处理,请将数据库上下文更改为用户数据库,然后执行以下步骤:

  1. 如果尚未配置,请将数据库设置为 完整恢复模式
  2. 创建主密钥和数据库范围凭据。
  3. 启用事件流。
  4. 创建流组。
  5. 向流组添加一个或多个表。

以下示例展示了如何按平台实现CES:

下表列出了本节示例的示例参数值:

参数 示例值 注释
@stream_group_name N'myStreamGroup' 活动流组的名称。
@destination_location 参见注释 Azure 事件中心 命名空间的 FQDN 和实例名,包括端口 9093。 格式: <namespace>.servicebus.windows.net:9093/<instance>. 对于 Fabric Eventstream,可以使用自定义输入端点
@partition_key_scheme N'None' (默认)分区按轮询方式选择。 其他选项有 StreamGroupTableColumn
@max_message_size_kb 256 256 KB 是默认的最大消息大小。 将该数值与目的地限制相匹配。

示例还使用以下数值:

  • [可选,如果使用服务密钥共享访问策略] 从共享访问策略中提取的主键或次键值: Secret = 'BVFnT3baC/K6I8xNZzio4AeoFt6nHeK0i+ZErNGsxiw='
  • EXEC sys.sp_add_object_to_event_stream_group N'myStreamGroup', N'dbo.myTable'

示例:从 Azure SQL 数据库 流式传输到 Azure 事件中心

以下示例展示了如何使用 AzureEventHubs 作为 destination_type,将变更事件从 Azure SQL 数据库 流式传输到 Azure 事件中心。 该值是Microsoft Fabric中Azure SQL 数据库和SQL数据库唯一被接受的值。

本节示例使用了 Microsoft Entra 认证。 此方法是最安全的。

将尖括号 (<value>) 中的值替换为环境的值。

USE <database name>;

-- Create the Master Key with a password.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Password>';

CREATE DATABASE SCOPED CREDENTIAL <CredentialName>
    WITH IDENTITY = 'Managed Identity'

EXEC sys.sp_enable_event_stream

EXEC sys.sp_create_event_stream_group
    @stream_group_name =      N'<EventStreamGroupName>',
    @destination_type =       N'AzureEventHubs',
    @destination_location =   N'<AzureEventHubsHostName>:9093/<EventHubsInstance>',
    @destination_credential = <CredentialName>,
    @max_message_size_kb =    <MaxMessageSize>,
    @partition_key_scheme =   N'<PartitionKeyScheme>'

EXEC sys.sp_add_object_to_event_stream_group
    N'<EventStreamGroupName>',
    N'<SchemaName>.<TableName>'

示例:从 Azure SQL MI 或 SQL Server 2025 流式传输到 Azure 事件中心

以下示例说明如何将变更事件从 Azure SQL 托管实例 或 SQL Server 2025 流式传输到 Azure 事件中心,方法是使用 AzureEventHubsApacheKafka 作为 destination_type

重要

截至2026年8月15日,AMQP协议在变更事件流(CES)中被弃用。 不同平台之间存在差异。 有关迁移步骤和时间表,请参见 AMQP协议弃用

本部分中的示例使用 Microsoft Entra 身份验证通过 Apache Kafka 协议向 Azure 事件中心实例进行身份验证。 此方法是最安全的。

将尖括号 (<value>) 中的值替换为环境的值。

USE <database name>

-- Create the Master Key with a password.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Password>'

CREATE DATABASE SCOPED CREDENTIAL <CredentialName>
    WITH IDENTITY = 'Managed Identity'

EXEC sys.sp_enable_event_stream

EXEC sys.sp_create_event_stream_group
    @stream_group_name =      N'<EventStreamGroupName>',
    @destination_type =       N'AzureEventHubsApacheKafka',
    @destination_location =   N'<AzureEventHubsHostName>:<port>/<EventHubsInstance>', -- myEventHubsNamespace.servicebus.windows.net:9093/myEventHubsInstance
    @destination_credential = <CredentialName>,
    @max_message_size_kb =    <MaxMessageSize>,
    @partition_key_scheme =   N'<PartitionKeyScheme>'

EXEC sys.sp_add_object_to_event_stream_group
    N'<EventStreamGroupName>',
    N'<SchemaName>.<TableName>'

要确认流媒体是否已启用并查看流组配置的表,请参见 查看CES配置和功能

消息大小与列截断

Azure 事件中心 和 Fabric Eventstream 限制了它们收到的每条消息的最大大小。 CES使用该 @max_message_size_kb 设置将大型外发事件拆分成多个消息块,以匹配配置的目的地。 将这个数值设置为与目的地的限制对齐。 关于标识消息块的 JSON 属性,请参见 JSON 消息格式 - 变更事件流

如果一个或多个流式传输的列值大于 1 MB,CES 会在形成出站事件之前,将每个受影响的列值截断为 1 MB。 1 MB 限制分别适用于每个列值。 这种截断与消息拆分是分开的。 在截断超大列值后,CES 会构建出站事件,并根据 @max_message_size_kb 视需要将其拆分为多个块,然后将每个块发送到目标端。

将服务器配置选项 max text repl size 设置为允许在启用 CES 时向 LOB 列写入超过 65,536 字节的数据。

例如,如果一行有五列,前三列值都大于1 MB,CES:

  1. 将第一列值截断为1 MB。
  2. 将第二列值截断为1 MB。
  3. 将第三列值截断为1 MB。
  4. 准备出站事件,根据 @max_message_size_kb 将其拆分为所需数量的块,并将每个块发送到目标位置。

注释

列数据截断是无条件的。 CES会截断每个大于1 MB的流列值,且在截断发生时不会记录错误或警告。

查看 CES 配置和功能

sys.databases 中, is_event_stream_enabled = 1 指示为数据库启用了更改事件流式处理。

以下查询返回启用了更改事件流式处理的所有数据库:

SELECT *
FROM sys.databases
WHERE is_event_stream_enabled = 1;

sys.tables 中,is_replicated = 1 表示表已启用流式传输,而 sp_help_change_feed_table 提供有关变更事件流式传输的表组和表元数据的信息。

以下查询返回启用了更改事件流式处理的所有表,并提供元数据信息:

SELECT name,
       is_replicated
FROM sys.tables;

EXECUTE sp_help_change_feed_table
    @source_schema = '<schema name>',
    @source_name = '<table name>';

CES 存储过程、系统函数和 DMV

下表列出了可用于配置、禁用和监视更改事件流的存储过程、系统函数和 DMV:

System 对象 DESCRIPTION
配置 CES
sys.sp_enable_event_stream 为当前用户数据库启用 CES。
sys.sp_create_event_stream_group 创建流组,即一组表的流配置。 流组还定义了目标和相关详细信息(例如身份验证、消息大小、分区)。 该过程完成后,会自动为最终用户生成并显示stream_group_id。
sys.sp_add_object_to_event_stream_group 将表添加到流组中。
禁用 CES
sys.sp_remove_object_from_event_stream_group 从流组中移除表。
sys.sp_drop_event_stream_group 删除流组。 流组必须未被使用。
sys.sp_disable_event_stream 为当前用户数据库禁用 CES。
监控 CES
sys.dm_change_feed_errors 返回传输错误。
sys.dm_change_feed_log_scan_sessions 返回有关日志扫描活动的信息。
sys.sp_help_change_feed_settings 提供已配置变更事件流的状态和信息。
sys.sp_help_change_feed 监控变更流的当前配置。
sys.sp_help_change_feed_table_groups 返回用于配置更改事件流式处理组的元数据。
sys.sp_help_change_feed_table 提供变更事件流的流组状态和信息以及表元数据。

事务日志增长

由于保证消息传递,已启用 CES 的数据库的事务日志可以继续增长。 只要日志中还有待传输的 CES 变更,就会阻止日志截断。 事务日志大小达到最大定义的限制后,写入数据库会失败。

若要在 Azure SQL 数据库和 Azure SQL 托管实例中防止这种情况,当事务日志大小接近最大定义的限制时,Microsoft可能会禁用 CES 或终止长时间运行的事务。 对于非托管 SQL Server 实例(例如本地或 Azure VM 上的 SQL Server),你负责监视事务日志大小并确保它未达到最大定义的限制,并根据需要手动禁用 CES 或终止长时间运行的事务。

禁用 CES 或终止长时间运行的事务后,将截断事务日志以释放空间。 CES 被禁用后,您必须手动重新启用它,或者重试任何被终止的长时间运行的事务。 在 CES 禁用期间所做的数据更改不会被捕获。 只有在 CES 重启后所做的更改才会被流式传输。

下面是一份可能会导致启用 CES 的事务日志增长的典型情境列表:

  • 持久性错误。 CES 会重试发送被反复拒绝的消息,且 CES 无法继续运行。 导致拒绝消息的持久性错误的原因包括:
    • 网络问题或配置错误。
    • 凭据配置错误。
    • 目标拒绝的最大消息大小配置错误。
  • 目标端对传入的事件进行了限流。 例如,Azure 事件中心会根据其 SKU 进行速率限制。
  • 长时间运行的事务会生成大量日志记录并防止日志截断。

为确保运行顺畅,请定期监控事务日志的大小和 CES 传递错误

性能

在 SQL Server、Azure SQL 托管实例和 Azure SQL 数据库弹性池上,可以在多个数据库上启用 CES。 每个已启用 CES 的数据库都会消耗服务器资源,并与其他服务器工作负荷竞争。 确保为预期的工作负荷提供足够的资源,并定期监视服务器和数据库的性能。

局限性

变更事件流 (CES) 具有以下限制:

平台特定限制

在配置非UTC时区的SQL产品中,committime变更事件流消息中的字段错误地包含了Z后缀,尽管该字段显示的是发布数据库的本地时间。 当数据库使用UTC时,值和后缀是一致的。 这是一个已知问题,修复将在该功能的后续版本中提供。

以下限制适用于CES的特定平台:

SQL Server 2025 中的 CES 具有以下限制:

服务器级和通用限制

以下列表描述了服务器层面及一般性的限制:

  • Linux 上的 SQL Server 2025 (17.x) 不支持 CES。
  • CES 仅针对来自INSERTUPDATEDELETE DML 语句的数据更改发出事件。
  • CES 不会处理架构更改(DDL 操作),这意味着它不会为 DDL 操作生成事件。 但是,DDL 操作不会被阻止,因此,如果执行它们,后续 DML 事件的架构将反映更新的表结构。 你需要顺利地处理具有已更新架构的事件。
  • 目前,CES 不会对在启用 CES 之前表中已有的数据进行流传输。 启用 CES 时,不会对现有数据进行初始化或作为快照文件发送。
  • 如果消息超出 Azure 事件中心消息大小限制,则目前只能通过扩展事件观察到失败。 CES xEvent 目前仅在 SQL Server 2025 中可用,而不是 Azure SQL 数据库。
  • 不支持对已配置为 CES 的表和列进行重命名。 重命名表或列失败。 允许数据库重命名。
  • CES 不适用于使用 SQL Server 2022 更新策略配置的 Azure SQL 托管实例。 它仅适用于使用 SQL Server 2025 或 Always-up-to-date 更新策略配置的实例。
  • 使用 Kafka 协议时,CES 不支持 SAS 令牌认证。 唯一可用的认证方法是 Microsoft Entra 和共享访问策略密钥值。

数据库级限制

以下列表描述了数据库层面的局限性:

表级限制

以下列表描述了表级限制:

  • 一个表只能属于一个流式传输组。 不能将同一个表流式传输到多个目标。
  • 只能为 CES 配置用户表。 CES 不支持流式传输系统表。
  • 在表上启用 CES 时,不能在该表上添加或删除主键约束。
  • 包含句号(.)的表名目前不被支持。
  • ALTER TABLE SWITCH PARTITION 不支持在针对 CES 进行配置的表中使用。
  • 已启用 CES 的表不支持 TRUNCATE TABLE
  • CES 不支持使用以下任何功能的表:
    • 聚集列存储索引
    • 临时历史记录表或账本历史记录表
    • 始终加密 (Always Encrypted)
    • 内存 OLTP(内存优化表)
    • 图形表
    • 外部表

重要

联机索引作 可以生成大量事务日志记录。 CES 必须处理更多的数据,这可能会导致事件延迟增加。

列级限制

以下列表描述了列级限制:

  • CES 不支持以下数据类型。 流式传输会跳过以下类型的列:
    • geography
    • geometry
    • image
    • json
    • rowversion / 时间戳
    • sql_variant
    • 文本 / ntext
    • 矢量
    • xml
    • 用户定义的类型 (UDT)
  • 如果一个或多个流式传输的列值大于 1 MB,CES 会在形成出站事件之前,将每个受影响的列值截断为 1 MB。 这种截断是无条件的,不会记录错误或警告。 将服务器配置选项 max text repl size 配置为在启用 CES 时允许向 LOB 列中写入超过 65,536 字节的数据。

源数据库和数据存储位置中的权限设置

以下列表描述了权限和数据驻留限制:

  • 对于行级安全性,CES 会发送所有行的更改,无论用户权限如何。
  • 动态数据掩码不适用于通过 CES 发送的数据。 数据以未掩码形式流式传输,即使已配置掩码。
  • CES 不会发出与对象级权限更改相关的事件(例如,向特定列授予权限)。
  • 如果网络配置允许,CES 会将数据传输到配置的目标。 如果目标位于其他区域,CES 会跨区域流式传输数据。 确保这符合数据驻留和合规性要求。

网络和连接

以下列表描述了网络和连接的限制:

  • 目前,CES 只能传输到 Azure 事件中心公共终结点。 目前不支持服务终结点和专用终结点。
  • 在Azure SQL 托管实例或SQL Server 2025(针对尚未迁移的现有流组)使用AMQP协议时,将Azure 事件中心的最低TLS版本配置选项设置为1.2。 CES无法在AMQP协议上支持TLS 1.3。