本頁面概略說明如何將線上交易處理 (OLTP) 資料庫從 MySQL 遷移至 Spanner。遷移至 Spanner 的程序可能因資料大小、停機時間規定、應用程式程式碼複雜度、資料分割結構定義、自訂函式,以及容錯移轉和複製策略等因素而異。
Spanner 遷移作業可細分為下列步驟:
- 評估遷移作業。
- 遷移結構定義,並轉譯所有 SQL 查詢。
- 遷移應用程式,除了 MySQL 之外,也使用 Spanner。
- 載入範例資料並提升成效。
- 遷移資料。
- 驗證遷移作業。
評估遷移作業
評估從來源 MySQL 資料庫遷移至 Spanner 的作業時,需要評估您的業務、技術、營運和財務需求。詳情請參閱「評估遷移作業」。
遷移結構定義
使用 Spanner 遷移工具,將現有結構定義轉換為 Spanner 結構定義。
詳情請參閱「從 MySQL 遷移結構定義」。
遷移應用程式以使用 Spanner
Spanner 提供一組適用於各種語言的用戶端程式庫,並可使用 Spanner 專屬 API 呼叫、SQL 查詢和資料操縱語言 (DML) 陳述式讀取及寫入資料。使用 API 呼叫對於某些查詢 (例如直接依鍵值讀取列) 可能更迅速,因為不需要翻譯 SQL 陳述式。
Spanner 為 Java 應用程式提供 JDBC 驅動程式。
如先前所述,遷移程序的一部分是實作應用程式中不支援的 Spanner 功能。舉例來說,如要實作驗證資料值並更新相關資料表的觸發條件,應用程式必須使用讀取或寫入交易,讀取現有資料列、驗證限制,然後將更新後的資料列寫入兩個資料表。
Spanner 交易的預設隔離等級為可序列化隔離,可確保資料的外部一致性。Spanner 也提供可重複讀取隔離。建議您在應用程式遷移過程中,將隔離等級設為可重複讀取,並將並行控制設為悲觀並行,讓 Spanner 的交易語意與 MySQL 的預設交易語意密切相符。如需瞭解如何在應用程式中設定隔離層級和並行控制,請參閱「使用可重複讀取隔離層級」和「設定並行控制」。
Spanner 提供讀取或寫入和唯讀交易。此外,讀取交易可以套用時間戳記界限,讀取資料的穩定版本,方法如下:
- 過去的精確時間 (最多 1 小時以前)。
- 在未來 (讀取將被封鎖,直至到達該時刻為止)。
- 在可接受的有界限過時程度內,傳回過去某個時間點的一致檢視畫面,而不必檢查其他副本是否有更新的資料。這樣可以獲得效能益處,但代價是資料可能過時。
將範例資料載入 Spanner
您可以在將完整資料移轉至 Spanner 之前載入範例資料,測試結構定義、查詢和應用程式。
您可以使用 BigQuery 反向 ETL 工作流程和 Google Cloud CLI,將少量 CSV 檔案格式的資料載入 Spanner。
詳情請參閱「載入範例資料」。
如要將資料從 MySQL 轉移至 Spanner,您也可以將 MySQL 資料庫匯出為可攜式檔案格式 (例如 XML),然後使用 Dataflow 將資料匯入 Spanner。
將資料遷移至 Spanner
最佳化 Spanner 結構定義並載入樣本資料後,即可將資料移至空白的正式環境大小 Spanner 資料庫。
詳情請參閱「遷移 MySQL 資料」。
驗證資料遷移作業
資料串流至 Spanner 資料庫時,您可以定期比較 Spanner 資料和 MySQL 資料,確保資料一致。您可以查詢兩個資料來源,並比較結果,以驗證一致性。
您可以使用 join 轉換,透過 Dataflow 對大型資料集進行詳細比較。這項轉換會擷取 2 個鍵控資料集,並依鍵比對值。接下來可以比較被匹配的值是否相等。您可以定期執行此一驗證,直到一致性等級符合您的公司需求。
詳情請參閱「驗證資料遷移作業」。
設定備援和轉換
您可以使用反向複製功能,設定 MySQL 的備用和轉換作業。設定回溯功能有助於確保您有應變計畫,可在切換至 Spanner 後發生問題時,還原至來源 MySQL 資料庫。
如果 Spanner 發生非預期的問題,需要復原至原始 MySQL 資料庫,且盡可能減少服務中斷,反向複製功能就非常實用。反向複製功能會將寫入 Spanner 的資料複製回來源 MySQL 資料庫,以便進行備用。
反向複製流程包含下列步驟,由 spanner-to-sourcedb Dataflow 範本執行:
使用 Spanner 變更串流讀取 Spanner 中的變更。
篩選前向遷移的變更。
轉換 Spanner 資料,使其與來源資料庫結構定義相容。
確認來源資料庫是否已包含指定主鍵的最新資料。
將資料寫入來源資料庫。
後續步驟
- 結構定義設計最佳做法。
- 最佳化 Spanner 結構定義。
- 設定備用 MySQL。
- 從 MySQL 執行轉換。
- 執行備用作業,切換至 MySQL。
- 瞭解如何在更複雜的情況下使用 Dataflow。