診斷 PostgreSQL 到 AlloyDB 遷移作業中的問題

排解遷移錯誤

遷移工作程序在執行階段可能會發生錯誤。

  • 部分錯誤 (例如來源資料庫的密碼有誤) 可以復原,也就是說,修正錯誤後,遷移工作就會自動繼續執行。
  • 有些錯誤無法復原,例如資料複製錯誤,這表示遷移工作必須從頭開始。

發生錯誤時,遷移工作狀態會變更為 Failed,子狀態則會反映失敗前的最後狀態。

如要排解錯誤,請前往失敗的遷移工作查看錯誤,然後按照錯誤訊息中的步驟操作。

如要查看錯誤的詳細資料,請使用遷移工作中的連結前往 Cloud Monitoring。系統會根據特定遷移工作篩選記錄。

下表列出一些問題範例和解決方法:

問題 可能原因 建議做法
無法連線至來源資料庫執行個體。 來源資料庫執行個體與目的地執行個體之間的連線發生問題。 請按照「偵錯連線���一���中的步驟操作。
來源和目的地資料庫版本不相容,導致遷移工作無法執行。 來源和目的地資料庫版本不支援搭配使用。具體來說,您提供的來源資料庫版本與目的地資料庫版本不相容。 請確認目標資料庫版本與來源資料庫版本相同,或比來源資料庫版本高一個主要版本。然後建立新的遷移工作。
來源上已封鎖資料定義語言 (DDL) 或資料操縱語言 (DML)。 需要 ACCESS EXCLUSIVE lock 且在完整傾印階段執行的 DDL 會遭到封鎖。

在初始同步程序 (完整傾印) 期間,請避免在資料表上執行 DDL 或需要 ACCESS EXCLUSIVE 鎖定的程式 (例如 ALTER TABLEDROP TABLE)。否則,DDL 或程式會等到初始同步完成後才開始。

舉例來說,如果資料表仍在初始同步程序中,且在同一個資料表上執行 ALTER TABLE 指令,則系統不會執行該指令,且後續的 DDL 和 DML 指令都會遭到封鎖,直到初始同步完成為止。

錯誤訊息:No pglogical extension installed on databases (X) 一或多個來源資料庫未安裝 pglogical 請按照這些指南,在來源執行個體的資料庫上安裝 pglogical
錯誤訊息:Replication user 'x' doesn't have sufficient privileges. 使用資料庫移轉服務的使用者沒有執行指定作業的必要權限。 請按照這些指南操作,確保使用者具備必要權限。
錯誤訊息:Unable to connect to source database server. 資料庫遷移服務無法與來源資料庫伺服器建立連線。 請確認來源和目的地資料庫執行個體可以相互通訊,且您已完成定義遷移工作設定時顯示的所有必要先決條件。
錯誤訊息:The source database 'wal_level' configuration must be equal to 'logical'. 來源資料庫的 wal_level 設為 logical 以外的值。 wal_level 設為 logical
錯誤訊息:The source database 'max_replication_slots' configuration is not sufficient. max_replication_slots」參數設定有誤。 請按照這些規範正確設定這個參數。
錯誤訊息:The source database 'max_wal_senders' configuration is not sufficient. max_wal_senders」參數設定有誤。 請按照這些規範正確設定這個參數。
錯誤訊息:The source database 'max_worker_processes' configuration is not sufficient. max_worker_processes」參數設定有誤。 請按照這些規範正確設定這個參數。

錯誤訊息:Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.

錯誤訊息:Error promoting EM replica: finished drop replication with errors.

升級遷移工作時,無法清除複製作業所需的設定。

針對每個資料庫,以具備 superuser 權限的使用者身分執行指令。

如要進一步瞭解要執行的指令,請參閱「清除複製運算單元」。

錯誤訊息:x509 certificate signed by unknown authority.

提供給資料庫移轉服務的來源 CA 憑證可能只包含根憑證。不過,來源憑證需要根憑證和所有中繼憑證。

舉例來說,使用 rds-ca-2019-root.pem 憑證可能會導致 Amazon Relational Database Service 發生這個問題。

建立合併來源 CA 憑證,內含根憑證和所有必要的中繼憑證。

如果是 Amazon Relational Database Service 用例,請使用 rds-combined-ca-bundle.pem 憑證,而非 rds-ca-2019-root.pem 憑證。

錯誤訊息:ERROR: Out of shared memory HINT: You might need to increase max_locks_per_transaction.

max_locks_per_transaction 參數設定的值不足。 將這個參數的值設為至少 {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions)。

錯誤訊息:ERROR: no data left in message.

來源執行個體未正確安裝 pglogical 套件。 如要進一步瞭解如何正確安裝這個套件,請參閱「在來源執行個體中安裝 pglogical 套件」。

錯誤訊息:Cannot assign TransactionIds during recovery.

設定的來源處於復原模式。 設定未處於復原模式的來源。
完整傾印作業速度緩慢。 從來源資料庫匯入大量資料時,AlloyDB 目的地可能會變慢。
  • 為 AlloyDB 目的地選擇較高的層級,以取得可用的最大網路和磁碟頻寬。
  • 調整 AlloyDB 目的地的 max_wal_size 標記。通常來說,32 GB 或 64 GB 是這項旗標的合適值。更新這個旗標不需要重新啟動伺服器。
錯誤訊息:subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again

遷移工作在完整傾印階段失敗,且無法復原。來源資料庫執行個體已重新啟動或處於復原模式,或��� wal_sender_timeout 參數設定的值不足,導致複寫連線結束。

如要找出問題的根本原因,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「記錄檔探索工具」頁面。
  2. 從資源清單中選取 AlloyDB 執行個體。系統會顯示執行個體的最新記錄清單。
  3. 從記錄檔名稱中選取 postgres.log
  4. 將記錄的嚴重程度設為 Warning 以上的所有層級。第一個錯誤記錄檔可能是失敗的根本原因。
  • 請確保資料庫移轉服務在完整傾印階段,一律能連線至來源資料庫執行個體。
  • 檢查來源資料庫執行個體上的 wal_sender_timeout 參數值是否設為較大的數字 (例如 0)。
  • 重新啟動遷移工作,然後再試一次。
錯誤訊息:ERROR: unknown column name {column_name}

主要節點上複製的資料表新增了資料欄,但副本節點上沒有。

只有資料操縱語言 (DML) 變更會在連續遷移期間自動更新。使用者有責任管理資料定義語言 (DDL) 變更,確保來源和目的地資料庫保持相容。兩種執行方式如下:

  • 停止寫入來源資料庫,並在來源和目的地中執行 DDL 指令。在目的地執行 DDL 指令之前,請將 cloudsqlexternalsync 角色授予套用 DDL 變更的 Cloud SQL 使用者。
  • 在相同的時間點使用 pglogical.replicate_ddl_command,在來源和目的地中執行 DDL 指令。執行指令的使用者在來源和目的地必須有相同的使用者名稱,且應為超級使用者或要遷移構件 (例如資料表、序列、檢視區塊或資料庫) 的擁有者。
  • 如需使用 pglogical.replicate_ddl_command. 的範例,請參閱「持續遷移」。

錯誤訊息:ERROR: cannot truncate a table referenced in a foreign key constraint

使用者嘗試截斷具有外部鍵限制的表���。

請���移除外鍵限制,再截斷資料表。

錯誤訊息:ERROR: connection to other side has died

wal_sender_timeout parameter 的值設定不足,因此複製連線已結束。初始傾印成功後,通常會在複製階段發生錯誤。

請考慮增加 wal_sender_timeout 參數值,或在來源資料庫執行個體上將值設為 0,藉此停用逾時機制。

如果您遷移選取的資料庫,但遷移工作無法將資料複製到一或多個資料庫,資料庫清單中就會顯示「失敗」狀態。 各種遷移工作錯誤。

按一下「錯誤」欄中的「查看錯誤」並修正。您也可以從遷移工作中移除失敗的資料庫。

如要進一步瞭解如何從遷移工作移除失敗的資料庫,請參閱「管理遷移工作」。

清除複製運算單元

您會看到下列其中一則訊息:

  • Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.
  • Error promoting EM replica: finished drop replication with errors.

可能原因

升級 AlloyDB 執行個體時,如果 AlloyDB 執行個體無法連線至來源執行個體 (例如來源執行個體未執行,或您從來源執行個體的允許清單中移除了 AlloyDB 執行個體),則在升級遷移工作期間,系統無法清除複製作業所需的設定。您必須手動清除複製位置。

建議做法

請以具備 superuser 權限的使用者身分,為每個資料庫執行下列指令:

  1. 從錯誤訊息中取得複製運算單元名稱,然後執行下列指令,逐一捨棄運算單元:

    select pg_drop_replication_slot({slot_name});
  2. 如果錯誤訊息中未顯示複製運算單元名稱,請執行下列指令,查詢現有的複製運算單元:

    select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%alloydb%' and active = 'f';
  3. 如果沒有使用來源執行個體的 AlloyDB 副本,請執行下列指令來清除 pglogical 設定:

    select pglogical.drop_node(node_name) from pglogical.node where node_name like 'alloydb';
  4. 如果不再需要 pglogical 擴充功能,請執行下列指令來解除安裝:

    DROP EXTENSION IF EXISTS pglogical;

在啟動程序模式下刪除孤立的 AlloyDB 叢集

在��數極端情況下,您可能會發現遷移作業已刪除,但相關聯的 AlloyDB 叢集仍在啟動模式。您可以搭配 --force 選項,使用 AlloyDB 的 gcloud 叢集刪除指令刪除叢集。

請注意,如果遷移作業正在使用啟動程序叢集,刪除該叢集會導致未定義的行為。

管理使用者和角色

遷移現有使用者

目前,資料庫遷移服務不支援將現有使用者從來源執行個體遷移至目的地 AlloyDB 執行個體。您可以在 AlloyDB 中手動建立使用者,管理這項遷移作業。

關於alloydbexternalsync使用者

遷移期間,AlloyDB 主要執行個體上的所有物件都由 alloydbexternalsync 使用者擁有。資料遷移完成後,您可以按照下列步驟,將物件擁有權轉移給其他使用者:

  • 請執行 GRANT alloydbexternalsync to {USER} 指令。
  • 在每個資料庫上執行 reassign owned by alloydbexternalsync to {USER}; 指令。
  • 如要移除 alloydbexternalsync 使用者,請執行 drop role alloydbexternalsync 指令。