變更串流總覽

變更串流會監控並串流輸出 Spanner 資料庫的資料變更 (插入、更新和刪除),且近乎即時。

本頁面提供 Spanner 變更串流的高階總覽,說明變更串流的用途和運作方式。如要瞭解如何在資料庫中建立及管理變更串流,並將這些串流連結至其他服務,請點選「後續步驟」中的連結。

變更串流的用途

變更串流提供彈性且可擴充的方式,將資料變更串流至其他服務。常見用途包括:

  • 將 Spanner 資料變更內容複製到資料倉儲 (例如 BigQuery) 以進行分析。

  • 根據傳送至訊息佇列 (例如 Pub/Sub) 的資料變更觸發應用程式邏輯。

  • Cloud Storage 中儲存資料變更,以符合法規或用於封存。

變更串流設定

Spanner 會將變更串流視為結構定義物件,與資料表和索引類似。因此,您可以使用 DDL 陳述式建立、修改及刪除變更串流,並查看資料庫的變更串流,就像其他 DDL 管理的結構定義物件一樣。

您可以設定變更串流,監控整個資料庫的資料變更,或將範圍限制在特定資料表和資料欄。資料庫可以有多個變更串流,特定資料表或資料欄也可以有多個監看串流,但須符合限制

您可以視需要使用下列項目設定變更串流:

發出建立變更串流的 DDL 會啟動長時間執行的作業。完成後,新的變更串流會立即開始監控指派的資料表和資料欄。

隱含監控資料表和資料欄

監控整個資料表的變更串流會隱含監控該資料表中的所有資料欄,即使資料表定義更新也一樣。舉例來說,當您在該資料表中新增資料欄時,變更串流會自動開始監看這些新資料欄,不需要修改變更串流的設定。同樣地,如果資料表捨棄任何資料欄,變更串流會自動停止監看這些資料欄。

全資料庫變更串流的運作方式也相同。這類資料流會隱含監控每個資料表中的每個欄,自動監控變更資料流建立後新增的任何資料表或欄,並停止監控任何已捨棄的資料表或欄。

明確監控資料表和資料欄

如果您設定變更串流,只監控資料表中的特定資料欄,之後在該資料表中新增資料欄時,除非重新設定變更串流,否則變更串流不會開始監控這些資料欄。

資料庫的結構定義會將變更串流視為明確監控的任何資料欄或資料表的依附物件。如要捨棄這類資料欄或資料表,請務必先從明確監看該資料欄或資料表的任何變更串流設定中,手動移除該資料欄或資料表。

變更串流監看的資料變更類型

變更串流會監控資料表和資料欄的所有插入、更新和刪除作業。這些變更可能來自:

變更串流只能監控使用者建立的資料欄和資料表中的資料變更。不會監看索引、檢視區塊、其他變更串流,或資訊結構定義或統計資料表等系統資料表。除非產生的資料欄屬於主鍵,否則變更串流不會監控這類資料欄。系統一律會追蹤主鍵欄。

此外,變更串流不會監控結構定義變更,也不會監控因結構定義變更而直接導致的任何資料變更,但預設值的回填除外。舉例來說,如果變更串流監控整個資料庫,即使刪除資料表會一併刪除資料庫中的所有資料,系統也不會將這項動作視為資料變更並記錄下來。

Spanner 如何寫入及儲存變更串流

每當 Spanner 在變更串流監看的資料欄中偵測到資料變更時,就會將資料變更記錄寫入內部儲存空間。資料變更寫入作業和資料變更記錄會寫入同一個交易。Spanner 會將這兩項寫入作業放在同一位置,因此會由同一部伺服器處理,盡量減少寫入處理作業。接著,交易會複製到資料庫的副本,因此會產生儲存和複製費用。 詳情請參閱 Spanner 定價

資料變更記錄的內容

變更串流寫入的每筆資料變更記錄,都包含下列資料變更資訊:

  • 受影響資料表的名稱

  • 識別已變更資料列的主鍵名稱、值和資料類型

  • 根據變更串流定義擷取的變更資料列資料欄名稱和資料類型。

  • 資料列欄位的舊值。舊值和追蹤內容 (僅限修改過的資料欄或整個追蹤列) 的可用性,取決於使用者設定的值擷取類型

  • 資料列資料欄的新值。新值和追蹤內容的可用性取決於使用者設定的值擷取類型

  • 修改類型 (插入、更新或刪除)

  • 修訂時間戳記

  • 交易 ID

  • 記錄序號

  • 資料變更記錄的值擷取類型。

如要深入瞭解資料變更記錄的結構,請參閱「資料變更記錄」。

資料保留

變更串流會將資料變更記錄保留一段時間,最短一天,最長三十天。您可以使用 DDL,在首次建立變更串流時指定資料保留期限,也可以在日後調整。預設保留期限為一天。請注意,如縮短變更串流的資料保留期限,系統會立即永久刪除所有超過新期限的歷來變更資料,變更串流的讀取者也無法再存取這些資料。

資料保留期限是權衡考量,保留期限越長,串流資料庫的儲存空間需求就越大。

值擷取類型

變更串流的值擷取類型設定選項會控管變更後資料列值的儲存方式。您可以使用 DDL,為變更串流指定下列其中一種值擷取類型:

  • OLD_AND_NEW_VALUES:擷取資料列中已修改資料欄的舊值和新值。

  • NEW_VALUES:只擷取非鍵資料欄的新值,但不擷取舊值。

  • NEW_ROW:每當任何受監控的資料欄變更時,就會擷取這些資料欄的所有新值 (包括已修改和未修改的值)。未擷取任何舊值。

  • NEW_ROW_AND_OLD_VALUES:擷取已修改和未修改資料欄的所有新值,以及已修改資料欄的舊值。

排除根據存留時間刪除的項目

在 Spanner 中,存留時間 (TTL) 可讓您設定政策,定期從 Spanner 資料表刪除資料。根據預設,變更串流會納入所有以存留時間為準的刪除作業。您可以透過 exclude_ttl_deletes 設定變更串流,排除以 TTL 為依據的刪除作業。如果將這個篩選器設為排除以 TTL 為準的刪除作業,變更串流只會排除日後以 TTL 為準的刪除作業。

這個篩選器的預設值為 false。如要排除以 TTL 為依據的刪除作業,請將篩選器設為 true。您可以在建立變更串流時新增篩選器,或修改現有變更串流來加入篩選器

資料表修改類型

根據預設,變更串流會包含所有資料表修改,例如插入、更新及刪除。您可以使用下列篩選選項,從變更串流的範圍中篩選一或多個表格修改項目:

  • exclude_insert:排除所有 INSERT 資料表修改
  • exclude_update:排除所有 UPDATE 資料表修改
  • exclude_delete:排除所有 DELETE 資料表修改

這些篩選條件的預設值為 false。如要排除特定類型的資料表修改,請將篩選器設為 true。您可以同時設定一或多個篩選條件。

建立變更串流時,您可以新增資料表修改類型篩選器,也可以修改現有變更串流的資料表修改類型篩選器

排除交易層級記錄

根據預設,變更串流會監控資料庫中的所有寫入交易,因為 allow_txn_exclusion DDL 選項設為 false。您可以將 allow_txn_exclusion 選項設為 true,讓變更串流忽略特定寫入交易的記錄。如果未將這個選項設為 true,系統就會監控所有寫入交易,即使您在寫入交易中使用 exclude_txn_from_change_streams 參數也一樣。

您可以在建立變更串流時啟用這個選項,或修改現有的變更串流

從變更串流中排除寫入交易

如要從變更串流中排除寫入交易,請將 exclude_txn_from_change_streams 參數設為 true。這個參數是 TransactionOptionsBatchWriteRequest 方法的一部分。這個參數的預設值是 false。您可以使用 RPC API、REST API 或用戶端程式庫設定這個參數。詳情請參閱「指定要從變更串流中排除的寫入交易」。

您無法將這個參數設為 true,用於唯讀交易。如果這麼做,API 會傳回無效引數錯誤。

如要監控交易修改的資料欄變更串流,當 exclude_txn_from_change_streams 設為 true 時,可能會發生兩種情況:

  • 如果 DDL 選項 allow_txn_exclusion 設為 true,則這項交易中進行的更新不會記錄在變更串流中。
  • 如果未設定 DDL 選項 allow_txn_exclusion,或設為 false,系統就會在變更串流中記錄這項交易期間所做的更新。

如果未設定 exclude_txn_from_change_streams 選項,或將其設為 false,則交易修改的任何變更串流監控資料欄都會擷取該交易中進行的更新。

讀取變更串流

Spanner 提供多種讀取變更串流資料的方法:

  • 透過 Dataflow,使用 Apache Beam SpannerIO 連接器。這是我們為大多數變更串流應用程式提供的建議解決方案。 Google 也提供常見用途的 Dataflow 範本。

  • 直接使用 Spanner API。這會犧牲 Dataflow pipeline 的抽象化和功能,以換取最大速度和彈性。

  • 透過以 Debezium 為基礎的 Kafka 連接器,取得 Spanner 變更串流。這個連接器會將變更記錄直接串流至 Kafka 主題。

  • 使用 Datastream 將變更直接串流至 BigQuery、BigLake Iceberg 資料表或 Cloud Storage。

您可以使用導向讀取作業,為變更串流讀取作業提供部分隔離。導向讀取有助於盡量減少對資料庫中交易工作負載的影響。您可以使用 Spanner API,將變更串流讀取作業,轉送至多區域執行個體設定或自訂區域設定(含選用的唯讀區域) 中的特定備用資源類型或區域。詳情請參閱導讀

使用 Dataflow

使用 Apache Beam SpannerIO 連接器建構 Dataflow 管道,從變更串流讀取資料。設定連接器並提供特定變更串流的詳細資料後,連接器會自動將新的資料變更記錄輸出至單一無界限的 PCollection 資料集,供 Dataflow 管道中的後續轉換作業進一步處理。

Dataflow 會使用時間區間設定函式,將不受限的集合劃分為邏輯元件或時間區間。因此,從變更串流讀取資料時,Dataflow 會提供近乎即時的串流。

Google 提供範本,可讓您快速建構 Dataflow 管道,以因應常見的變更串流使用案例,包括將串流的所有資料變更傳送至 BigQuery 資料集,或複製至 Cloud Storage 值區

如要進一步瞭解變更串流和 Dataflow 如何搭配運作,請參閱「透過 Dataflow 建立變更串流連線」。

使用 API

除了使用 Dataflow 建構變更串流管道,您也可以編寫程式碼,直接使用 Spanner API 讀取變更串流的記錄。這樣一來,您就能以 SpannerIO 連接器相同的方式讀取資料變更記錄,並在讀取變更串流資料時提供最低可能延遲時間,而非提供 Dataflow 的彈性。

詳情請參閱「查詢變更串流」。如要進一步瞭解如何查詢變更串流及解讀傳回的記錄,請參閱「變更串流分割區、記錄和查詢」。

使用 Kafka 連接器

Kafka 連接器會直接將變更串流記錄輸出至 Kafka 主題。 這個程式庫會抽象化使用 Spanner API 查詢變更串流的詳細資料。

如要進一步瞭解變更串流和 Kafka 連接器如何搭配運作,請參閱「使用 Kafka 連接器建立變更串流連線」。

使用 Datastream

使用 Datastream (無伺服器且易於使用的變更資料擷取 (CDC) 和複製服務,目前已在 Google Cloud推出)。Datastream 支援 Spanner 變更串流,可讓您從各種目的地讀取及串流變更資料。

如要進一步瞭解 Datastream 如何支援 Spanner 讀取及串流異動資料,請參閱「Spanner 做為來源」一文。

限制

變更串流有幾項限制,包括資料庫可擁有的變更串流數量上限,以及可監控單一資料欄的串流數量上限。如需完整清單,請參閱「變更串流限制」。

權限

變更串流會使用下列項目:

  • 建立、更新或捨棄變更串流需要 spanner.databases.updateDdl

  • 如要讀取變更串流的資料,必須具備 spanner.databases.select

如果使用 SpannerIO 連接器,讀取變更串流資料的 Dataflow 工作擁有者,必須在應用程式資料庫或個別的中繼資料庫中,取得額外的 Identity and Access Management (IAM) 權限;請參閱「建立中繼資料庫」。

後續步驟