このページでは、Cloud SQL for SQL Server データベースから サポートされている宛先(BigQuery や Cloud Storage など)にデータをストリーミングするように変更データ キャプチャ(CDC)を構成する方法について説明します。
Cloud SQL インスタンスに接続します。これを行うには、Cloud Shell プロンプトで
gcloud sql connectコマンドを使用します。次のコマンドを実行して、データベースで CDC を有効にします。
EXEC msdb.dbo.gcloudsql_cdc_enable_db 'DATABASE_NAME'DATABASE_NAMEは、ソース データベースの名前に置き換えます。変更を取得する必要があるテーブルで CDC を有効にします。
USE [DATABASE_NAME] EXEC sys.sp_cdc_enable_table @source_schema = N'SCHEMA_NAME', @source_name = N'TABLE_NAME', @role_name = NULL GOスナップショット分離を有効にします。
SQL Server データベースからデータをバックフィルする際は、整合性のあるスナップショットを確保することが重要です。このセクションで説明している設定を適用しない場合、バックフィル プロセス中にデータベースに加えた変更により、重複や誤った結果が生じる可能性があります。ストリームに主キーのないテーブルが含まれている場合は、スナップショット分離の設定を適用する必要があります。
スナップショット分離を有効にすると、バックフィル プロセスの開始時にデータベースの一時ビューが作成されます。これにより、他のユーザーが同時にライブテーブルに変更を加えた場合でも、コピーされるデータの整合性が確実に維持されます。スナップショット分離を有効にすると、パフォーマンスにわずかな影響を与える可能性がありますが、信頼性の高いデータ抽出には不可欠です。
スナップショット分離を有効にするには:
- SQL Server クライアントを使用してデータベースに接続します。
- 次のコマンドを実行します。
ALTER DATABASE DATABASE_NAME SET ALLOW_SNAPSHOT_ISOLATION ON;DATABASE_NAME は、データベースの名前に置き換えます。
Datastream ユーザーを作成する:
コンソールで、[Cloud SQL のインスタンス] ページに移動します。 Google Cloud
ユーザーを作成し、
db_ownerロールとdb_denydatawriterロールを割り当てます。
CREATE USER USER_NAME FOR LOGIN YOUR_LOGIN;EXEC sp_addrolemember 'db_owner', 'USER_NAME'; EXEC sp_addrolemember 'db_denydatawriter', 'USER_NAME';
トランザクション ログの CDC メソッドに必要な追加手順
このセクションで説明する手順は、トランザクション ログ の CDC メソッドで使用するためにソース SQL Server データベースを構成する場合にのみ必要です。
ソースで変更を有効にするポーリング間隔を設定します。
USE [DATABASE_NAME] EXEC sys.sp_cdc_change_job @job_type = 'capture' , @pollinginterval = 86399 EXEC sp_cdc_stop_job 'capture' EXEC sp_cdc_start_job 'capture'@pollingintervalパラメータは秒単位で測定され、推奨値は86399に設定されています。つまり、トランザクション ログは、86,399 秒間(1 日)変更を保持します。sp_cdc_start_job 'captureプロシージャを実行すると、設定が開始されます。ログの切り捨ての防止対策を設定します。
CDC のリーダーがログの読み取りに十分な時間を確保しながら、ログの切り捨てによって保存容量が不足しないようにするには、ログの切り捨ての防止対策を設定します。
- SQL Server クライアントを使用してデータベースに接続します。
データベースにダミーテーブルを作成します。
USE [DATABASE_NAME]; CREATE TABLE dbo.gcp_datastream_truncation_safeguard ( [id] INT IDENTITY(1,1) PRIMARY KEY, CreatedDate DATETIME DEFAULT GETDATE(), [char_column] CHAR(8) );ログの切り捨てを防止するために指定した期間にアクティブなトランザクションを実行するストアド プロシージャを作成します。
CREATE PROCEDURE [dbo].[DatastreamLogTruncationSafeguard] @transaction_logs_retention_time INT AS BEGIN -- Start a new transaction BEGIN TRANSACTION; INSERT INTO dbo.gcp_datastream_truncation_safeguard (char_column) VALUES ('a') DECLARE @formatted_time VARCHAR(5) SET @formatted_time = CONVERT(VARCHAR(5), DATEADD(MINUTE, @transaction_logs_retention_time, 0), 108); -- Wait for X minutes before ending the transaction WAITFOR DELAY @formatted_time; -- Commit the transaction COMMIT TRANSACTION; END;別のストアド プロシージャを作成します。今回は、前の手順で作成したストアド プロシージャを指定した間隔に従って実行するジョブを作成します。
CREATE PROCEDURE [dbo].[SetUpDatastreamJob] @transaction_logs_retention_time INT AS BEGIN DECLARE @database_name VARCHAR(MAX) SET