練習:將內部部署 PostgreSQL 資料庫移轉到適用於 PostgreSQL 的 Azure 資料庫

已完成

在此練習中,您會將 PostgreSQL 資料庫移轉到 Azure。 您會將在虛擬機器上執行的現有 PostgreSQL 資料庫移轉到適用於 PostgreSQL 的 Azure 資料庫。

您是 AdventureWorks 組織的資料庫開發人員。 十多年來,AdventureWorks 一直都將自行車與自行車零件直接銷售給終端消費者和經銷商。 其系統會將資訊儲存在目前透過 PostgreSQL 在 Azure VM 上執行的資料庫中。 為了合理化運用硬體,AdventureWorks 想將資料庫移至 Azure 管理的資料庫。 公司要求您負責執行此移轉作業。

重要

免費的 Azure 沙箱環境不支援 Azure 資料移轉服務。 您可以在自己的訂用帳戶中執行這些步驟,或是遵循以了解如何遷移資料庫。

設定環境

在 Cloud Shell 中執行下列 Azure CLI 命令,以建立執行 PostgreSQL 的虛擬機器,其中含有 adventureworks 資料庫的複本。 最後一行命令會列印新虛擬機器的 IP 位址。

az account list-locations -o table

az group create \
    --name migrate-postgresql \
    --location <CHOOSE A LOCATION FROM ABOVE NEAR YOU>

az vm create \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --admin-username azureuser \
    --admin-password Pa55w.rdDemo \
    --image Ubuntu2204 \
    --public-ip-address-allocation static \
    --public-ip-sku Standard \
    --vnet-name postgresqlvnet \
    --nsg ""

az vm run-command invoke \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --command-id RunShellScript \
    --scripts "
# Install PostgreSQL
sudo echo deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main > /etc/apt/sources.list.d/pgdg.list
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install postgresql-10
# Clone exercise code
sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop    
# Configure PostgreSQL
sudo service postgresql stop
sudo bash << EOF
    printf \"listen_addresses = '*'\nwal_level = logical\nmax_replication_slots = 5\nmax_wal_senders = 10\n\" >> /etc/postgresql/10/main/postgresql.conf
    printf \"host    all             all             0.0.0.0/0               md5\n\" >> /etc/postgresql/10/main/pg_hba.conf
EOF
sudo service postgresql start

# Add the azureuser role and adventure works
sudo bash << EOF
su postgres << EOC
printf \"create role azureuser with login;alter role azureuser createdb;alter role azureuser password 'Pa55w.rd';alter role azureuser superuser;create database adventureworks;grant all privileges on database adventureworks to azureuser; \" | psql
EOC
EOF

PGPASSWORD=Pa55w.rd psql -h localhost -U azureuser adventureworks -E -q -f /home/azureuser/workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql
"

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 200 \
    --port '22'

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 300 \
    --port '5432'

echo Setup Complete

SQLIP="$(az vm list-ip-addresses \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
    --output tsv)"

echo $SQLIP

這些命令大約需要 5 分鐘的時間才能完成。 您不需要等候其完成,即可繼續進行下列步驟。

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

  1. 使用網頁瀏覽器開啟新的索引標籤,然後瀏覽至 Azure 入口網站

  2. 在搜尋列中,輸入適用於 PostgreSQL 的 Azure 資料庫彈性伺服器

  3. 在 [適用於 PostgreSQL 的 Azure 資料庫彈性伺服器] 頁面上,選取 [+ 建立]。

  4. 在 [彈性伺服器] 頁面上,輸入下列詳細資料,然後選取 [檢閱 + 建立]:

    屬性
    資源群組 migrate-postgresql
    伺服器名稱 adventureworksnnn,其中 nnn 是您選擇的尾碼,可將伺服器名稱變成唯一
    Location 選取最接近您的位置
    PostgreSQL 版本 13
    計算 + 儲存體 選取 [設定伺服器],再選取 [基本定價層] ,然後選取 [確定]
    管理員使用者名稱 awadmin
    密碼 Pa55w.rdDemo
    確認密碼 Pa55w.rdDemo
  5. 在 [檢閱 + 建立] 頁面上,選取 [建立]。 等候服務建立完成,再繼續進行。

  6. 建立服務之後,選取 [前往資源]

  7. 選取 [連線安全性]

  8. 在 [連線安全性] 頁面上,將 [允許存取 Azure 服務] 設定為 [是]

  9. 在防火牆規則清單中,新增名為 VM 的規則,然後將 [起始 IP 位址] 和 [結束 IP 位址] 設定為執行您稍早所建立 PostgreSQL 伺服器的虛擬機器 IP 位址。

  10. 選取 [新增目前的用戶端 IP 位址],以允許您的用戶端電腦連線到資料庫。

  11. [儲存] 並等候防火牆規則完成更新。

  12. 在 Cloud Shell 提示字元中,執行下列命令,以在適用於 PostgreSQL 的 Azure 資料庫服務中建立新的資料庫。 將 [nnn] 取代為您建立適用於 PostgreSQL 的 Azure 資料庫服務時所使用的尾碼。 以 [資源群組] 取代為服務指定的資源群組名稱:

    az postgres flexible-server create \
      --name azureadventureworks \
      --resource-group migrate-postgresql
    

    如果成功建立資料庫,您應該會看到如下的訊息:

    {
      "charset": "UTF8",
      "collation": "English_United States.1252",
      "name": "azureadventureworks",
      "resourceGroup": "migrate-postgresql",
      "type": "Microsoft.DBforPostgreSQL/servers/databases"
    }
    

匯出結構描述以在目標資料庫上使用

您現在將使用 Cloud Shell 連線到現有的 PostgreSQL VM,以匯出資料庫結構描述。

  1. 執行此 Azure CLI 指令,以查看適用於虛擬機器的 IP 位址。

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. 使用 SSH 連線到舊的資料庫伺服器。 針對密碼輸入 Pa55w.rdDemo

    ssh azureuser@$SQLIP
    
  3. 執行下列命令,以連線到虛擬機器上的資料庫。 在虛擬機器上執行之 PostgreSQL 伺服器中 azureuser 使用者的密碼為 Pa55w.rd

    psql adventureworks
    
  4. 將複寫權限授與 azureuser:

    ALTER ROLE azureuser REPLICATION;
    
  5. 使用 \q 命令關閉 psql 公用程式。

  6. 在 Bash 提示字元中,執行下列命令,以將 adventureworks 資料庫的結構描述匯出至名為 adventureworks_schema.sql 的檔案

    pg_dump -o  -d adventureworks -s > adventureworks_schema.sql
    

匯入結構描述至目標資料庫

  1. 執行下列命令,以連線到 azureadventureworks[nnn] 伺服器。 使用您服務的尾碼來取代出現兩次的 [nnn]。 請注意,使用者名稱的尾碼為 @adventureworks[nnn]。 出現密碼提示時,輸入 Pa55w.rdDemo

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. 執行下列命令,以建立名為 azureuser 的使用者,再將此使用者的密碼設定為 Pa55w.rd。 第三個陳述式會為 azureuser 使用者提供必要權限,以在 azureadventureworks 資料庫中建立和管理物件。 azure_pg_admin 角色讓 azureuser 使用者能夠在資料庫中安裝和使用延伸模組。

    CREATE ROLE azureuser WITH LOGIN;
    ALTER ROLE azureuser PASSWORD 'Pa55w.rd';
    GRANT ALL PRIVILEGES ON DATABASE azureadventureworks TO azureuser;
    GRANT azure_pg_admin TO azureuser;
    
  3. 使用 \q 命令關閉 psql 公用程式。

  4. adventureworks 資料庫的結構描述匯入在適用於 PostgreSQL 的 Azure 資料庫服務上執行的 azureadventureworks 資料庫。 由於您目前是以 azureuser 的身分來執行匯入,因此,請在出現提示時輸入密碼 Pa55w.rd

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -E -q -f adventureworks_schema.sql
    

    您將在每個項目建立完成後看到一連串的訊息。 指令碼應該完成,而且沒有任何錯誤。

  5. 執行下列命令。 findkeys.sql 指令碼會產生另一個名為 dropkeys.sql 的 SQL 指令碼,以從 azureadventureworks 資料庫的資料表中移除所有外部索引鍵。 您很快就要執行 dropkeys.sql 指令碼:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/findkeys.sql -o dropkeys.sql -t
    
  6. 執行下列命令。 createkeys.sql 指令碼會產生另一個名為 addkeys.sql 的 SQL 指令碼,以重新建立所有外部索引鍵。 您將在移轉資料庫之後執行 addkeys.sql 指令碼:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/createkeys.sql -o addkeys.sql -t
    
  7. 執行 dropkeys.sql 指令碼:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
    

    隨著外部索引鍵的卸除,您將看到一連串顯示的 ALTER TABLE 訊息。

  8. 再次啟動 psql 公用程式,並連線到 azureadventureworks 資料庫。

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. 執行下列查詢,以尋找任何剩餘外部索引鍵的詳細資料:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'FOREIGN KEY';
    

    此查詢應該會傳回空的結果集。 不過,如果仍有任何外部索引鍵存在,則針對每個外部索引鍵執行下列命令:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. 移除任何剩餘的外部索引鍵之後,執行下列 SQL 陳述式,以顯示資料庫中的觸發程序:

    SELECT trigger_name
    FROM information_schema.triggers;
    

    此查詢應該也會傳回空的結果集,表示資料庫未包含任何觸發程序。 如果資料庫確實包含觸發程序,則必須加以停用後再移轉資料,並於稍後重新啟用它們。

  11. 使用 \q 命令關閉 psql 公用程式。

使用資料庫移轉服務執行線上移轉

  1. 切換回到 Azure 入口網站。

  2. 依序選取 [所有服務]、[訂閱] 以及您的訂閱。

  3. 在訂閱頁面的 [設定] 下,選取 [資源提供者]

  4. 在 [依名稱篩選] 方塊中,鍵入 DataMigration,然後選取 Microsoft.DataMigration

  5. 如果尚未註冊 Microsoft.DataMigration,則選取 [註冊],然後等候 [狀態] 變更為 [已註冊]。 您可能必須選取 [重新整理],才能看到狀態變更。

  6. 選取 [建立資源],於 [搜尋 Marketplace] 方塊中,鍵入 [Azure 資料庫移轉服務],再按 Enter 鍵。

  7. 在 [Azure 資料庫移轉服務] 頁面上,選取 [建立]

  8. 在 [建立移轉服務] 頁面上,輸入下列詳細資料,然後選取 [下一步: 網路>>]

    屬性
    選取資源群組 migrate-postgresql
    服務名稱 adventureworks_migration_service
    Location 選取最接近您的位置
    服務模式 Azure
    定價層 進階,有 4 個虛擬核心
  9. 在 [網路] 頁面上,選取 postgresqlvnet/posgresqlvmSubnet 虛擬網路。 此網路是在設定過程中所建立。

  10. 選取 [檢閱 + 建立],然後選取 [建立]。 等候資料庫移轉服務建立完成。 這需要幾分鐘的時間。

  11. 建立服務之後,選取 [前往資源]

  12. 選取 [新增移轉專案]

  13. 在 [新增移轉專案] 頁面上,輸入下列詳細資料,然後選取 [建立與執行活動]

    屬性
    專案名稱 adventureworks_migration_project
    來源伺服器類型 PostgreSQL
    PostgreSQL 的目標資料庫 適用於 PostgreSQL 的 Azure 資料庫
    選擇活動類型 線上資料移轉
  14. 當 [移轉精靈] 啟動時,在 [選取來源] 頁面上,輸入下列詳細資料,然後選取 [下一步: 選取目標>>]

    屬性
    來源伺服器名稱 nn.nn.nn.nn (執行 PostgreSQL 的 Azure 虛擬機器 IP 位址)
    伺服器通訊埠 5432
    Database adventureworks
    使用者名稱 azureuser
    密碼 Pa55w.rd
    信任伺服器憑證 Selected
    加密連線 Selected
  15. 在 [選取目標] 頁面上,輸入下列詳細資料,然後選取 [下一步: 選取資料庫>>]

    屬性
    Azure PostgreSQL adventureworks[nnn]
    Database azureadventureworks
    使用者名稱 azureuser@adventureworks[nnn]
    密碼 Pa55w.rd
  16. 在 [選取資料庫] 頁面上,選取 adventureworks 資料庫,並將其對應至 azureadventureworks。 取消選取 postgres 資料庫。 選取 [下一步: 選取資料表>>]

  17. 在 [選取資料表] 頁面上,選取 [下一步: 進行移轉設定>>]

  18. 在 [進行移轉設定] 頁面上,依序展開 [adventureworks] 下拉式清單和 [進階線上移轉設定] 下拉式清單、確認將 [要平行載入的執行個體數目上限] 設定為 5,然後選取 [下一步: 摘要>>]

  19. 在 [摘要] 頁面的 [活動名稱] 方塊中,鍵入 AdventureWorks_Migration_Activity,然後選取 [開始移轉]

  20. 在 [AdventureWorks_Migration_Activity] 頁面上,選取每隔 15 秒重新整理。 您將在移轉作業進行時看到其狀態。 請等到 [移轉詳細資料] 資料行變更為 [完全移轉已就緒]

  21. 切換回到 Cloud Shell。

  22. 執行下列命令,以在 azureadventureworks 資料庫中重新建立外部索引鍵。 您先前已產生 addkeys.sql 指令碼:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f addkeys.sql
    

    您將在新增外部索引鍵之後看到一連串的 ALTER TABLE 陳述式。 您可能會看到有關 SpecialOfferProduct 資料表的錯誤,但您現在可予以忽略。 這是由於未正確傳輸 UNIQUE 條件約束所造成。 在真實世界中,您應該使用下列查詢,從來源資料庫擷取此條件約束的詳細資料:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'UNIQUE';
    

    然後,您可以在適用於 PostgreSQL 的 Azure 資料庫之目標資料庫中,手動恢復此條件約束。

    應該不會有其他錯誤。

修改資料並完全移轉到新的資料庫

  1. 退回至 Azure 入口網站中的 AdventureWorks_Migration_Activity 頁面。

  2. 選取 adventureworks 資料庫。

  3. 在 [adventureworks] 頁面上,確認 [完整載入已完成] 值為 66,而所有其他值都是 0

  4. 切換回到 Cloud Shell。

  5. 執行下列命令,以連線到使用 PostgreSQL 在虛擬機器上執行的 adventureworks 資料庫:

    psql adventureworks
    
  6. 執行下列 SQL 陳述式,以顯示資料庫中的訂單 43659、43660 和 43661,然後再加以移除。 請注意,資料庫會在 salesorderheader 資料表上實作串聯刪除,自動從 salesorderdetail 資料表中刪除對應的資料列。

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    DELETE FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    
  7. 使用 \q 命令關閉 psql 公用程式。

  8. 返回 Azure 入口網站中的 [adventureworks] 頁面,然後選取 [重新整理]。 確認已套用 32 項變更。

  9. 選取 [開始完全移轉]

  10. 在 [完成完全移轉] 頁面上,選取 [確認],然後選取 [套用]。 請等候狀態變更為 [已完成]

  11. 返回 Cloud Shell。

  12. 執行下列命令,以連線到使用適用於 PostgreSQL 的 Azure 資料庫服務執行的 azureadventureworks 資料庫:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    

    密碼為 Pa55w.rd

  13. 執行下列 SQL 陳述式,以顯示資料庫中的訂單和訂單詳細資料。 在每個資料表的第一頁之後結束。 這些查詢的目的是為了顯示資料已傳送:

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. 執行下列 SQL 陳述式,以顯示訂單 43659、43660 和 43661 及其詳細資料。

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    

    這兩個查詢都應該傳回 0 個資料列。

  15. 使用 \q 命令關閉 psql 公用程式。

清除已建立的資源

重要

若是在自己的個人訂閱中執行這些步驟,您即可個別刪除資源,或是刪除資源群組來刪除整組資源。 資源若繼續執行,將需付費。

  1. 使用 Cloud Shell 執行下列命令以刪除資源群組:
az group delete --name migrate-postgresql