本頁說明如何使用反向複製功能,為 MySQL 設定回溯機制。如果 Spanner 發生問題,您可透過備援計畫還原至來源 MySQL 資料庫。
如果遇到非預期的問題,需要復原至原始 MySQL 資料庫,且希望服務中斷時間盡量縮短,反向複製功能就非常實用。反向複製功能可將寫入 Spanner 的資料複製到來源 MySQL 資料庫,讓您還原資料。這可確保兩個資料庫最終會保持一致。
反向複製流程包含下列步驟,由 Spanner_to_SourceDb Dataflow 範本執行:
使用 Spanner 變更串流讀取 Spanner 中的變更。
確認篩選模式為
forward_migration。使用 Spanner 遷移工具轉換 Spanner 資料,使其與來源資料庫結構定義相容。詳情請參閱「自訂轉換」。
確認來源資料庫是否已包含指定主鍵的最新資料。
將資料寫入來源資料庫。
使用 Spanner_to_SourceDb Dataflow 範本
Dataflow 範本可確保主鍵層級的一致性。範本會在 Spanner 中建立中繼資料表 (又稱「陰影資料表」),其中包含特定資料表上分片的最後一次寫入交易修訂時間戳記。
寫入作業會與主鍵的修訂時間戳記保持一致。
您可以將執行反向複製作業的 Dataflow 工作設定為下列任一模式:
一般:這是預設模式。Dataflow 作業會從 Spanner 變更串流讀取事件,將事件轉換為與來源資料庫結構定義相容的資料類型,然後將這些事件套用至來源資料庫。作業會自動重試錯誤。重試次數用盡後,系統會將錯誤移至 Cloud Storage bucket 中無效信件佇列 (DLQ) 目錄的
severe資料夾。這項工作也會將所有永久錯誤移至severe資料夾。RetryDLQ:在此模式下,Dataflow 工作會從 DLQ 的
severe資料夾讀取事件,然後重試。修正所有永久錯誤後,請執行這個模式。這個模式只會從 DLQ 讀取資料,不會從 Spanner 變更串流讀取資料。如果從severe資料夾處理的記錄移至retry資料夾,工作會重試這些記錄。
事前準備
確認來源 MySQL 資料庫與Google Cloud 專案之間的網路連線,Dataflow 工作將在該專案中執行。
在目的地 MySQL 執行個體上,將 Dataflow 工作站 IP 位址加入許可清單。
確認 MySQL 憑證在
source shards file中指定正確。確認 MySQL 執行個體已連上網路並正在執行。
確認 MySQL 使用者在 MySQL 資料庫中具有
INSERT、UPDATE和DELETE權限。確認您具備執行 Dataflow 彈性範本的必要 IAM 權限。詳情請參閱「建構及執行彈性範本」。
確認通訊埠
12345已開啟,可供 Dataflow 工作人員 VM 之間的通訊。
必要的角色
-
如要取得啟動反向複製所需的權限,請要求管理員在執行個體中授予下列 IAM 角色:
-
Cloud Spanner 資料庫使用者 (
roles/spanner.databaseUser) -
Dataflow 開發人員 (
roles/dataflow.developer)
-
Cloud Spanner 資料庫使用者 (
-
為確保 Compute Engine 服務帳戶具備啟動反向複製作業的必要權限,請要求管理員在執行個體中,將下列 IAM 角色授予 Compute Engine 服務帳戶:
-
Cloud Spanner 資料庫使用者 (
roles/spanner.databaseUser) -
Secret Manager 密鑰存取者 (
roles/secretmanager.secretAccessor) -
Secret Manager 檢視者 (
roles/secretmanager.viewer)
-
Cloud Spanner 資料庫使用者 (
執行反向複製作業
如要執行反向複製,請按照下列步驟操作:
將工作階段檔案上傳至 Cloud Storage bucket。
為 DLQ 目錄的
retry資料夾建立 Pub/Sub 通知。方法是建立 Pub/Sub 主題,以及該主題的 Pub/Sub 訂閱項目。建構並暫存 Dataflow 範本。詳情請參閱「建構範本」。
使用下列 Google Cloud CLI 指令,執行反向複製 Dataflow 範本:
gcloud dataflow flex-template run "spanner-to-sourcedb-job" \ --project "PROJECT" \ --region "REGION" \ --template-file-gcs-location "TEMPLATE_SPEC_GCSPATH" \ --parameters "changeStreamName=CHANGE_STREAM_NAME" \ --parameters "instanceId=INSTANCE_ID" \ --parameters "databaseId=DATABASE_ID" \ --parameters "spannerProjectId=SPANNER_PROJECT_ID" \ --parameters "metadataInstance=METADATA_INSTANCE" \ --parameters "metadataDatabase=METADATA_DATABASE" \ --parameters "sourceShardsFilePath=SOURCE_SHARDS_FILE_PATH" \ --parameters "startTimestamp=START_TIMESTAMP" \ --parameters "endTimestamp=END_TIMESTAMP" \ --parameters "shadowTablePrefix=SHADOW_TABLE_PREFIX" \ [--parameters "sessionFilePath=SESSION_FILE_PATH"] \ [--parameters "filtrationMode=FILTRATION_MODE"] \ [--parameters "shardingCustomJarPath=SHARDING_CUSTOM_JAR_PATH"] \ [--parameters "shardingCustomClassName=SHARDING_CUSTOM_CLASS_NAME"] \ [--parameters "shardingCustomParameters=SHARDING_CUSTOM_PARAMETERS"] \ [--parameters "sourceDbTimezoneOffset=SOURCE_DB_TIMEZONE_OFFSET"] \ [--parameters "dlqGcsPubSubSubscription=DLQ_GCS_PUB_SUB_SUBSCRIPTION"] \ [--parameters "skipDirectoryName=SKIP_DIRECTORY_NAME"] \ [--parameters "maxShardConnections=MAX_SHARD_CONNECTIONS"] \ [--parameters "deadLetterQueueDirectory=DEAD_LETTER_QUEUE_DIRECTORY"] \ [--parameters "dlqMaxRetryCount=DLQ_MAX_RETRY_COUNT"] \ [--parameters "runMode=RUN_MODE"] \ [--parameters "dlqRetryMinutes=DLQ_RETRY_MINUTES"] \ [--parameters "sourceType=SOURCE_TYPE"] \ [--parameters "transformationJarPath=TRANSFORMATION_JAR_PATH"] \ [--parameters "transformationClassName=TRANSFORMATION_CLASS_NAME"] \ [--parameters "transformationCustomParameters=TRANSFORMATION_CUSTOM_PARAMETERS"] \ [--parameters "filterEventsDirectoryName=FILTER_EVENTS_DIRECTORY_NAME"]
必填變數說明如下:
project: Google Cloud 專案 ID。region: Google Cloud 區域。template-file-gcs-location:您暫存 Dataflow 範本的 Cloud Storage 檔案路徑。changeStreamName:作業讀取的 Spanner 變更串流名稱。instanceId:Spanner 執行個體 ID。databaseId:Spanner 資料庫 ID。spannerProjectId:Spanner 執行個體所在的專案 ID。metadataInstance:儲存中繼資料的執行個體,連接器會使用這些中繼資料來控管變更串流 API 資料的耗用量。metadataDatabase:資料庫,用於儲存連接器用來控管變更串流 API 資料用量的中繼資料。sourceShardsFilePath:Cloud Storage 檔案的路徑,其中包含來源分片的連線設定檔資訊。
選用變數說明如下:
startTimestamp:開始讀取變更的時間戳記。預設為空白。endTimestamp:讀取變更的時間戳記。如果不提供時間戳記,程序會無限期讀取變更。預設為空白。shadowTablePrefix:用於命名陰影資料表的前置字串。預設值為shadow_。sessionFilePath:Cloud Storage 中工作階段檔案的路徑,內含 Spanner 遷移工具的對應資訊。filtrationMode:根據條件篩選記錄的方式。支援的模式為none或forward_migration。shardingCustomJarPath:Cloud Storage 中自訂 JAR 檔案的位置 (路徑),該檔案包含擷取分片 ID 的邏輯。 預設為空白。shardingCustomClassName:具有自訂分片 ID 實作項目的完整類別名稱。如果指定shardingCustomJarPath,則必須填寫這個欄位。預設為空白。shardingCustomParameters:字串,內含要傳遞至自訂分片類別的任何自訂參數。預設為空白。sourceDbTimezoneOffset:來源資料庫與世界標準時間的時區偏移量。例如:+10:00。預設值:+00:00。dlqGcsPubSubSubscription:在regular模式下執行時,用於 DLQ 重試目錄的 Cloud Storage 通知政策中的 Pub/Sub 訂閱項目。請以projects/<PROJECT_ID>/subscriptions/<SUBSCRIPTION_ID>格式指定名稱。設定這個參數後,系統會忽略deadLetterQueueDirectory和dlqRetryMinutes。skipDirectoryName:系統在反向複製期間略過記錄時,會將這些記錄寫入這個目錄。預設值:skip。maxShardConnections:每個分片允許的連線數量上限。 預設值:10000。deadLetterQueueDirectory:用於儲存 DLQ 輸出的路徑。預設值是 Dataflow 工作暫存位置下的目錄。dlqMaxRetryCount:系統透過 DLQ 重試暫時性錯誤的次數上限。預設值為 500。runMode:執行模式類型。選項為regular或retryDLQ。使用retryDLQ僅重試嚴重 DLQ 記錄。預設值:regular。dlqRetryMinutes:重試 DLQ 的間隔分鐘數。預設值為 10。sourceType:要反向複製的來源資料庫類型。預設值:mysql。transformationJarPath:Cloud Storage 中自訂 JAR 檔案的位置 (路徑),該檔案含有自訂轉換邏輯,可處理反向複製中的記錄。預設為空白。transformationClassName:具有自訂轉換邏輯的完整類別名稱。如果指定transformationJarPath,則必須填寫這個欄位。預設為空白。transformationCustomParameters:字串,內含要傳遞至自訂轉換類別的任何自訂參數。預設為空白。filterEventsDirectoryName:系統在反向複製期間略過記錄時,會將記錄寫入這個目錄。預設值:skip。