將內部部署 PostgreSQL 資料庫移轉到 Azure

已完成

公司決定移至適用於 PostgreSQL 的 Azure 資料庫,下一步是規劃如何移轉內部部署資料庫,以及選擇移動其資料的工具。

您已探索適用於 PostgreSQL 的 Azure 資料庫如何在 Azure 上支援和調整 PostgreSQL,現在想要考慮如何移轉現有的內部部署資料庫。

在此單元中,您將了解如何使用 Azure 入口網站,建立適用於 PostgreSQL 的 Azure 資料庫服務執行個體。 若需要建立許多此服務的執行個體,您可以使用 Azure 命令列介面編寫流程。

建立適用於 PostgreSQL 的 Azure 資料庫彈性伺服器

在 Azure 入口網站中,在搜尋方塊中鍵入適用於 PostgreSQL 的 Azure 資料庫彈性伺服器,然後選取適用於 PostgreSQL 的 Azure 資料庫彈性伺服器

螢幕擷取畫面:顯示 Azure 入口網站中適用於 PostgreSQL 的 Azure 資料庫彈性伺服器項目。

在 [彈性伺服器] 主要窗格上選取 [建立],輸入服務的詳細資料。 這些詳細資料包括:

  • 資源群組。 伺服器的資源群組。

  • 伺服器名稱。 必須是介於 3 到 63 個字元的唯一名稱,其中僅包含小寫字母、數字和連字號。

  • 區域。 伺服器的區域。

  • PostgreSQL 版本:選取與所要移轉的內部部署資料庫對應的版本。

  • 工作負載類型。 根據工作負載選取選項。

    • 計算 + 儲存體。 選取 [設定伺服器] 以設定定價層,並指定服務所需的資源。 第 1 單元涵蓋了這些選項的內容。 請記住,如果您選取 [一般用途] 或 [記憶體最佳化] 定價層,您可以在稍後擴大和縮小虛擬處理器核心數目。 不過,您無法減少儲存空間數量 (在建立伺服器之後只能予以增加)。
  • 管理員使用者名稱。 您將以系統管理權限建立的使用者帳戶名稱。 Azure 會建立一些帳戶供自己使用。 您無法使用 azure_superuserazure_pg_adminadminadministratorrootguestpublic,或任何以 pg_ 開頭的名稱。

  • 密碼: 必須介於 8 到 128 個字元之間。 必須包含大小寫字母、數字和非英數字元的組合。

螢幕擷取畫面:顯示 Azure 入口網站中適用於 PostgreSQL 的 Azure 資料庫彈性伺服器的範例設定。

按一下 [檢閱 + 建立] 以部署服務。 部署會需要幾分鐘的時間。

部署服務之後,請選取 [連線安全性] 選項,並新增適當的防火牆規則以允許用戶端連線,如第 1 單元<用戶端連線>主題中所述。 您也必須選取 [允許存取 Azure 服務] 選項。

使用 Azure CLI 建立適用於 PostgreSQL 的 Azure 資料庫執行個體

您可以使用 az postgres flexible-server create 命令建立適用於 PostgreSQL 的 Azure 資料庫執行個體。 下列陳述式示範如何建立彈性伺服器執行個體。 大部分參數一目了然,除下列項目之外:

  • sku-name。 您以定價層 (B 為基本、GP 為一般用途、MO 為記憶體最佳化)、計算世代 (Gen4 或 Gen5) 與虛擬 CPU 核心數目的組合來建構此參數。 在下列範例中,伺服器是使用一般用途定價層所建立,並具有 Gen5 世代的 4 個 CPU 核心。
  • storage-size。 此為所需的磁碟儲存體,以 MB 為單位。 下列範例會配置 10 GB:
    az postgres flexible-server create \
    --location northeurope --resource-group testGroup \
    --name testserver --admin-user username --admin-password password \
    --sku-name Standard_B1ms --tier Burstable --public-access 153.24.26.117 --storage-size 128 \
    --tags "key=value" --version 13 --high-availability Enabled --zone 1 \
    --standby-zone 3
    

執行線上移轉

您可以使用 Azure 資料庫移轉服務,從內部部署 PostgreSQL 安裝線上移轉到適用於 PostgreSQL 的 Azure 資料庫。

在線上移轉案例中,Azure 資料庫移轉服務會將所有現有資料複製到 Azure,再從來源資料庫持續執行同步作業。 任何對內部部署系統執行的新交易,都會複製到 Azure 中的新資料庫。 此程序將持續到您重新設定用戶端應用程式使用 Azure 中的新資料庫為止,之後您可以終止同步作業。

設定來源伺服器並匯出結構描述

執行線上移轉的第一個步驟為準備來源伺服器,以支援完整的預寫記錄。 在來源伺服器上,編輯 postgresql.config 檔案並設定下列預寫記錄參數。 若要變更這些參數,請重新啟動伺服器 (請只在系統預期會處於完全非作用中狀態時,才執行這項操作):

wal_level = logical
max_replication_slots = 5
max_wal_senders = 10

重新啟動伺服器之後,請使用 pg_dump 公用程式匯出來源資料庫的結構描述:

pg_dump -o -h [server host] -U [user name] -d [database name] -s > db_schema.sql

最後,建立您資料庫使用的所有延伸模組清單。 您必須在目標資料庫中啟用這些延伸模組。 若要執行這項操作,您可以使用 \dx plsql 命令,或執行下列查詢:

SELECT *
FROM pg_extension;

建立目標資料庫與匯入結構描述

下一個階段是在適用於 PostgreSQL 的 Azure 資料庫服務中建立目標資料庫。 您可以使用熟悉的工具 (例如 pgAdmin) 連線到伺服器,也可以使用下列範例中的 Azure CLI:

az postgres db create \
  --name [database name] \
  --server-name [server name] \
  --resource-group [azure resource group]

在目標資料庫上,啟用來源資料庫所使用的任何延伸模組。

匯入結構描述至目標資料庫。 在保存 db_schema.sql 檔案的機器上,執行下列指令:

psql -h [Azure Database for PostgreSQL host] -U [user name] -d [database name] -f db_schema.sql

移除目標資料庫中的所有外部索引鍵參考。 您需要執行此步驟,因為資料不一定會以任何特定順序移轉,這可能會引發參考完整性違規,而導致移轉程序失敗。 然而,您應將所有外部索引鍵記錄下來,以便稍後重新建立。 使用 psql 公用程式執行下列 SQL 陳述式以找出資料庫中的所有外部索引鍵,並產生移除外部索引鍵的指令碼:

SELECT Queries.tablename
       ,concat('alter table ', Queries.tablename, ' ', STRING_AGG(concat('DROP CONSTRAINT ', Queries.foreignkey), ',')) as DropQuery
            ,concat('alter table ', Queries.tablename, ' ',
                                            STRING_AGG(concat('ADD CONSTRAINT ', Queries.foreignkey, ' FOREIGN KEY (', column_name, ')', 'REFERENCES ', foreign_table_name, '(', foreign_column_name, ')' ), ',')) as AddQuery
    FROM
    (SELECT
    tc.table_schema,
    tc.constraint_name as foreignkey,
    tc.table_name as tableName,
    kcu.column_name,
    ccu.table_schema AS foreign_table_schema,
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name
FROM
    information_schema.table_constraints AS tc
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
      AND tc.table_schema = kcu.table_schema
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
      AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY') Queries
  GROUP BY Queries.tablename;

停用目標資料庫中的任何觸發程序,這麼做的原因有兩個:

  • 這能在資料複製到資料庫中時,有助於移轉程序的最佳化。
  • 觸發程序常用來實作複雜形式的參考完整性,而基於稍早所述的原因,在傳輸資料時,這種類型的完整性檢查可能會失敗。 使用下列 SQL 陳述式以找出資料庫中的所有觸發程序,並產生停用觸發程序的指令碼:
    SELECT concat ('alter table ', event_object_table, ' disable trigger ', trigger_name)
    FROM information_schema.triggers;
    

注意

您可以使用 psql 中的 \df+ 命令尋找觸發程序的文字。

建立 Azure 資料庫移轉服務執行個體

您現在可以在 Azure 入口網站中,建立 Azure 資料庫移轉服務的執行個體。

建立 Azure 資料庫移轉服務的執行個體之前,您必須使用訂閱註冊 Microsoft.DataMigration 資源提供者。 您可以依照下列方式來執行這項操作:

  1. 在 Azure 入口網站的左側功能表列中,選取 [所有服務]
  2. 在 [所有服務] 頁面上,選取 [訂閱]
  3. 在 [訂閱] 頁面上,選取您的訂閱。
  4. 在訂閱頁面的 [設定] 下,選取 [資源提供者]
  5. 在 [依名稱篩選] 方塊中,鍵入 DataMigration,然後選取 Microsoft.DataMigration
  6. 選取 [註冊],然後等候 [狀態] 變更為 [已註冊]。 您可能必須選取 [重新整理] 才能看到變更的狀態。
    顯示 [資源提供者] 頁面的影像。其中使用者正在註冊 Microsoft.DataMigration 資源提供者

註冊資源提供者之後,您可以建立服務。 選取左側功能表列中的 [建立資源] 命令,並搜尋 Azure 資料庫移轉服務

顯示建立 Azure 資料庫移轉服務時初始頁面的影像

在 [建立移轉服務] 頁面上,輸入服務執行個體的名稱,並指定訂閱 (應為先前您註冊資源提供者時的訂閱)、資源群組和位置。 您也必須提供虛擬網路,因為資料庫移轉服務會根據為此虛擬網路建立的防火牆提供必要保護。 若您從 Azure 虛擬機器移轉資料庫,您可能可以將資料庫移轉服務放置於該虛擬機器所使用的相同虛擬網路中。 定價層會決定可供服務使用的虛擬處理器核心數目。 如果您想要執行線上移轉,則必須選取 [進階] 層;[標準] 層僅支援離線移轉。

此影像顯示 Azure 資料庫移轉服務的設定。使用者選取了進階定價層

等候服務部署完成,再繼續進行。 此作業需要幾分鐘的時間。

使用資料庫移轉服務建立移轉專案

您現在可以使用資料移轉服務執行個體,執行線上移轉。 若要這麼做,您需建立新的資料庫移轉專案。 前往移轉服務執行個體的頁面,然後選取 [新增移轉專案]

此影像顯示新建立的 Azure 資料庫移轉服務。

在 [新增移轉專案] 頁面上,將來源伺服器類型設定為 [PostgreSQL],將目標伺服器類型設定為 [適用於 PostgreSQL 的 Azure 資料庫],然後選取 [線上資料移轉]。 [活動類型] 頁面列出了啟用線上移轉前,必須在來源伺服器上採取的步驟。 [新增移轉專案] 頁面底部文字描述將結構描述移轉到目標的程序。

此影像顯示移轉專案的屬性和指示。

確認您已完成這些步驟,然後選取 [建立及執行活動]

建立及執行移轉活動

新的移轉專案會啟動精靈,以引導您完成程序。 您應提供下列詳細資料:

  • 在 [新增來源詳細資料] 頁面上,指定來源伺服器的位址、來源資料庫,以及可連線到此資料庫並擷取資料的帳戶。 該帳戶必須擁有超級使用者的權限才能執行移轉。
  • 在 [目標詳細資料] 頁面上,指定適用於 PostgreSQL 的 Azure 資料庫服務位址、要移轉資料至其中的資料庫,以及擁有系統管理權限的帳戶詳細資料。
  • 在 [對應到目標資料庫] 頁面上,選取來源資料庫和目標資料庫。 您可以移轉單一資料庫或多個資料庫。
  • 在 [移轉設定] 頁面上,指定您要進行的任何其他設定,例如要平行載入的資料表數目上限。
  • 在 [移轉摘要] 頁面上,輸入活動名稱,然後選取 [執行移轉]
    影像:顯示 [移轉摘要] 頁面。

[活動狀態] 頁面會出現,顯示移轉流程和任何發生的錯誤。 如果移轉失敗,您可以更正問題並重試活動。 如果您想要執行線上移轉,在現有資料傳輸完成之後,狀態會變更為 [已可執行完全移轉]。 然而,系統會持續執行活動,以傳輸因應用程式仍在使用原始資料庫而出現的任何其他變更。

顯示此移轉活動 [移轉狀態] 頁面的影像。其中移轉已傳輸所有目前的資料,並準備完全移轉到新的資料庫。

恢復外部索引鍵和觸發程序

此時,您已傳輸資料,應用程式可以開始使用資料。 移轉資料之前,您應該重新建立移除的外部索引鍵,並恢復觸發程序。 若部分應用程式仍連線至原始資料庫,預寫記錄檔以確保 Azure 中的目標資料庫保持最新狀態。 預寫記錄不會受到外部索引鍵和觸發程序的不良影響。

完全移轉至新的資料庫

所有應用程式都切換至新的資料庫之後,您即完成移轉程序並完全移轉到新的資料庫。 在 [活動狀態] 頁面上,選取要移轉的資料庫名稱,以查看其執行工作的摘要。

顯示移轉活動統計資料的影像。

選取 [開始完全移轉]。 您會看到要求確認該作業已完成的頁面。 此時,系統會清空來源資料庫預寫記錄檔中的任何剩餘項目,並停止更新。 也不會再傳播對來源資料庫所做的任何進一步變更。

影像:[完成完全移轉] 頁面。

執行離線移轉

離線移轉會在特定時間點建立來源資料庫的「快照集」,並將該資料複製到目標資料庫。 建立快照集之後對來源資料所做的任何變更,將不會反映在目標資料庫中。

如果想要離線移轉到適用於 PostgreSQL 的 Azure 資料庫,或移轉到在其他位置執行的 PostgreSQL 伺服器 (例如 Azure 虛擬機器),您至少有兩個選項:

  • 使用 pg_dump 公用程式從來源資料庫匯出結構描述和資料,然後使用 psql 公用程式將結構描述和資料匯入目標資料庫。 這項技術可讓您視需要對結構描述和資料進行修改、重新格式化和清理,再將其傳輸到目標資料庫。
  • 同樣使用 pg_dump 從來源資料庫傾印資料,然後使用 pg_restore 將資料還原至目標資料庫。 這項技術比使用匯出和匯入更快,但資料會以無法輕易變更的格式傾印。 如果您不需要調校結構描述或資料,請使用此方法。

注意

您目前無法使用 Azure 資料庫移轉服務執行 PostgreSQL 資料庫的離線移轉。

使用匯出和匯入進行移轉

執行下列步驟,以使用匯出和匯入方法移轉資料庫。

  1. 從 Bash 提示字元,使用 pg_dump 命令匯出結構描述:

    pg_dump -o -h [source database server] -U [user name] -d [database] -s > db_schema.sql
    
  2. 使用 pg_dump 命令將資料匯出至另一個檔案:

    pg_dump -o -h [source database server] -U [user name] -d [database] -a > db_data.sql
    

    此時,db_schema.sql 和 db_data.sql 是您使用文字編輯器修改的 SQL 指令碼。

  3. 在適用於 PostgreSQL 的 Azure 資料庫中建立目標資料庫。 您可以使用 Azure 命令列介面來執行:

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group]
    
  4. 使用 psql 命令將結構描述匯入目標資料庫:

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_schema.sql
    
  5. 使用 psql 命令將資料匯入目標資料庫:

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_data.sql
    

使用備份和還原進行移轉

下列步驟描述使用備份和還原移轉資料庫的程序。

  1. 從 Bash 提示字元,執行下列命令以備份資料庫。 指定具有備份資料庫必要權限的使用者名稱:

    pg_dump [database name] -h [source database server] -U [user name] -Fc > database_backup.bak
    
  2. 在適用於 PostgreSQL 的 Azure 資料庫中建立目標資料庫:

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group] \
    
  3. 從 Bash 提示字元,使用 pg_restore 命令將備份還原至新的資料庫。 指定在適用於 PostgreSQL 的 Azure 資料庫服務中具有系統管理權限的使用者名稱:

    pg_restore -d [target database name] -h [server name in Azure Database for PostgreSQL] -Fc -U [user name] database_backup.bak