変更ストリームを作成して管理する

このページでは、Spanner 変更ストリームを作成、変更、表示する方法について説明します。変更ストリームの詳細については、変更ストリームについてをご覧ください。

変更ストリームはスキーマ オブジェクトであるため、他の種類のデータベース定義作業(データセットの作成やインデックスの追加など)に使用されるものと同じ DDL によるスキーマ更新を使用して作成、管理します。

Spanner は、スキーマを変更する DDL ステートメント(変更ストリームの作成、変更、削除に使用されたステートメントを含む)を送信すると、長時間実行オペレーションを開始します。新規または変更された変更ストリームは、この長時間実行オペレーションの完了時に、新しい構成で指定された列やテーブルのモニタリングを開始します。

変更ストリームを作成

変更ストリームを作成するには、その名前と監視するスキーマ オブジェクト(データベース全体か、特定のテーブルと列のリスト)を指定する必要があります。必要に応じて、次を指定できます。

GoogleSQL

GoogleSQL を使用して変更ストリームを作成する DDL 構文は次のとおりです。

CREATE CHANGE STREAM change_stream_name
  [FOR column_or_table_watching_definition[, ... ] ]
  [
    OPTIONS (
      retention_period = timespan,
      value_capture_type = type,
      exclude_ttl_deletes = boolean,
      exclude_insert = boolean,
      exclude_update = boolean,
      exclude_delete = boolean
    )
  ]

PostgreSQL

PostgreSQL を使用して変更ストリームを作成する DDL 構文は次のとおりです。

CREATE CHANGE STREAM change_stream_name
  [FOR column_or_table_watching_definition[, ... ] ]
  [
    WITH (
      retention_period = timespan,
      value_capture_type = type,
      exclude_ttl_deletes = boolean,
      exclude_insert = boolean,
      exclude_update = boolean,
      exclude_delete = boolean
    )
  ]

新しい変更ストリームは、作成した長時間実行オペレーションが完了するとすぐに、割り当てられたスキーマ オブジェクトのモニタリングを開始します。

次の例では、さまざまな構成で変更ストリームを作成する方法を示します。

データベース全体を監視する

データベースのテーブル全体で行われるすべてのデータ変更を監視する変更ストリームを作成するには、ALL キーワードを使用します。

CREATE CHANGE STREAM EverythingStream
FOR ALL;

ALL 構成では、今後作成されるデータべースのデータテーブルと列がすべて、すぐに暗黙的に含まれます。ビュー、情報スキーマ テーブル、などの通常のデータテーブル以外のオブジェクトは含まれません

特定のテーブルを監視する

変更ストリームのスコープをデータベース全体ではなく特定のテーブルに制限するには、1 つ以上のテーブルのリストを指定します。

CREATE CHANGE STREAM SingerAlbumStream
FOR Singers, Albums;

Spanner は、テーブル全体を監視する変更ストリームを自動的に更新し、列の追加や削除など、テーブルに影響するスキーマ変更を反映します。

特定の列を監視する

table(column_1[, column_2, ...]) 構文を使用して、指定したテーブル内にある 1 つ以上の特定の非キー列に対する変更を監視します。

CREATE CHANGE STREAM NamesAndTitles
FOR Singers(FirstName, LastName), Albums(Title);

すべての変更ストリームは、監視対象のすべてのテーブルの主キーを常時追跡するため、主キー列を指定することはできません。これにより、すべてのデータ変更レコードで、主キーによって変更された行を識別できます。

テーブルと列を 1 つのストリームで監視する

上記の 2 つの例のテーブル監視構文と列監視構文は、1 つの変更ストリームと組み合わせることができます。

CREATE CHANGE STREAM NamesAndAlbums
FOR Singers(FirstName, LastName), Albums;

長い保持期間を指定する

変更ストリーム データの保持期間をデフォルトの 1 日よりも長く指定するには、retention_period を最大 1 週間の期間(時間(h)または日(d))に設定します。

2 つの例を以下に示します。

GoogleSQL

CREATE CHANGE STREAM LongerDataRetention
FOR ALL
OPTIONS ( retention_period = '36h' );
CREATE CHANGE STREAM MaximumDataRetention
FOR ALL
OPTIONS ( retention_period = '7d' );

PostgreSQL

CREATE CHANGE STREAM LongerDataRetention
FOR ALL
WITH ( retention_period = '36h' );
CREATE CHANGE STREAM MaximumDataRetention
FOR ALL
WITH ( retention_period = '7d' );

別の値キャプチャ タイプを指定する

OLD_AND_NEW_VALUES 以外の変更ストリーム値キャプチャ タイプを指定するには、value_capture_typeNEW_VALUES または NEW_ROW に設定します。次に例を示します。

GoogleSQL

CREATE CHANGE STREAM NewRowChangeStream
FOR ALL
OPTIONS ( value_capture_type = 'NEW_ROW' );
CREATE CHANGE STREAM NewValuesChangeStream
FOR ALL
OPTIONS ( value_capture_type = 'NEW_VALUES' );

PostgreSQL

CREATE CHANGE STREAM NewRowChangeStream
FOR ALL
WITH ( value_capture_type = 'NEW_ROW' );
CREATE CHANGE STREAM NewValuesChangeStream
FOR ALL
WITH ( value_capture_type = 'NEW_VALUES' );

TTL ベースの削除をフィルタ

exclude_ttl_deletes フィルタを使用して、変更ストリームのスコープで TTL ベースの削除をフィルタできます。

このフィルタの仕組みの詳細については、有効期間ベースの削除フィルタをご覧ください。

GoogleSQL

TTL ベースの削除フィルタを使用して変更ストリームを作成するには、次のコマンドを使用します。

CREATE CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
OPTIONS (exclude_ttl_deletes = true)

以下を置き換えます。

  • CHANGE_STREAM_NAME: 新しい変更ストリームの名前

次の例では、TTL ベースのすべての削除を除外する NewFilterChangeStream という名前の変更ストリームを作成します。

CREATE CHANGE STREAM NewFilterChangeStream FOR ALL
OPTIONS (exclude_ttl_deletes = true)

PostgreSQL

TTL ベースの削除フィルタを使用して変更ストリームを作成するには、次のコマンドを使用します。

CREATE CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
WITH (exclude_ttl_deletes = true)

以下を置き換えます。

  • STREAM_NAME: 新しい変更ストリームの名前

次の例では、TTL ベースのすべての削除を除外する NewFilterChangeStream という名前の変更ストリームを作成します。

CREATE CHANGE STREAM NewFilterChangeStream FOR ALL
WITH (exclude_ttl_deletes = true)

既存の変更ストリームに TTL ベースの削除フィルタを追加または削除するには、TTL ベースの削除フィルタを変更するをご覧ください。 変更ストリームのフィルタは、変更ストリームの定義を DDL として表示することで確認できます。

テーブル変更タイプでのフィルタ

使用可能な次のフィルタ オプションを使用して、変更ストリームのスコープでこれらのテーブル変更の 1 つ以上をフィルタします。

  • exclude_insert: すべての INSERT テーブルの変更を除外します。
  • exclude_update: すべての UPDATE テーブルの変更を除外します。
  • exclude_delete: すべての DELETE テーブルの変更を除外します。

これらのフィルタの仕組みの詳細については、テーブル変更タイプのフィルタをご覧ください。

GoogleSQL

1 つ以上のテーブル変更タイプのフィルタを使用して変更ストリームを作成するには、次のコマンドを使用します。

CREATE CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
OPTIONS (MOD_TYPE_FILTER_NAME = true)

以下を置き換えます。

  • CHANGE_STREAM_NAME: 新しい変更ストリームの名前
  • MOD_TYPE_FILTER_NAME: 追加するフィルタ(exclude_insertexclude_updateexclude_delete)。 複数のフィルタを一度に追加する場合は、各フィルタをカンマで区切ります。

次の例では、INSERTUPDATE のテーブル変更タイプを除外する NewFilterChangeStream という名前の変更ストリームを作成します。

CREATE CHANGE STREAM NewFilterChangeStream FOR ALL
OPTIONS (exclude_insert = true, exclude_update = true)

PostgreSQL

1 つ以上のテーブル変更タイプのフィルタを使用して変更ストリームを作成するには、次のコマンドを使用します。

CREATE CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
WITH (MOD_TYPE_FILTER_NAME = true)

以下を置き換えます。

  • CHANGE_STREAM_NAME: 既存の変更ストリームの名前
  • MOD_TYPE_FILTER_NAME: 追加するフィルタ(exclude_insertexclude_updateexclude_delete)。 複数のフィルタを一度に追加する場合は、各フィルタをカンマで区切ります。

次の例では、INSERTUPDATE のテーブル変更トランザクション タイプを除外する NewFilterChangeStream という名前の変更ストリームを作成します。

CREATE CHANGE STREAM NewFilterChangeStream FOR ALL
WITH (exclude_insert = true, exclude_update = true)

既存の変更ストリームにテーブル変更タイプのフィルタを追加または削除するには、テーブル変更タイプでのフィルタを変更するをご覧ください。変更ストリームに存在するテーブル変更タイプのフィルタは、変更ストリームの定義を DDL として表示することで確認できます。

変更ストリームを変更する

変更ストリームの構成を変更するには、ALTER CHANGE STREAM DDL ステートメントを使用します。CREATE CHANGE STREAM と同様の構文を使用します。ストリームの監視対象の列やデータ保持期間の長さは変更できます。データ変更レコードを保持しながら、監視を全体で一時停止することもできます。

変更ストリームの監視対象を変更する

この例では、Songs テーブル全体を以前に構成した NamesAndAlbums 変更ストリームに追加します。

ALTER CHANGE STREAM NamesAndAlbums
SET FOR Singers(FirstName, LastName), Albums, Songs;

Spanner は、データベースのスキーマ内の変更ストリームの定義を更新する長時間実行オペレーションの完了時に、名前付き変更ストリームの動作を新しい構成に置き換えます。

変更ストリームのデータ保持期間を変更する

変更ストリームが内部レコードを保持する期間を変更するには、ALTER CHANGE STREAM DDL ステートメントで retention_period を設定します。

この例では、データ保持期間を、前に作成した NamesAndAlbums 変更ストリームに合わせて調整します。

GoogleSQL

ALTER CHANGE STREAM NamesAndAlbums
SET OPTIONS ( retention_period = '36h' );

PostgreSQL

ALTER CHANGE STREAM NamesAndAlbums
SET ( retention_period = '36h' );

変更ストリームの値キャプチャ タイプを変更する

変更ストリームの値キャプチャ タイプを変更するには、ALTER CHANGE STREAM DDL ステートメントで value_capture_type 句を設定します。

この例では、値キャプチャ タイプを NEW_VALUES に調整します。

GoogleSQL

ALTER CHANGE STREAM NamesAndAlbums
SET OPTIONS ( value_capture_type = 'NEW_VALUES' );

PostgreSQL

ALTER CHANGE STREAM NamesAndAlbums
SET ( value_capture_type = 'NEW_VALUES' );

TTL ベースの削除フィルタを変更する

変更ストリームの TTL ベースの削除フィルタを変更するには、ALTER CHANGE STREAM DDL ステートメントで exclude_ttl_deletes フィルタを設定します。これを使用して、既存の変更ストリームにフィルタを追加したり、既存の変更ストリームからフィルタを削除したりできます。

これらのフィルタの仕組みの詳細については、有効期間ベースの削除フィルタをご覧ください。

TTL ベースの削除フィルタを既存の変更ストリームに追加する

GoogleSQL

既存の変更ストリームに対する TTL ベースの削除フィルタを追加するには、次のコマンドを使用してフィルタを true に設定します。

ALTER CHANGE STREAM CHANGE_STREAM_NAME FOR ALL
SET OPTIONS (exclude_ttl_deletes = true)

以下を置き換えます。

  • CHANGE_STREAM_NAME: 既存の変更ストリームの名前

次の例では、TTL ベースのすべての削除を除外する NewFilterChangeStream という名前の既存の変更ストリームに exclude_ttl_deletes フィルタを追加します。

ALTER CHANGE STREAM NewFilterChangeStream FOR ALL
SET OPTIONS (exclude_ttl_deletes = true)

これにより、変更ストリームからすべての TTL ベースの削除が除外されます。

PostgreSQL

既存の変更ストリームに対する TTL ベースの削除フィルタを追加するには、次のコマンドを使用してフィルタを True に設定します。

ALTER CHANGE STREAM STREAM_NAME FOR ALL
SET (exclude_ttl_deletes = true)

以下を置き換えます。

  • STREAM_NAME: 既存の変更ストリームの名前

次の例では、exclude_ttl_deletes フィルタが NewFilterChangeStream という名前の既存の変更ストリームに追加されます。

ALTER CHANGE STREAM NewFilterChangeStream FOR ALL
SET (exclude_ttl_deletes = true)

これにより、変更ストリームから将来のすべての TTL ベースの削除が除外されます。

既存の変更ストリームから TTL ベースの削除フィルタを削除する

GoogleSQL

既存の変更ストリームに対する TTL ベースの削除フィルタを削除するには、次のコマンドを使用してフィルタを False に設定します。

ALTER CHANGE STREAM STREAM_NAME FOR ALL
SET OPTIONS (exclude_ttl_deletes = false)

以下を置き換えます。

  • STREAM_NAME: 新しい変更ストリームの名前

次の例では、NewFilterChangeStream という名前の既存の変更ストリームから exclude_ttl_deletes フィルタが削除されています。

ALTER CHANGE STREAM NewFilterChangeStream FOR ALL
SET OPTIONS (exclude_ttl_deletes = false)

これには、変更ストリームに対する将来のすべての TTL ベースの削除が含まれます。

フィルタを null に設定して、TTL ベースの削除フィルタを削除することもできます。

PostgreSQL

既存の変更ストリームに対する TTL ベースの削除フィルタを削除するには、次のコマンドを使用してフィルタを False に設定します。

ALTER CHANGE STREAM STREAM_NAME FOR ALL
SET (exclude_ttl_deletes = false)

以下を置き換えます。

  • STREAM_NAME: 新しい変更ストリームの名前

次の例では、NewFilterChangeStream という名前の既存の変更ストリームから exclude_ttl_deletes フィルタが削除されています。

ALTER CHANGE STREAM NewFilterChangeStream FOR ALL
SET (exclude_ttl_deletes = false)

これには、変更ストリームに対する将来のすべての TTL ベースの削除が含まれます。

フィルタを null に設定して、TTL ベースの削除フィルタを削除することもできます。

テーブル変更タイプでのフィルタを変更する

変更ストリームのテーブル変更タイプのフィルタを変更するには、ALTER CHANGE STREAM DDL ステートメントでフィルタタイプを設定します。これを使用して、変更ストリームに新しいフィルタを追加したり、変更ストリームから既存のフィルタを削除したりできます。

既存の変更ストリームにテーブル変更タイプのフィルタを追加する

GoogleSQL

既存の変更ストリームに 1 つ以上の新しいテーブル変更タイプのフィルタを追加するには、次のコマンドを使用してフィルタを true に設定します。

ALTER CHANGE STREAM CHANGE_STREAM_NAME
SET OPTIONS (MOD_TYPE_FILTER_NAME = true)

以下を置き換えます。

  • CHANGE_STREAM_NAME: 既存の変更ストリームの名前に置き換えます。
  • MOD_TYPE_FILTER_NAME: 追加するフィルタ(exclude_insertexclude_updateexclude_delete)に置き換えます。 複数のフィルタを一度に追加する場合は、各フィルタをカンマで区切ります。

次の例では、exclude_delete フィルタが NewFilterChangeStream という名前の既存の変更ストリームに追加されます。

ALTER CHANGE STREAM NewFilterChangeStream
SET OPTIONS (exclude_delete = true)

PostgreSQL

既存の変更ストリームに 1 つ以上の新しいテーブル変更タイプのフィルタを追加するには、次のコマンドを使用してフィルタを true に設定します。

ALTER CHANGE STREAM CHANGE_STREAM_NAME
SET (MOD_TYPE_FILTER_NAME = true)

以下を置き換えます。

  • CHANGE_STREAM_NAME: 既存の変更ストリームの名前に置き換えます。
  • MOD_TYPE_FILTER_NAME: 追加するフィルタ(exclude_insertexclude_updateexclude_delete)に置き換えます。 複数のフィルタを一度に追加する場合は、各フィルタをカンマで区切ります。

次の例では、exclude_delete フィルタが NewFilterChangeStream という名前の既存の変更ストリームに追加されます。

ALTER CHANGE STREAM NewFilterChangeStream
SET (exclude_delete = true)

既存の変更ストリームからテーブル変更タイプのフィルタを削除する

GoogleSQL

変更ストリームで既存のテーブル変更タイプのフィルタを 1 つ以上削除するには、次のコマンドを使用してフィルタを false に設定します。

ALTER CHANGE STREAM CHANGE_STREAM_NAME
SET OPTIONS (MOD_TYPE_FILTER_NAME = false)

以下を置き換えます。

  • CHANGE_STREAM_NAME: 既存の変更ストリームの名前に置き換えます。
  • MOD_TYPE_FILTER_NAME: 削除するフィルタ(exclude_insertexclude_updateexclude_delete)に置き換えます。 複数のフィルタを一度に削除する場合は、各フィルタをカンマで区切ります。

次の例では、exclude_delete フィルタが NewFilterChangeStream という名前の既存の変更ストリームから削除されます。

ALTER CHANGE STREAM NewFilterChangeStream
SET OPTIONS (exclude_delete = false)

フィルタをデフォルト値に戻すことによって、テーブル変更フィルタを削除することもできます。これを行うには、フィルタ値を null に設定します。

PostgreSQL

変更ストリームで既存のテーブル変更タイプのフィルタを 1 つ以上削除するには、次のコマンドを使用してフィルタを False に設定します。

ALTER CHANGE STREAM CHANGE_STREAM_NAME
SET (MOD_TYPE_FILTER_NAME = false)

以下を置き換えます。

  • CHANGE_STREAM_NAME: 既存の変更ストリームの名前に置き換えます。
  • MOD_TYPE_FILTER_NAME: 追加するフィルタ(exclude_insertexclude_updateexclude_delete)に置き換えます。 複数のフィルタを一度に追加する場合は、各フィルタをカンマで区切ります。

次の例では、exclude_delete フィルタが NewFilterChangeStream という名前の既存の変更ストリームから削除されます。

ALTER CHANGE STREAM NewFilterChangeStream
SET (exclude_delete = false)

フィルタをデフォルト値に戻すことによって、テーブル変更フィルタを削除することもできます。これを行うには、フィルタ値を null に設定します。

変更ストリームを一時停止する

変更ストリームがアクティビティを停止しても、少なくともデータ保持期間中は内部レコードを保持したい場合は、変更して何も監視しないように変更できます。

これを行うには、ALTER CHANGE STREAM DDL ステートメントを発行して変更ストリームの定義を特別なフレーズ DROP FOR ALL に置き換えます。次に例を示します。

ALTER CHANGE STREAM MyStream DROP FOR ALL;

ストリームはデータベースに引き続き存在するものの、オブジェクトの監視は行わず、データ変更レコードも生成しません。既存の変更レコードは、ストリームのデータ保持ポリシーに沿ってそのまま残ります。

一時停止したストリームを再開するには、以前の構成で別の ALTER CHANGE STREAM ステートメントを発行します。

変更ストリームを削除する

変更ストリームを完全に削除するには、ストリームの名前を指定して DROP CHANGE STREAM ステートメントを発行します。

DROP CHANGE STREAM NamesAndAlbums;

Spanner はストリームを直ちに停止し、データベースのスキーマから削除してデータ変更レコードを削除します。

変更ストリームのリスト化と表示

Google Cloud コンソールには、データベースの変更ストリーム定義をリスト化し確認するためのウェブ インターフェースが用意されています。変更ストリームの構造は、同等の DDL ステートメントとして表示するか、データベースの情報スキーマをクエリして表示することもできます。

Google Cloud コンソールで変更ストリームを表示する

データベースの変更ストリームのリストを表示してその定義を確認するには:

  1. Google Cloud コンソールの Spanner インスタンス ページにアクセスします。

    [インスタンス] ページを開く

  2. 該当するインスタンスとデータベースに移動します。

  3. ナビゲーション メニューで [変更ストリーム] をクリックします。

これにより、そのデータベースのすべての変更ストリームのリストと、それぞれの構成の要約が表示されます。ストリーム名をクリックすると、監視対象のテーブルと列の詳細が表示されます。

DDL として変更ストリームの定義を表示する

データベースのスキーマを DDL として表示すると、すべての変更ストリームの説明が含まれ、それらが CREATE CHANGE STREAM ステートメントとして表示されます。

  • コンソールからこれを行うには、Google Cloud コンソールのデータベース ページで [同等の DDL を表示] リンクをクリックします。

  • コマンドラインからこれを行うには、Google Cloud CLI の ddl describe コマンドを使用します。

変更ストリームに関する情報スキーマをクエリ検索する

変更ストリームについては、データベースの情報スキーマを直接クエリ検索できます。次の表に、変更ストリームの名前、監視対象のテーブルと列、保持期間を定義するメタデータを示します。

変更ストリームのベスト プラクティス

変更ストリームを構成して管理する際のベスト プラクティスは次のとおりです。

別のメタデータ データベースについて検討する

変更ストリームでは、メタデータ データベースを使用して内部状態が維持されます。 メタデータ データベースは、変更ストリームを含むデータベースと同じでも、異なる場合でもかまいません。メタデータ ストレージ用に個別のデータベースを作成することをおすすめします。

Spanner 変更ストリーム コネクタには、メタデータ データベースに対する読み取り / 書き込み権限が必要です。このデータベースをスキーマとともに準備する必要はありません。コネクタがそれに対処します。

別のメタデータ データベースを使用すると、コネクタがアプリケーション データベースに直接書き込むことで発生する可能性のある複雑さを排除できます。

  • メタデータ データベースを、変更ストリームを備えた本番環境のデータベースから分離すると、コネクタには、本番環境のデータベースに対する読み取り権限のみが必要になります。

  • コネクタのトラフィックを別のメタデータ データベースに制限することで、コネクタ自体によって実行される書き込みが本番環境の変更ストリームに含まれなくなります。これは、データベース全体を監視する変更ストリームに特に関係します。

メタデータの保存に別のデータベースを使用していない場合は、インスタンス上の変更ストリーム コネクタの CPU の影響をモニタリングすることをおすすめします。

新しい変更ストリームをベンチマークし、必要に応じてサイズを変更する

本番環境インスタンスに新しい変更ストリームを追加する前に、変更ストリームを有効にしてステージング インスタンスで現実的なワークロードのベンチマークを実施することを検討してください。これにより、コンピューティング容量とストレージ容量を増やすためにインスタンスにノードを追加する必要があるかどうかを判断できます。

CPU とストレージの指標が安定するまで、これらのテストを実行します。最適な状態としては、インスタンスの CPU 使用率が推奨最大値未満であり、ストレージ使用量がインスタンスのストレージ上限を超えないようにする必要があります。

複数のリージョンを使用して負荷分散を行う

マルチリージョン インスタンス構成で変更ストリームを使用する場合は、デフォルトのリーダー リージョンとは異なるリージョンで処理パイプラインを実行することを検討してください。これにより、リーダー以外のレプリカ間でストリーミングの読み込みを分散処理できます。ただし、負荷分散よりもストリーミングの遅延を可能な限り低減することを優先する必要がある場合は、リーダー リージョンでストリーミングの読み込みを実行します。

次のステップ