SQL Server 2025 では Change Event Streaming (CES) という機能が追加されます。
この機能を使用すると、テーブルに対しての変更を Azure Event Hubs に自動的に送信することができ、Stream Analytics 等を使用して他のデータストアにストリーミングする仕組みを構築することができるようになります。
本機能について、個人的に気になった点をまとめておきたいと思います。
Contents
SQL Server が更新されたデータを連携する方式
SQL Server から更新されたデータを連携する方法はいくつかの方式があります。
大きく分類すると次のような 3 種類のなるのではないでしょうか。
- 可用性のための機能を使用
- データの変更を追跡
- トランザクションログから変更データ取得
可用性のための機能を使用
この方式は、Always On 可用性グループ / Managed Instance リンク で使用されているものとなり、SQL Server ベースのデータベースエンジンとデータの同期を行うために使用されます。
「データベース全体を同期」するために使用されるものとなり、データベースで発生した全てのトランザクションログを同期先に転送することで「同一のデータベースの状態を作成する」ことを目的とした機能となります。
この機能は SQL Server ベースの環境間の同期を目的としたものとなりますので、他のデータストアへの同期には使用することはできません。
トランザクションログのデータを連携するという機能ではあるのですが、ログキャッシュの活用 / 転送データの圧縮可否の制御、というようにトランザクションログの読み取り負荷を緩和させることが意識されたアーキテクチャとなっています。
データの変更を追跡
この方式は、変更の追跡 で使用されているものとなり、有効化したテーブル単位で、「変更されたデータを追跡する」ことを目的として使用されます。
実装としてはトリガーのような方式で実行されており、「データの変更が行われた際に主キーの情報をサイドテーブルに保存する」という機能となっているため、多少ですがベーステーブルに対しての操作のオーバーヘッドが発生することになります。
主キーの設定されているテーブルにのみ有効化することができ、サイドテーブルには主キーの情報のみ保存されていますので、「実際に変更されたデータの最新の状態」を取得するためには、実データが格納されているテーブルの参照が必要となります。
実装はシンプルなのですが、変更されたデータの活用にはひと手間をかける必要があります。
トランザクションログから変更データを取得
この方式は、レプリケーション / 変更データキャプチャ (CDC) / Synapse Link / Fabric ミラーリング で使用されているものとなります。
これらの方式では「テーブル単位で有効化し、有効化されたテーブルの変更データをトランザクションログから読み込む」ことで、同期用データの生成を行う方法となります。
「変更データキャプチャ (CDC)」は、データベース内に作成されたサイドテーブルに対してデータを自動的に格納しますが、それ以外の方式については、サポートされる同期先に対して変更の反映が行われます。
この方式は「トランザクションログから直接データを読み込む」ものとなり、機能の組み合わせに制限が出るケースがあります。
(Synapse Link、Fabric ミラーリング については、CDC / レプリケーションが有効になっている場合、サポートが行われません)
制限が出るケースについては「トランザクションログの直接読み取りをする処理」の競合の影響が大きく出ており、トランザクションログを直接読み取るようなプロセスが複数起動されている場合の処理の複雑性に起因しているのかと思います。
SQL Server 2025 で実装された CES は、上記の方式の中の「トランザクションログから変更されたデータを取得」する方式が採用されています。
CES の制約について
前述のとおり、「トランザクションログから変更されたデータを取得する」方式では制限がつくケースがあり、これは CES も該当しています。C
制限事項 に制限事項は記載されています。
CES は Synapse Link / Fabric ミラーリングと同様に CDC / トランザクションレプリケーション / Fabric ミラーリングを有効にしているデータベースではサポートされていません。(仕組みとしては Synapse Link が有効なデータベースもサポートしていないはずです)
注意
現在、変更データ キャプチャ (CDC)、トランザクション レプリケーション、または SQL Server 用ファブリック ミラー化データベースを使用して構成されたデータベースでは、CES はサポートされていません。
細かな制約やいくつかありますが、前提としてトランザクションログからデータを読み取りテーブル単位でデータの同期をする仕組みを使用している場合、CES を有効にすることができないことを考慮しておく必要があります。
CES の挙動の確認
CES の基本的な挙動を確認するためのクエリ
CES を有効化するためには次のような作業を行います。
CREATE DATABASE CES GO USE CES GO -- データベースマスターキーの作成 CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong Password>' GO -- Event Hubs の共有アクセスポリシーを資格情報として追加 (送信を許可するポリシーの情報を設定) CREATE DATABASE SCOPED CREDENTIAL CES WITH IDENTITY = 'CESPolicy', -- 共有アクセスポリシー名 SECRET = '<アクセスポリシーのキー>' GO -- テスト用のテーブルを作成 DROP TABLE IF EXISTS T1 CREATE TABLE T1 (C1 int, C2 int, C3 nvarchar(100)) GO -- CES の有効化 EXEC sys.sp_enable_event_stream GO EXEC sys.sp_create_event_stream_group @stream_group_name = N'myStreamGroup', @destination_type = N'AzureEventHubsAmqp', @destination_location = N'<Event Hubs リソース名>.servicebus.windows.net/<Event Hubs 名>', @destination_credential = CES, @partition_key_scheme = N'None' GO EXEC sys.sp_add_object_to_event_stream_group N'myStreamGroup', N'dbo.T1' GO -- 設定の確認 EXEC sp_help_change_feed_table @source_schema = 'dbo', @source_name = 'T1' GO
これにより、指定したテーブルの更新をトランザクションログから読み取り、Event Hubs に送信することが可能となります。
指定したテーブルにデータを更新操作を行うと次のように、Event Hubs にデータの連携が行われます。
JSON のメッセージ形式については JSON メッセージ形式 – イベント ストリーミングの変更 に記載されており、どのようなフォーマットの情報が送信されているのかについてはこの情報から確認できます。(operation は INS / UPD / DEL があり、どの操作のデータなのかを確認できます)
CES の各種情報の確認方法
CES についての操作をクエリで実施するためには CES ストアド プロシージャ、システム関数、DMV / CES アクティビティ (処理されたイベント、エラーなど) を監視するにはどうすればよいですか? に記載されている情報を使用できます。
基本的には、Synapse Link / Fabric ミラーリング で使用されている変更フィードの機能と同様の確認方法で、各種情報を取得することができます。
この二種類の DMV を確認する機会が多いように思えます。
トランザクションログの読み取り状況については、sys.dm_change_feed_log_scan_sessions から確認することができ、10 秒程度の間隔でトランザクションログの読み取りが行われていることが確認できます。
Event Hubs にデータの連携ができていない場合、エラーの内容が sys.dm_change_feed_errors に出力されますので、Event Hubs にデータが送信されていない場合はこの DMV を確認することで、エラーの理由を把握することができます。
本節に記載されている情報を確認することで、CES の挙動を確認する一助となるかと思います。
まとめ
SQL Server 2025 で新しく追加された CES を使用することで、容易に SQL Server のテーブルのデータを Event Hubs に送信することができるようになりました。
SQL Server のデータを Azure の他のサービスで使用したい場合の連携方法として、CES + Event Hubs を使用したデータ連携が今後の SQL Server で検討することができるようになります。
フォーマットの柔軟性はないのですが、Event Hubs の基本機能を検証したい時などに、SQL Server のスキルだけで Event Hubs にデータを送信することができるのは面白いなと感じました。