使用 AWS DMS 建立持續複寫的任務 - AWS Database Migration Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS DMS 建立持續複寫的任務

您可以建立 AWS DMS 任務,從來源資料存放區擷取持續進行的變更。您可以在遷移資料的同時執行此擷取。您也可以建立任務,在完成初始 (完全載入) 遷移到支援的目標資料存放區之後,擷取持續進行的變更。此程序稱為持續複寫或變更資料擷取 (CDC)。AWS DMS 會在複寫來自來源資料存放區的持續進行變更時使用此程序。此程序的運作方式為使用資料庫引擎的原生 API,將變更收集到資料庫日誌。

注意

您只能使用完全載入任務來遷移檢視。如果您的任務是僅限 CDC 的任務,或是在完成之後啟動 CDC 的完全載入任務,則遷移只會包含來自來源的資料表。使用僅限完全載入的任務,您可以遷移檢視或資料表和檢視的組合。如需更多詳細資訊,請參閱 使用 JSON 指定資料表選擇及轉換

每個來源引擎都有特定的組態需求,用於將此變更串流公開給指定的使用者帳戶。大多數的引擎都需要一些額外設定,才能讓擷取程序以有意義的方式使用變更資料,同時不遺失資料。例如,Oracle 需要額外的增補日誌記錄,MySQL 則需要資料列層級的二進位日誌記錄 (二進位日誌記錄)。

為了從來源資料庫讀取持續進行的變更,AWS DMS 使用引擎專屬的 API 動作來從來源引擎的交易日誌讀取變更。以下是 AWS DMS 執行該作業方式的一些範例:

  • 針對 Oracle,AWS DMS 使用 Oracle LogMiner API 或二進位讀取器 API (bfile API) 來讀取持續進行的變更。AWS DMS 會根據系統變更編號 (SCN) 從線上或存檔重做日誌讀取持續進行的變更。

  • 針對 Microsoft SQL Server,AWS DMS 會使用 MS-Replication 或 MS-CDC 將資訊寫入 SQL Server 交易日誌。它接著會根據記錄序號 (LSN) 使用 SQL Server 中的 fn_dblog() fn_dump_dblog() 函數讀取交易日誌中的變更。

  • 針對 MySQL,AWS DMS 會從以資料列為基礎的二進位日誌 (binlog) 讀取變更,並將那些變更遷移至目標。

  • 針對 PostgreSQL,AWS DMS 會設定邏輯複寫位置,並使用 test_decoding 外掛程式從來源讀取變更,並將他們遷移到目標。

  • 針對以 Amazon RDS 做為來源的情況,我們建議您確認已啟用備份來設定 CDC。我們也建議您確定來源資料庫設定的變更記錄保留時間充足,通常 24 小時就足夠了。如需每個端點的詳細設定,請參閱以下內容:

持續複寫任務有兩種類型:

  • 完全載入加上 CDC – 任務會遷移現有資料,然後根據來源資料庫的變更更新目標資料庫。

  • 僅 CDC – 任務會在您於目標資料庫上擁有資料後遷移持續進行的變更。

從 CDC 起點開始執行複寫

您可以從數個點啟動 AWS DMS 持續複寫任務 (僅變更資料擷取)。所需資訊包括下列項目:

  • 從自訂 CDC 啟動時間 – 您可以使用 AWS Management Console 或 AWS CLI 來向 AWS DMS 提供您希望啟動複寫的時間戳記。AWS DMS 接著會從這個自訂 CDC 啟動時間開始持續複寫任務。AWS DMS 會將指定的時間戳記 (格式為 UTC) 轉換成原生起點,例如 SQL Server 的 LSN,或是 Oracle 的 SCN。AWS DMS 會使用引擎專屬的方法,根據來源引擎的變更串流決定要從何處開始遷移任務。

    注意

    只有將 StartFromContext 連線屬性設定為所需的時間戳記,Db2 作為來源時才會提供自訂的 CDC 開始時間。

    以 PostgreSQL 做為來源則不支援自訂 CDC 啟動時間。這是因為 PostgreSQL 資料庫引擎與 Oracle 和 SQL Server 不同,沒有將時間戳記映射到 LSN 或 SCN 的方法。

  • 從 CDC 原生起點 – 您也可以從來源引擎交易日誌中的原生點開始。在某些情況下,您可能會偏好使用此方法,因為時間戳記可以指出交易日誌中的多個原生點。AWS DMS 針對下列來源端點支援此功能:

    • SQL Server

    • PostgreSQL

    • Oracle

    • MySQL

    • MariaDB

建立任務時,AWS DMS 會標記 CDC 的起點,並且無法變更。若要使用不同的 CDC 起點,請建立新任務。

決定 CDC 原生起點

CDC 原生起點是資料庫引擎的日誌中的一點,定義您可開始 CDC 的時間。例如,假設大量資料傾印已套用到目標。您可以尋找僅持續複寫任務的原生起點。為避免產生資料不一致,請謹慎選擇僅複製任務的起點。DMS 會擷取在所選 CDC 起點之後啟動的交易。

以下範例說明您如何從支援的來源引擎尋找 CDC 原生起點:

SQL Server

在 SQL Server 中,記錄序號 (LSN) 分成三個部分:

  • 虛擬日誌檔 (VLF) 序號

  • 日誌區塊的啟動位移

  • 位置編號

範例 LSN 如下:00000014:00000061:0001

若要根據您的交易日誌備份設定取得 SQL Server 遷移任務的起點,請使用 SQL Server 中的 fn_dblog()fn_dump_dblog() 函數。

若要搭配 SQL Server 使用 CDC 原生起點,請在參與持續複寫的任何資料表上建立發佈。當您使用 CDC 而不使用 CDC 原生起始點時,AWS DMS 會自動建立發佈。

PostgreSQL

您可以為您的 PostgreSQL 來源資料庫使用 CDC 復原檢查點。當來源資料庫 (父項任務) 執行持續複寫任務時,此檢查點值會在不同的時間點產生。如需整體檢查點的詳細資訊,請參閱:使用檢查點做為 CDC 起點

若要識別用作為原生起點的檢查點,請使用您的資料庫 pg_replication_slots 檢視或 AWS Management Console 的父項任務的概觀詳細資訊。

在主控台上尋找父項任務的概觀詳細資訊
  1. 請登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/dms/v2/ 的 AWS DMS 主控台。

    如果您以 IAM 使用者身分登入,請確認您具備存取 AWS DMS 的適當許可。如需所需許可的詳細資訊,請參閱 使用 AWS DMS 所需的 IAM 許可

  2. 從導覽窗格中,選擇 Database migration tasks (資料庫遷移任務)

  3. Database migration tasks (資料庫遷移任務) 頁面的清單中選擇您的父任務。這會開啟顯示概觀詳細資訊的父項任務頁面。

  4. Change data capture (CDC) (變更資料擷取 (CDC))Change data capture (CDC) start position (變更資料擷取 (CDC) 起始位置) 以及 Change data capture (CDC) recovery checkpoint (變更資料擷取 (CDC) 復原檢查點) 下尋找檢查點值。

    該數值會顯示如下:

    checkpoint:V1#1#000004AF/B00000D0#0#0#*#0#0

    在這裡,4AF/B00000D0 元件是您需要指定此原生 CDC 起點的元件。當您建立 CDC 任務為您的 PostgreSQL 來源在此起點開始複寫時,請將 DMS API 的 CdcStartPosition 參數設定為此數值。如需使用 AWS CLI 建立此 CDC 任務的詳細資訊,請參閱使用受管的 PostgreSQL 資料庫 AWS執行個體啟用 CDC AWS DMS

Oracle

系統變更編號 (SCN) 是一種 Oracle 資料庫所使用的邏輯、內部時間戳記。SCN 會將資料庫中發生的事件排序,以滿足交易的 ACID 屬性。Oracle 資料庫使用 SCN 來標記所有變更寫入磁碟的位置,以使復原動作不會套用已寫入的變更。Oracle 也會針對一組資料使用 SCN 標記不存在重做的點,以使復原能夠停止。

若要取得 Oracle 資料庫中目前的 SCN,請執行以下命令。

SELECT CURRENT_SCN FROM V$DATABASE

如果您使用 SCN 或時間戳記來啟動 CDC 工作,將會遺漏任何開啟中交易的結果,而且無法遷移這些結果。開啟中交易是指起始於任務開始位置之前,並在任務開始位置之後遞交的交易。您可以識別 SCN 和時間戳記,以便在包含所有開啟中交易的時間點啟動 CDC 工作。如需更多資訊,請參閱 Oracle 線上文件中的 Transactions (交易)。使用版本 3.5.1 及更新版本時,如果您使用 SCN 或時間戳記啟動任務,則 AWS DMS 會使用 openTransactionWindow 端點設定支援僅限 CDC 工作的開啟中交易。

使用 openTransactionWindow 設定時,您必須提供開啟中交易的處理時間 (以分鐘數為單位)。AWS DMS 會轉移擷取位置,並找到開始擷取資料的新位置。 AWS DMS 會使用新的起始位置來掃描所需 Oracle 重做或存檔重做日誌中的任何開啟中交易。

MySQL

在 MySQL 5.6.3 版發行之前,MySQL 的記錄序號 (LSN) 是 4 位元組不含正負號的整數。在 MySQL 5.6.3 版中,當重做日誌大小限制從 4 GB 增加至 512 GB 時,LSN 便會變成 8 位元組不含正負號的整數。該增加反映了存放額外大小資訊所需要的額外位元組。在使用 LSN 值的 MySQL 5.6.3 及更新版本上建置的應用程式應使用 64 位元,而非 32 位元的變數來存放及比較 LSN 值。如需 MySQL LSN 的詳細資訊,請參閱 MySQL documentation

若要取得 MySQL 資料庫中目前的 LSN,請執行以下命令。

mysql> show master status;

查詢會傳回一個 binlog 檔案名稱、位置,以及其他數個值。CDC 原生起點是 binlog 檔案名稱和位置的組合,例如 mysql-bin-changelog.000024:373。在此範例中,mysql-bin-changelog.000024 是 binlog 檔案名稱,373 則是 AWS DMS 需要啟動擷取變更的位置。

使用檢查點做為 CDC 起點

持續進行的複寫任務會遷移變更,而 AWS DMS 會不時快取 AWS DMS 專屬的檢查點資訊。AWS DMS 建立的檢查點包含資訊,可讓複寫引擎了解變更串流的復原點。您可以使用檢查點來在變更的時間軸上返回,並復原失敗的遷移任務。您也可以使用檢查點針對其他目標,於任何指定的時間點啟動另一個持續複寫任務。

您可以透過三種方式中的其中一種取得檢查點資訊:

  • 執行 API 操作 DescribeReplicationTasks 並檢視結果。您可以透過任務篩選資訊並搜尋檢查點。您可以在任務處於停止或失敗狀態時擷取最新的檢查點。若任務遭到刪除,則會遺失此資訊。

  • 檢視目標執行個體上名為 awsdms_txn_state 的中繼資料表。您可以查詢資料表來取得檢查點資訊。若要建立中繼資料表,請在建立任務時將 TaskRecoveryTableEnabled 參數設為 Yes。此設定會使 AWS DMS 持續將檢查點資訊寫入目標中繼資料表。若任務遭到刪除,則會遺失此資訊。

    例如,以下是中繼資料表中的範例檢查點:checkpoint:V1#34#00000132/0F000E48#0#0#*#0#121

  • 在瀏覽窗格中,選擇資料庫遷移任務,然後從 [資料庫遷移任務] 頁面上顯示的清單中選擇您的父任務。父任務頁面隨即開啟,顯示概觀詳細資訊。在 Change data capture (CDC) (變更資料擷取 (CDC))、Change data capture (CDC) start position (變更資料擷取 (CDC) 起始位置) 以及 Change data capture (CDC) recovery checkpoint (變更資料擷取 (CDC) 復原檢查點) 下尋找檢查點值。該檢查點值會顯示如下:

    checkpoint:V1#1#000004AF/B00000D0#0#0#*#0#0

在遞交或伺服器時間點停止任務

隨著引進 CDC 原生起點,AWS DMS 也可以在下列時間點停止任務:

  • 來源上的遞交時間

  • 複寫執行個體上的伺服器時間

您可以視需要修改任務及設定時間 (格式為 UTC)。任務會根據您設定的遞交或伺服器時間自動停止。或者,若您知道在建立任務時停止遷移任務的適當時間,您也可以在建立任務時設定停止時間。

注意

第一次啟動新的 AWS DMS 無伺服器複製時,最多可能需要 40 分鐘的時間來初始化所有資源。請注意,server_time 選項只有在資源初始化完成後才適用。

執行雙向複寫

您可以使用 AWS DMS 任務在兩個系統之間執行雙向複寫。在「雙向複寫」中,您可以從兩個系統之間的相同資料表 (或一組資料表) 以兩個方向複寫資料。

例如,您可以將 EMPLOYEE 資料表從資料庫 A 複製到資料庫 B,並將資料庫 A 的變更複寫到資料庫 B。您也可以將 EMPLOYEE 資料表的變更從資料庫 B 複寫回 A。因此,您執行的是雙向複製。

注意

AWS DMS 雙向複寫的目的不是做為完整的多主機解決方案,包括主節點、衝突解決等。

針對不同節點上的資料在操作上分離的情況,請使用雙向複寫。換句話說,假設您有一個資料元素由節點 A 上操作的應用程式所變更,而且節點 A 與節點 B 執行雙向複寫。則節點 A 上的資料元素永遠不會被節點 B 上操作的任何應用程式所變更。

AWS DMS 支援在這些資料庫引擎上進行雙向複寫:

  • Oracle

  • SQL Server

  • MySQL

  • PostgreSQL

  • Amazon Aurora MySQL-Compatible Edition

  • Amazon PostgreSQL-Compatible Edition

建立雙向複寫任務

若要啟用 AWS DMS 雙向複寫,請為兩個資料庫 (A 和 B) 設定來源和目標端點。例如,設定資料庫 A 的來源端點、資料庫 B 的來源端點、資料庫 A 的目標端點和資料庫 B 的目標端點。

然後建立兩個任務:一個任務讓來源 A 將資料移至目標 B,另一個任務讓來源 B 將資料移至目標 A。此外,請確定每個任務都已設定迴路預防。這樣做可以防止將相同的變更套用至兩個任務的目標,而不致損毀至少其中一個任務的資料。如需更多詳細資訊,請參閱 防止迴路

最簡單的方法是從資料庫 A 和資料庫 B 上的相同資料集開始,然後建立兩個僅 CDC 任務,一個將資料從 A 複寫到 B 的任務,另一個將資料從 B 複寫到 A 的任務。

要使用 AWS DMS 從節點 A 執行個體化節點 B 上的新資料集 (資料庫),請執行以下操作:

  1. 使用完整載入和 CDC 任務將資料從資料庫 A 移至 B。請確定在此期間沒有任何應用程式修改資料庫 B 上的資料。

  2. 當完整載入完成並在允許應用程式修改資料庫 B 上的資料之前,請注意資料庫 B 的時間或 CDC 起始位置。如需指示,請參閱從 CDC 起點開始執行複寫

  3. 使用此起始時間或 CDC 起始位置,建立一個僅 CDC 任務將資料從資料庫 B 移回 A。

注意

雙向對中只有一個任務可以完整載入和 CDC。

防止迴路

為了顯示防止迴路,假設在任務 T1 中,AWS DMS 讀取來源資料庫 A 的變更日誌,並將變更套用至目標資料庫 B。

接下來,第二項任務 T2 從來源資料庫 B 讀取變更日誌,並將它們套用回目標資料庫 A。在 T2 執行這項操作之前,DMS 必須確定從來源資料庫 A 對目標資料庫 B 所做的相同變更不會對來源資料庫 A 進行。換句話說,DMS 必須確定這些變更不會回應 (循環) 回目標資料庫 A。否則,資料庫 A 中的資料可能會損毀。

若要防止變更迴路,請將下列任務設定新增至每個雙向複寫任務。這樣做可確保任一方向都不會發生迴路資料損毀。

{ . . . "LoopbackPreventionSettings": { "EnableLoopbackPrevention": Boolean, "SourceSchema": String, "TargetSchema": String }, . . . }

LoopbackPreventionSettings 任務設定會判斷交易是新的還是來自相反複寫任務的回應。當 AWS DMS 將交易套用至目標資料庫時,它會以變更的指示更新 DMS 資料表 (awsdms_loopback_prevention)。在將每個交易套用至目標之前,DMS 會忽略包含此 awsdms_loopback_prevention 資料表參考的任何交易。因此,它不會套用變更。

將這些任務設定包含在雙向配對中的每個複寫任務。這些設定可啟用迴路預防。它們也會為包含每個端點之 awsdms_loopback_prevention 資料表的任務中的每個來源和目標資料庫指定結構描述。

若要讓每個任務都能夠識別此類回應並加以捨棄,請將 EnableLoopbackPrevention 設定為 true。若要在包含 awsdms_loopback_prevention 的來源指定結構描述,請將 SourceSchema 設定為來源資料庫中該結構描述的名稱。若要在包含相同資料表的目標指定結構描述,請將 TargetSchema 設定為目標資料庫中該結構描述的名稱。

在以下範例中,複寫任務 T1 及其相反複製任務 T2 的SourceSchemaTargetSchema 設定是以相反的設定指定的。

任務 T1 的設定如下。

{ . . . "LoopbackPreventionSettings": { "EnableLoopbackPrevention": true, "SourceSchema": "LOOP-DATA", "TargetSchema": "loop-data" }, . . . }

相反任務 T2 的設定如下。

{ . . . "LoopbackPreventionSettings": { "EnableLoopbackPrevention": true, "SourceSchema": "loop-data", "TargetSchema": "LOOP-DATA" }, . . . }
注意

使用 AWS CLI 時,僅使用 create-replication-taskmodify-replication-task 命令來設定雙向複寫任務中的 LoopbackPreventionSettings

雙向複寫的限制

AWS DMS 的雙向複寫有下列限制:

  • 迴路預防只會追蹤資料處理語言 (DML) 陳述式。AWS DMS 不支援防止資料定義語言 (DDL) 迴路。若要這麼做,請在雙向對中設定其中一個任務,篩選出 DDL 陳述式。

  • 使用迴路預防的任務不支援批次遞交變更。若要設定具有迴路預防的任務,請確定將 BatchApplyEnabled 設定為 false

  • DMS 雙向複寫不包括衝突偵測或解決方法。若要偵測資料不一致,請在這兩項任務上使用資料驗證。