變更串流會監控並串流輸出 Spanner 資料庫的資料變更 (插入、更新和刪除),且近乎即時。
本頁面提供 Spanner 變更串流的高階總覽,包括變更串流的用途和運作方式。如要瞭解如何在資料庫中建立及管理變更串流,並將這些串流連結至其他服務,請點選「後續步驟」中的連結。
變更串流的用途
變更串流提供彈性且可擴充的方式,將資料變更串流至其他服務。常見用途包括:
將 Spanner 資料變更內容複製到資料倉儲 (例如 BigQuery) 進行分析。
根據傳送至訊息佇列 (例如 Pub/Sub) 的資料變更,觸發應用程式邏輯。
在 Cloud Storage 中儲存資料變更,以符合法規或用於封存。
變更串流設定
Spanner 會將變更串流視為結構定義物件,與資料表和索引類似。因此,您可以使用 DDL 陳述式建立、修改及刪除變更串流,並查看資料庫的變更串流,就像其他 DDL 管理的結構定義物件一樣。
您可以設定變更串流,監控整個資料庫的資料變更,或將範圍限制在特定資料表和資料欄。一個資料庫可以有多個變更串流,而特定資料表或資料欄可以有多個串流監控,但須符合限制。
您可以視需要使用下列項目設定變更串流:
- 指定資料保留期限,即可覆寫預設的一天保留期限。
- 指定值擷取類型,即可覆寫預設值擷取類型
OLD_AND_NEW_VALUES
。 - 套用以 TTL 為準的刪除篩選器,從變更串流中篩除以 TTL 為準的刪除作業。
- 套用表格修改篩選器,排除所有
INSERT
、UPDATE
或DELETE
表格修改。 - 啟用交易層級記錄排除功能,從變更串流中排除特定交易。
發出建立變更串流的 DDL 會啟動長時間執行的作業。完成後,新的變更串流會立即開始監控指派的資料表和資料欄。
隱含監控資料表和資料欄
監控整個資料表的變更串流會隱含監控該資料表中的所有資料欄,即使資料表定義更新也一樣。舉例來說,當您在該資料表中新增資料欄時,變更串流會自動開始監看這些新資料欄,不需要修改變更串流的設定。同樣地,如果資料表捨棄任何資料欄,變更串流就會自動停止監看這些資料欄。
全資料庫變更串流的運作方式相同。系統會隱含監控每個資料表中的每個資料欄,自動監控變更串流建立後新增的任何資料表或資料欄,並停止監控任何已捨棄的資料表或資料欄。
明確監控資料表和資料欄
如果您設定變更串流,只監控資料表中的特定資料欄,之後在該資料表中新增資料欄時,除非重新設定變更串流,否則變更串流不會開始監控這些資料欄。
資料庫的結構定義會將變更串流視為明確監控的任何資料欄或資料表的依附物件。如要捨棄這類資料欄或資料表,請務必先從明確監看該資料欄或資料表的任何變更串流設定中,手動移除該資料欄或資料表。
變更串流監看的資料變更類型
變更串流會監控資料表和資料欄的所有插入、更新和刪除作業。這些變更可能來自:
變更串流只能監控使用者建立的資料欄和資料表中的資料變更。不會監看索引、檢視區塊、其他變更串流,或資訊結構定義或統計資料表等系統資料表。除非產生的資料欄是主鍵的一部分,否則變更串流不會監控這些資料欄。系統一律會追蹤主鍵資料欄。
此外,變更串流不會監控結構定義變更,也不會監控因結構定義變更而直接導致的任何資料變更,但預設值的回填除外。舉例來說,如果變更串流監控整個資料庫,即使刪除資料表會一併刪除資料庫中的所有資料,系統也不會將這項操作視為資料變更並記錄下來。
Spanner 如何寫入及儲存變更串流
每當 Spanner 在變更串流監看的資料欄中偵測到資料變更時,就會將資料變更記錄寫入內部儲存空間。資料變更寫入作業和資料變更記錄會寫入同一項交易。Spanner 會將這兩項寫入作業放在同一位置,由同一部伺服器處理,盡量減少寫入處理作業。交易隨後會複製到資料庫的副本,因此會產生儲存和複製費用。 詳情請參閱 Spanner 定價。
資料變更記錄的內容
變更串流寫入的每筆資料變更記錄,都包含下列資料變更資訊:
受影響資料表的名稱
識別已變更資料列的主鍵名稱、值和資料類型
根據變更串流定義擷取的變更資料列資料欄名稱和資料類型。
資料列欄位的舊值。舊值和追蹤內容 (僅限修改過的資料欄或整個追蹤列) 的可用性,取決於使用者設定的值擷取類型。
資料列資料欄的新值。新值和追蹤內容的可用性取決於使用者設定的價值擷取類型。
修改類型 (插入、更新或刪除)
修訂時間戳記
交易 ID
記錄序號
資料變更記錄的值擷取類型。
如要深入瞭解資料變更記錄的結構,請參閱「資料變更記錄」。
資料保留
變更串流會將資料變更記錄保留一段時間,最短一天,最長三十天。您可以使用 DDL,在首次建立變更串流時指定資料保留期限,也可以在日後調整這項設定。預設保留期限為一天。請注意,如縮短變更串流的資料保留期限,系統會立即永久刪除所有超過新期限的歷來變更資料,變更串流的讀取者也無法存取這些資料。
資料保留時間長度會影響儲存空間需求,保留時間越長,資料庫的儲存空間需求就越大。
值擷取類型
變更串流的值擷取類型設定選項,可控管變更後資料列值的儲存方式。您可以使用 DDL,為變更串流指定下列其中一種值擷取類型:
OLD_AND_NEW_VALUES
:擷取資料列中已修改資料欄的舊值和新值。NEW_VALUES
:只擷取非索引鍵資料欄的新值,但不擷取舊值。NEW_ROW
:每當任何受監控的資料欄變更時,就會擷取這些資料欄的所有新值 (包括已修改和未修改的值)。系統未擷取任何舊值。NEW_ROW_AND_OLD_VALUES
:擷取已修改和未修改資料欄的所有新值,以及已修改資料欄的舊值。
排除根據存留時間刪除的項目
在 Spanner 中,存留時間 (TTL) 可讓您設定政策,定期從 Spanner 資料表刪除資料。根據預設,變更串流會納入所有以 TTL 為準的刪除作業。您可以使用 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
。這個參數是 TransactionOptions
和 BatchWriteRequest
方法的一部分。這個參數的預設值是 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 主題。
您可以使用導向讀取作業,為變更串流讀取作業提供部分隔離。導向讀取有助於盡量減少對資料庫中交易工作負載的影響。您可以使用 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 連接器建立變更串流連線」。
限制
變更串流有幾項限制,包括資料庫可擁有的變更串流數量上限,以及可監控單一資料欄的串流數量上限。如需完整清單,請參閱「變更串流限制」。
權限
變更串流會使用下列項目:
建立、更新或捨棄變更串流需要
spanner.databases.updateDdl
。如要讀取變更串流的資料,必須具備
spanner.databases.select
。
如果使用 SpannerIO 連接器,讀取變更串流資料的 Dataflow 作業擁有者,必須在應用程式資料庫或個別的中繼資料庫中,取得額外的 IAM 權限;請參閱「建立中繼資料庫」。
後續步驟
瞭解如何使用 DDL 語法建立及管理變更串流。
使用變更串流和範本,將 Spanner 的變更複製到 BigQuery 或 Cloud Storage。
進一步瞭解如何建構 Dataflow 管道來處理變更串流資料。
進一步瞭解變更串流詳細資料,包括變更串流架構的詳細資料、如何使用 API 查詢變更串流,以及如何解讀傳回的記錄。
進一步瞭解如何使用 Kafka 連接器處理變更串流資料。