練習:將內部部署 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 資料庫彈性伺服器
使用網頁瀏覽器開啟新的索引標籤,然後瀏覽至 Azure 入口網站。
在搜尋列中,輸入適用於 PostgreSQL 的 Azure 資料庫彈性伺服器。
在 [適用於 PostgreSQL 的 Azure 資料庫彈性伺服器] 頁面上,選取 [+ 建立]。
在 [彈性伺服器] 頁面上,輸入下列詳細資料,然後選取 [檢閱 + 建立]:
屬性 值 資源群組 migrate-postgresql 伺服器名稱 adventureworksnnn,其中 nnn 是您選擇的尾碼,可將伺服器名稱變成唯一 Location 選取最接近您的位置 PostgreSQL 版本 13 計算 + 儲存體 選取 [設定伺服器],再選取 [基本定價層] ,然後選取 [確定] 管理員使用者名稱 awadmin 密碼 Pa55w.rdDemo 確認密碼 Pa55w.rdDemo 在 [檢閱 + 建立] 頁面上,選取 [建立]。 等候服務建立完成,再繼續進行。
建立服務之後,選取 [前往資源]。
選取 [連線安全性]。
在 [連線安全性] 頁面上,將 [允許存取 Azure 服務] 設定為 [是]。
在防火牆規則清單中,新增名為 VM 的規則,然後將 [起始 IP 位址] 和 [結束 IP 位址] 設定為執行您稍早所建立 PostgreSQL 伺服器的虛擬機器 IP 位址。
選取 [新增目前的用戶端 IP 位址],以允許您的用戶端電腦連線到資料庫。
[儲存] 並等候防火牆規則完成更新。
在 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,以匯出資料庫結構描述。
執行此 Azure CLI 指令,以查看適用於虛擬機器的 IP 位址。
SQLIP="$(az vm list-ip-addresses \ --resource-group migrate-postgresql \ --name postgresqlvm \ --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \ --output tsv)" echo $SQLIP
使用 SSH 連線到舊的資料庫伺服器。 針對密碼輸入 Pa55w.rdDemo。
ssh azureuser@$SQLIP
執行下列命令,以連線到虛擬機器上的資料庫。 在虛擬機器上執行之 PostgreSQL 伺服器中 azureuser 使用者的密碼為 Pa55w.rd:
psql adventureworks
將複寫權限授與 azureuser:
ALTER ROLE azureuser REPLICATION;
使用 \q 命令關閉 psql 公用程式。
在 Bash 提示字元中,執行下列命令,以將 adventureworks 資料庫的結構描述匯出至名為 adventureworks_schema.sql 的檔案
pg_dump -o -d adventureworks -s > adventureworks_schema.sql
匯入結構描述至目標資料庫
執行下列命令,以連線到 azureadventureworks[nnn] 伺服器。 使用您服務的尾碼來取代出現兩次的 [nnn]。 請注意,使用者名稱的尾碼為 @adventureworks[nnn]。 出現密碼提示時,輸入 Pa55w.rdDemo。
psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
執行下列命令,以建立名為 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;
使用 \q 命令關閉 psql 公用程式。
將 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
您將在每個項目建立完成後看到一連串的訊息。 指令碼應該完成,而且沒有任何錯誤。
執行下列命令。 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
執行下列命令。 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
執行 dropkeys.sql 指令碼:
psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
隨著外部索引鍵的卸除,您將看到一連串顯示的 ALTER TABLE 訊息。
再次啟動 psql 公用程式,並連線到 azureadventureworks 資料庫。
psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
執行下列查詢,以尋找任何剩餘外部索引鍵的詳細資料:
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];
移除任何剩餘的外部索引鍵之後,執行下列 SQL 陳述式,以顯示資料庫中的觸發程序:
SELECT trigger_name FROM information_schema.triggers;
此查詢應該也會傳回空的結果集,表示資料庫未包含任何觸發程序。 如果資料庫確實包含觸發程序,則必須加以停用後再移轉資料,並於稍後重新啟用它們。
使用 \q 命令關閉 psql 公用程式。
使用資料庫移轉服務執行線上移轉
切換回到 Azure 入口網站。
依序選取 [所有服務]、[訂閱] 以及您的訂閱。
在訂閱頁面的 [設定] 下,選取 [資源提供者]。
在 [依名稱篩選] 方塊中,鍵入 DataMigration,然後選取 Microsoft.DataMigration。
如果尚未註冊 Microsoft.DataMigration,則選取 [註冊],然後等候 [狀態] 變更為 [已註冊]。 您可能必須選取 [重新整理],才能看到狀態變更。
選取 [建立資源],於 [搜尋 Marketplace] 方塊中,鍵入 [Azure 資料庫移轉服務],再按 Enter 鍵。
在 [Azure 資料庫移轉服務] 頁面上,選取 [建立]。
在 [建立移轉服務] 頁面上,輸入下列詳細資料,然後選取 [下一步: 網路>>]。
屬性 值 選取資源群組 migrate-postgresql 服務名稱 adventureworks_migration_service Location 選取最接近您的位置 服務模式 Azure 定價層 進階,有 4 個虛擬核心 在 [網路] 頁面上,選取 postgresqlvnet/posgresqlvmSubnet 虛擬網路。 此網路是在設定過程中所建立。
選取 [檢閱 + 建立],然後選取 [建立]。 等候資料庫移轉服務建立完成。 這需要幾分鐘的時間。
建立服務之後,選取 [前往資源]。
選取 [新增移轉專案]。
在 [新增移轉專案] 頁面上,輸入下列詳細資料,然後選取 [建立與執行活動]。
屬性 值 專案名稱 adventureworks_migration_project 來源伺服器類型 PostgreSQL PostgreSQL 的目標資料庫 適用於 PostgreSQL 的 Azure 資料庫 選擇活動類型 線上資料移轉 當 [移轉精靈] 啟動時,在 [選取來源] 頁面上,輸入下列詳細資料,然後選取 [下一步: 選取目標>>]。
屬性 值 來源伺服器名稱 nn.nn.nn.nn (執行 PostgreSQL 的 Azure 虛擬機器 IP 位址) 伺服器通訊埠 5432 Database adventureworks 使用者名稱 azureuser 密碼 Pa55w.rd 信任伺服器憑證 Selected 加密連線 Selected 在 [選取目標] 頁面上,輸入下列詳細資料,然後選取 [下一步: 選取資料庫>>]。
屬性 值 Azure PostgreSQL adventureworks[nnn] Database azureadventureworks 使用者名稱 azureuser@adventureworks[nnn] 密碼 Pa55w.rd 在 [選取資料庫] 頁面上,選取 adventureworks 資料庫,並將其對應至 azureadventureworks。 取消選取 postgres 資料庫。 選取 [下一步: 選取資料表>>]。
在 [選取資料表] 頁面上,選取 [下一步: 進行移轉設定>>]。
在 [進行移轉設定] 頁面上,依序展開 [adventureworks] 下拉式清單和 [進階線上移轉設定] 下拉式清單、確認將 [要平行載入的執行個體數目上限] 設定為 5,然後選取 [下一步: 摘要>>]。
在 [摘要] 頁面的 [活動名稱] 方塊中,鍵入 AdventureWorks_Migration_Activity,然後選取 [開始移轉]。
在 [AdventureWorks_Migration_Activity] 頁面上,選取每隔 15 秒重新整理。 您將在移轉作業進行時看到其狀態。 請等到 [移轉詳細資料] 資料行變更為 [完全移轉已就緒]。
切換回到 Cloud Shell。
執行下列命令,以在 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 資料庫之目標資料庫中,手動恢復此條件約束。
應該不會有其他錯誤。
修改資料並完全移轉到新的資料庫
退回至 Azure 入口網站中的 AdventureWorks_Migration_Activity 頁面。
選取 adventureworks 資料庫。
在 [adventureworks] 頁面上,確認 [完整載入已完成] 值為 66,而所有其他值都是 0。
切換回到 Cloud Shell。
執行下列命令,以連線到使用 PostgreSQL 在虛擬機器上執行的 adventureworks 資料庫:
psql adventureworks
執行下列 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);
使用 \q 命令關閉 psql 公用程式。
返回 Azure 入口網站中的 [adventureworks] 頁面,然後選取 [重新整理]。 確認已套用 32 項變更。
選取 [開始完全移轉]。
在 [完成完全移轉] 頁面上,選取 [確認],然後選取 [套用]。 請等候狀態變更為 [已完成]。
返回 Cloud Shell。
執行下列命令,以連線到使用適用於 PostgreSQL 的 Azure 資料庫服務執行的 azureadventureworks 資料庫:
psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
密碼為 Pa55w.rd。
執行下列 SQL 陳述式,以顯示資料庫中的訂單和訂單詳細資料。 在每個資料表的第一頁之後結束。 這些查詢的目的是為了顯示資料已傳送:
SELECT * FROM sales.salesorderheader; SELECT * FROM sales.salesorderdetail;
執行下列 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 個資料列。
使用 \q 命令關閉 psql 公用程式。
清除已建立的資源
重要
若是在自己的個人訂閱中執行這些步驟,您即可個別刪除資源,或是刪除資源群組來刪除整組資源。 資源若繼續執行,將需付費。
- 使用 Cloud Shell 執行下列命令以刪除資源群組:
az group delete --name migrate-postgresql