
SQL Server の CDC ジョブを長期間運用していると、ソーステーブルへのカラム追加などのスキーマ変更は避けられません。これまでこうした変更が発生すると、変更データの損失リスクを避けるためにフルリフレッシュが必要になるケースがありました。本記事では、そのようなフルリフレッシュが不要となる、v26.3 で追加された SQL Server CDC のスキーマ変更対応について、仕組みと設定手順を解説します。
従来の課題
SQL Server の CDC は、テーブルごとに「キャプチャインスタンス」という単位で変更データを記録します。キャプチャインスタンスは CDC 有効化時に作成され、対象テーブルのカラム構成をもとに変更データを格納するテーブルとファンクションが生成される仕組みです。
ここで問題になるのが、CDC 稼働中にソーステーブルのスキーマが変わるケースです。既存のキャプチャインスタンスは有効化した時点のカラム構成のままであり、新しく追加されたカラムを認識しません。この状態を放置すると、変更データを正しく取得できなくなるリスクがあります。
これを避けるための現実的な選択肢は、フルリフレッシュで全件再連携することでした。しかしこれはテーブルサイズが大きいほど処理時間がかかり、その間はレプリケーションが止まってしまいます。スキーマ変更のたびにこの対応が必要になる運用は、担当者にとって大きな負担でした。
複数キャプチャインスタンスのサポート
SQL Server は 1 つのテーブルに対して、最大 2 つのキャプチャインスタンスを同時に持てる仕組みを備えています。これにより、既存のキャプチャインスタンスで変更データを記録し続けながら、新しいカラム構成に対応した新しいキャプチャインスタンスを追加で作成できます。
v26.3 より前の CData Sync には、この複数キャプチャインスタンスの存在を検出し、移行を管理する仕組みがありませんでした。v26.3 では、CData Sync がこの 2 つのキャプチャインスタンスを検出し、旧インスタンスから新インスタンスへの移行を自動的に管理するようになりました。これにより、ソーステーブルのスキーマが変更されても、既存のキャプチャ設定を残したまま、レプリケーションを中断せずに新しいインスタンスへ移行できます。
自動切替の仕組み
CData Sync は各 CDC ジョブの実行開始時に、対象テーブルに存在するアクティブなキャプチャインスタンスを確認します。
新しいキャプチャインスタンスが検出された場合、CData Sync はその開始位置(新インスタンスがどこから変更の記録を始めたかを示す開始ログシーケンス番号、min_lsn)を把握します。
そのうえで、旧インスタンスからの変更読み取りを継続します。読み取りは新インスタンスのmin_lsnに到達するまで続きます。旧インスタンスの変更をすべて読み切ったタイミングで、CData Sync は自動的に新しいキャプチャインスタンスへの読み取りに切り替えます。
この 2 段階の処理により、旧インスタンスと新インスタンスの間で変更データが欠落する期間は生まれません。フルリフレッシュを手動で実行する必要もありません。
処理の流れを図にまとめました。

移行の手順
実際に Employee というソーステーブルへカラムを追加し、新しいキャプチャインスタンスへ移行する手順を示します。
1. ソーステーブルのスキーマを変更する
まず、SQL Server 側でソーステーブルにカラムを追加します。
-- 1. ソーステーブルにカラムを追加する例
ALTER TABLE dbo.Employee ADD Salary INT;
2. 新しいキャプチャインスタンスを作成する
続いて、新しい@capture_instance名を指定してsys.sp_cdc_enable_tableを実行し、新しい CDC キャプチャインスタンスを作成します。このとき、既存のキャプチャインスタンス(ここではEmployee_v1とします)はそのまま残しておきます。
-- 2. 新しいキャプチャインスタンスを作成(既存インスタンスは残したまま)
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Employee',
@role_name = NULL,
@capture_instance = N'Employee_v2';
CData Sync 側の CDC ジョブ設定は変更不要です。ジョブに設定されているソーステーブルの指定はそのまま維持されます。
3. 次のCDCジョブ実行で自動的に移行される
次に CDC ジョブが実行されると、前述の自動切替の仕組みが働きます。CData Sync は新しいキャプチャインスタンスEmployee_v2を検出します。そのうえでEmployee_v1を読み切ったタイミングで、Employee_v2への読み取りに切り替えます。この間、追加したSalaryカラムを含む変更データも欠落なく取得されます。
4. 移行完了後に旧インスタンスを削除する
ジョブ実行が正常に完了したことを確認したら、sys.sp_cdc_disable_tableで旧キャプチャインスタンスを削除します。
-- 4. 移行完了後、旧キャプチャインスタンスを削除
EXEC sys.sp_cdc_disable_table
@source_schema = N'dbo',
@source_name = N'Employee',
@capture_instance = N'Employee_v1';
まとめ
CData Sync v26.3 では、SQL Server の複数キャプチャインスタンスを検出し、移行します。これにより、データ損失やフルリフレッシュなしにソーステーブルのスキーマ変更を吸収できるようになりました。
CData Sync v26.3 をぜひお試しください。CData Sync の 30 日間無償トライアルはこちらからダウンロードいただけます。
使っていて気になった点やご不明な点があれば、お気軽にテクニカルサポートまでお問い合わせください。