使用 AWS DMS 將 PostgreSQL 資料庫遷移到 PostgreSQL 資料庫的目標 RDS時,應使用哪些最佳實務?

2 分的閱讀內容
0

我有一個 PostgreSQL 來源資料庫,我想將其遷移到 PostgreSQL 來源資料庫的目標 Amazon Relational Database Service (Amazon RDS)。我可以使用哪些最佳實務,使用 AWS Database Migration Service (AWS DMS) 從一個 PostgreSQL 資料庫遷移到另一個資料庫?

簡短描述

使用 AWS DMS 遷移同性質的資料庫時,請使用引擎的原生工具,例如 pg_dump,複製初始資料。接下來,在目標上執行 pg_restore。您也可以使用邏輯複寫和 COPY 命令。如需詳細資訊,請參閱將 PostgreSQL 資料庫遷移至 Amazon RDS 和 Amazon Aurora 的最佳實務

若要從 PostgreSQL 資料庫的 RDS 遷移至另一個 PostgreSQL 資料庫的 RDS,請建立快照,然後將快照還原為目標。如需詳細資訊,請參閱將 PostgreSQL 資料庫執行個體的 RDS 快照遷移至 Aurora PostgreSQL 資料庫叢集

請注意,使用 AWS DMS 完整載入將所有資料從來源資料庫遷移到目標資料庫可能需要很長的時間。由於以下因素,您可能會遇到延遲問題:

  • 頻寬
  • 推送大量資料的來源容量
  • 可儲存、處理及轉發大量負載的複寫引擎容量
  • 使用來源資料的目標容量

相較之下,變更複製僅包含從來源到目標的變更,因此這類的工作負載可能會非常輕鬆。

建立並決定目前的日誌記錄序號 (LSN)

在進行備份之前,您必須取得標記來指示 AWS DMS 任務該從哪裡開始遷移變更。

在來源 PostgreSQL 資料庫上,執行這些查詢以建立和判斷目前的 LSN。

建立複寫時段:

SELECT * FROM
pg_create_logical_replication_slot('replication_slot_name','tset_decoding')

取得目前的 LSN:

SELECT restart_LSN  FROM pg_replication_slots WHERE slot_name = 'replication_slot_name';

restart_LSN 命令會指示 AWS DMS 任務從哪裡開始將變更從來源遷移到目標。

解決方案

使用這些最佳實務,將資料從 PostgreSQL 遷移到使用 AWS DMS 任務的 PostgreSQL。

完整載入期間請勿使用外部索引鍵和觸發程序

正在完整載入時,請確定遷移時未包含外部索引鍵和觸發程序。AWS DMS 會依照字母順序遷移資料表,但其無法區分哪些資料表是父資料表,哪些是子資料表。因此,AWS DMS 可能會先嘗試遷移子資料表。AWS DMS 接著會因為外部索引鍵違規而停止遷移資料表。因此,遷移期間在目標上隱藏或不包含外部索引鍵。

遷移期間,觸發程序絕不能出現在目標上,因為觸發程序會執行數個可能會損毀目標資料的程序。在接入時新增任何觸發程序。

遷移 JSON 資料時開啟完整 LOB 模式

當您以 JSON 格式遷移 LOB 時,請開啟完整 LOB 模式,以便 JSON 格式不會被截短。若您使用受限制的 LOB 模式,可能會發生資料截短的情形。接著,AWS DMS 會確保資料表失敗,因為 JSON 格式錯誤。

確保主索引鍵欄位不是 TEXT 資料類型

檢查主索引鍵欄位並非 TEXT,尤其是在開啟完整的 LOB 模式時。您可能會遇到 NULL 的 DUPLICATES,因為 AWS DMS 會將 TEXT 資料類型視為 LOB。因此,在滿載期間,AWS DMS 會嘗試將主索引鍵設為 NULL,然後報告出現重複情形,因為有許多文字欄具有相同的值。該錯誤永遠不會被視為「主索引鍵上不允許 NULL」,而是視為重複。這可能是一個難以發現和解決的問題,因此請務必確認您的主索引鍵欄位不是 TEXT,以避免此問題。

允許 AWS DMS 建立目標資料表

如果發生滿載情形,請允許 AWS DMS 在目標上建立資料表。AWS DMS 建立資料表時,也會為欄位建立不含 DEFAULT 值的相符欄位。欄位的預設值可能會在 AWS DMS 中導致非預期的行為。例如,SERIAL 會導致 AWS DMS 遷移失敗,因為此欄位想要自動建立值。請參閱此範例:

CREATE TABLE COMPANY (
   ID SERIAL PRIMARY KEY,
   NAME TEXT      NOT NULL);

如果目標的結構類似此例子,則 PostgreSQL 內部想要產生 ID 欄的值。但是,來源還包含 INSERT 的值,這會導致問題。因此,請確保在遷移期間 DEFAULTS 不是目標的一部分。

在任務資料表映射上將分割區定義為來源資料表

遷移分割區資料表時,請務必將分割區定義為任務資料表映射上的來源資料表,而非父資料表。這是因為 WAL 日誌會保留分割區資料表資訊。父資料表僅能在滿載期間使用,因此請勿在 CDC 階段使用父資料表。如果您在 CDC 期間定義父資料表,可能會遇到影響遷移的重複錯誤。

此外,當您映射目標資料表時,請確保所有分割區都重新映射到父資料表。這意味著父資料表用於自動分配到其分割區。

您使用 PGLOGICAL 時,定義來源上的所有方面

您使用 PGLOGICAL 進行遷移時,請確定您定義了來源所需的每個方面。如果跳過某個區域,您就會看到非預期的行為。由此造成的問題很難進行疑難排解,因此在開始使用 PGLOGICAL 進行遷移之前,請檢查您是否已定義這些區域。

針對 Amazon RDS,請定義以下項目:

參數群組:

shared_preload_libraries = pglocical

資料庫等級:

create extension pglogical;

針對內部部署,請定義以下項目:

postgresql.conf:

shared_preload_libraries = pglogical

資料庫等級:

create extension pglogical;

確保目標上定義了所有在來源上定義的 PG 外掛程式

請確定您在來源上定義的所有 PG 外掛程式也已在目標上定義。這有助於相容和流暢地處理資料。

確保任務不會維持在停止/錯誤狀態

當工作在 [停止] 或 [錯誤] 狀態下耗費很長時間時,複寫時段上的儲存空間就會滿載。

從來源刪除手動建立的複寫時段

如果您手動建立了任何複寫時段,請在遷移完成時將其從來源刪除。如果複寫時段保留在來源上,則其大小會累積,並且儲存空間會滿載。

使用主索引鍵/唯一索引遷移資料表

這是確保您正在遷移的資料表具有主索引鍵/唯一索引的最佳實務。如果資料表沒有主索引鍵,則 UPDATE 和 DELETE 陳述式可能不會套用在資料表上,因為它們未記錄在 WAL 日誌中。對於沒有主索引鍵的資料表,請使用 REPLICATE IDENTITY FULL,但請注意,這會在日誌中產生大量資訊。


相關資訊

使用 PostgreSQL 資料庫做為 AWS DMS 來源

資料遷移目標

AWS 官方
AWS 官方已更新 2 年前