使用 Azure CLI 在 Azure VM 中還原 SQL 資料庫
Azure CLI 可用來從命令列或透過指令碼建立和管理 Azure 資源。 本文說明如何使用 Azure CLI 在 Azure VM 上還原備份的 SQL 資料庫。 您也可以使用 Azure 入口網站來執行這些動作。
使用 Azure Cloud Shell 來執行 CLI 命令。
本文假設您擁有在 Azure VM 上執行的 SQL 資料庫,且會使用 Azure 備份來加以備份。 如果您已使用使用 CLI 在 Azure 中備份 SQL 資料庫來備份 SQL 資料庫,則您使用的是下列資源:
- 名為
SQLResourceGroup
的資源群組。 - 名為
SQLVault
的保存庫。 - 名為
VMAppContainer;Compute;SQLResourceGroup;testSQLVM
的受保護容器。 - 名為
sqldatabase;mssqlserver;master
的備份資料庫/項目。 westus
區域中的資源。
注意
若要深入了解支援的設定和案例,請參閱 SQL 備份支援矩陣圖。
檢視所備份資料庫的還原點
若要檢視資料庫的所有復原點清單,請使用 az backup recoverypoint list 命令,如下所示:
az backup recoverypoint list --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name VMAppContainer;Compute;SQLResourceGroup;testSQLVM \
--item-name sqldatabase;mssqlserver;master \
--output table
復原點清單顯示如下:
Name Time BackupManagementType Item Name RecoveryPointType
------------------- --------------------------------- --------------------- ---------------------- ------------------
7660777527047692711 2019-12-10T04:00:32.346000+00:00 AzureWorkload sqldatabase;mssqlserver;master Full
7896624824685666836 2019-12-15T10:33:32.346000+00:00 AzureWorkload sqldatabase;mssqlserver;master Differential
DefaultRangeRecoveryPoint AzureWorkload sqldatabase;mssqlserver;master Log
上述清單包含三個復原點:各自用於完整、差異和記錄備份。
注意
您也可以使用 az backup recoverypoint show-log-chain 命令,來檢視每個未中斷記錄備份鏈結的起點和終點。
用以還原資料庫的必要條件
在還原資料庫之前,請先確定您符合下列必要條件:
- 您只能將資料庫還原到相同區域中的 SQL 執行個體。
- 目標執行個體必須使用相同的來源保存庫進行註冊。
還原資料庫
Azure 備份可以還原在 Azure VM 上執行的 SQL 資料庫,如下所示:
- 使用記錄備份還原至特定日期或時間 (可精確到秒)。 Azure 備份會根據選取的時間,自動決定還原所需的適當完整差異備份和記錄備份鏈結。
- 還原至特定完整或差異備份,以還原至特定復原點。
若要還原資料庫,請使用 az restore restore-azurewl 命令,這需要某個復原設定物件來作為其中一個輸入。 您可以使用 az backup recoveryconfig show 命令來產生這個物件。 復原設定物件包含用來執行還原的所有詳細資料。 其中一個詳細資料是還原模式 – OriginalWorkloadRestore 或 AlternateWorkloadRestore。
注意
OriginalWorkloadRestore:將資料還原至與原始來源相同的 SQL 執行個體。 此選項會覆寫原始資料庫。 AlternateWorkloadRestore:將資料庫還原至替代位置,並保留原始來源資料庫。
還原至替代位置
若要將資料庫還原至替代位置,請使用 AlternateWorkloadRestore 作為還原模式。 接著,您必須選擇還原點,這可以是先前的時間點,或是任何先前的還原點。
讓我們繼續還原至先前的還原點。 檢視資料庫的還原點清單,然後選擇要還原的還原點。 這裡讓我們使用名稱為 7660777527047692711 的還原點。
使用上述還原點名稱和還原模式,藉由 az backup recoveryconfig show 命令來建立復原設定物件。 檢查此命令中的其餘參數:
- --target-item-name:還原資料庫要使用的名稱。 在本案例中,我們使用的名稱為 restored_database。
- --target-server-name:這是已成功向復原服務保存庫完成註冊,並且和所要還原的資料庫位於相同區域的 SQL 伺服器名稱。 現在,您要將資料庫還原到已保護的相同 SQL Server,名為 testSQLVM。
- --target-server-type:若要還原 SQL 資料庫,您必須使用 SQLInstance。
az backup recoveryconfig show --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name VMAppContainer;Compute;SQLResourceGroup;testSQLVM \
--item-name SQLDataBase;mssqlserver;master \
--restore-mode AlternateWorkloadRestore \
--rp-name 7660777527047692711 \
--target-item-name restored_database \
--target-server-name testSQLVM \
--target-server-type SQLInstance \
--workload-type SQLDataBase \
--output json
上述查詢的回應會是如下所示的復原設定物件:
{
"container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupFabrics/Azure/protectionContainers/vmappcontainer;compute;SQLResourceGroup;testSQLVM",
"container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
"database_name": "MSSQLSERVER/restored_database",
"filepath": null,
"item_type": "SQL",
"item_uri": "SQLDataBase;mssqlserver;master",
"log_point_in_time": null,
"recovery_mode": null,
"recovery_point_id": "7660777527047692711",
"restore_mode": "AlternateLocation",
"source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
"workload_type": "SQLDataBase",
"alternate_directory_paths": []
}
現在,為了還原資料庫,請執行 az restore restore-azurewl 命令。 為了使用此命令,請輸入上述 JSON 輸出,其已儲存至名為 recoveryconfig.json 的檔案中。
az backup restore restore-azurewl --resource-group SQLResourceGroup \
--vault-name SQLVault \
--recovery-config recoveryconfig.json \
--output table
輸出會顯示為:
Name Operation Status Item Name Backup Management Type Start Time UTC Duration
------------------------------------ ----------- ---------- --------------------------------- ------------------------ -------------------------------- --------------
be7ea4a4-0752-4763-8570-a306b0a0106f Restore InProgress master [testSQLVM] AzureWorkload 2022-06-21T03:51:06.898981+00:00 0:00:05.652967
回應會提供您作業名稱。 您可以使用 az backup job show 命令,利用此作業名稱來追蹤作業狀態。
還原並覆寫資料庫
為了還原到原始位置,我們將使用 OriginalWorkloadRestore 作為還原模式。 接著,您必須選擇還原點,這可以是先前的時間點,或是任何先前的還原點。
例如,讓我們選擇還原至先前的時間點「28-11-2019-09:53:00」。 您可以使用下列格式來提供此還原點:dd-mm-yyyy, dd-mm-yyyy-hh:mm:ss。 為了選擇有效的還原時間點,請使用 az backup recoverypoint show-log-chain 命令,以列出未中斷記錄鏈結備份的間隔。
az backup recoveryconfig show --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name VMAppContainer;Compute;SQLResourceGroup;testSQLVM \
--item-name sqldatabase;mssqlserver;master \
--restore-mode OriginalWorkloadRestore \
--log-point-in-time 20-06-2022-09:02:41 \
--output json
上述查詢的回應會是如下所示的復原設定物件:
{
"alternate_directory_paths": null,
"container_id": null,
"container_uri": "VMAppContainer;compute;petronasinternaltest;sqlserver-11",
"database_name": null,
"filepath": null,
"item_type": "SQL",
"item_uri": "SQLDataBase;mssqlserver;msdb",
"log_point_in_time": "20-06-2022-09:02:41",
"recovery_mode": null,
"recovery_point_id": "DefaultRangeRecoveryPoint",
"restore_mode": "OriginalLocation",
"source_resource_id": "/subscriptions/62b829ee-7936-40c9-a1c9-47a93f9f3965/resourceGroups/petronasinternaltest/providers/Microsoft.Compute/virtualMachines/sqlserver-11",
"workload_type": "SQLDataBase"
}
現在,為了還原資料庫,請執行 az restore restore-azurewl 命令。 為了使用此命令,請輸入上述 JSON 輸出,其已儲存至名為 recoveryconfig.json 的檔案中。
az backup restore restore-azurewl --resource-group sqlResourceGroup \
--vault-name sqlVault \
--recovery-config recoveryconfig.json \
--output table
輸出會顯示為:
Name Operation Status Item Name Backup Management Type Start Time UTC Duration
------------------------------------ ----------- ---------- ------------------------------- ------------------------ -------------------------------- --------------
1730ec49-166a-4bfd-99d5-93027c2d8480 Restore InProgress master [testSQLVM] AzureWorkload 2022-06-21T04:04:11.161411+00:00 0:00:03.118076
回應會提供您作業名稱。 您可以使用 az backup job show 命令,利用此作業名稱來追蹤作業狀態。
還原到次要地區
若要將資料庫還原到次要區域,請在還原設定中指定位於次要區域的目標保存庫和伺服器。
az backup recoveryconfig show --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name VMAppContainer;compute;SQLResourceGroup;testSQLVM \
--item-name sqldatabase;mssqlserver;master \
--restore-mode AlternateWorkloadRestore \
--from-full-rp-name 293170069256531 \
--rp-name 293170069256531 \
--target-server-name targetSQLServer \
--target-container-name VMAppContainer;compute;SQLResourceGroup;targetSQLServer \
--target-item-name testdb_restore_1 \
--target-server-type SQLInstance \
--workload-type SQLDataBase \
--target-resource-group SQLResourceGroup \
--target-vault-name targetVault \
--backup-management-type AzureWorkload
回應是復原組態物件,顯示如下:
{
"container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/targetVault/backupFabrics/Azure/protectionContainers/vmappcontainer;compute;SQLResourceGroup;targetSQLServer",
"container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
"database_name": "MSSQLSERVER/sqldatabase;mssqlserver;testdb_restore_1",
"filepath": null,
"item_type": "SQL",
"item_uri": "SQLDataBase;mssqlserver;master",
"log_point_in_time": null,
"recovery_mode": null,
"recovery_point_id": "932606668166874635",
"restore_mode": "AlternateLocation",
"source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
"workload_type": "SQLDataBase",
"alternate_directory_paths": [],
}
在 az restore restore-restore-azurewl 命令中使用此復原設定。 選取 --use-secondary-region
旗標以將資料庫還原到次要地區。
az backup restore restore-azurewl --resource-group SQLResourceGroup \
--vault-name testSQLVault \
--recovery-config recoveryconfig.json \
--use-secondary-region \
--output table
輸出會顯示為:
Name Operation Status Item Name Backup Management Type Start Time UTC Duration
------------------------------------ ------------------ ---------- ------------------------- ------------------------ -------------------------------- --------------
0d863259-b0fb-4935-8736-802c6667200b CrossRegionRestore InProgress master [testSQLVM] AzureWorkload 2022-06-21T08:29:24.919138+00:00 0:00:12.372421
注意
次要區域中可供使用的備份資料 RPO 為 12 個小時。 因此,當您開啟 CRR 時,次要區域的 RPO 是 12 小時 + 記錄頻率持續時間 (可設定為至少 15 分鐘)。
還原為檔案
若要將備份資料還原為檔案 (而非資料庫),需要使用 RestoreAsFiles 作為還原模式。 接著選擇還原點,這可以是先前的時間點,或是任何先前的還原點。 一旦檔案備份到指定的路徑,您就可以將這些檔案放到任何 SQL 機器上,並在其中將檔案還原為資料庫。 因為您可以將這些檔案移至任何機器,所以您現在可以在訂用帳戶和區域之間還原資料。
現在,我們將選擇還原到先前的時間點:28-11-2019-09:53:00
,並選擇相同 SQL 伺服器上的 /home/sql/restoreasfiles
作為傾印備份檔案的位置。 您可以使用下列其中一種格式來提供此還原點:dd-mm-yyyy 或 dd-mm-yyyy-hh:mm:ss。 為了選擇有效的還原時間點,請使用 az backup recoverypoint show-log-chain 命令,以列出未中斷記錄鏈結備份的間隔。
使用上述還原點名稱和還原模式,藉由 az backup recoveryconfig show 命令來建立復原設定物件。 檢查此命令中的其餘各項參數:
- --target-container-name:這是已成功向復原服務保存庫完成註冊,並且和所要還原的資料庫位於相同區域的 SQL 伺服器名稱。 讓我們將資料庫作為檔案還原到已保護的相同 SQL Server,名為 hxehost。
- --rp-name:針對時間點還原,還原點名稱會是 DefaultRangeRecoveryPoint。
az backup recoveryconfig show --resource-group SQLResourceGroup \
--vault-name SQLVault \
--container-name VMAppContainer;Compute;SQLResourceGroup;testSQLVM \
--item-name sqldatabase;mssqlserver;master \
--restore-mode RestoreAsFiles \
--rp-name 932606668166874635 \
--target-container-name VMAppContainer;Compute;SQLResourceGroup;testSQLVM \
--filepath /sql/restoreasfiles \
--output json
上述查詢的回應會是如下所示的復原設定物件:
{
"alternate_directory_paths": null,
"container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupFabrics/Azure/protectionContainers/VMAppContainer;Compute;SQLResourceGroup;testSQLVM",
"container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
"database_name": null,
"filepath": "/sql/restoreasfiles",
"item_type": "SQL",
"item_uri": "SQLDataBase;mssqlserver;master",
"log_point_in_time": null,
"recovery_mode": "FileRecovery",
"recovery_point_id": "932606668166874635",
"restore_mode": "AlternateLocation",
"source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
"workload_type": "SQLDataBase"
}
現在,為了將資料庫還原為檔案,請執行 az restore restore-azurewl 命令。 為了使用此命令,請輸入上述 JSON 輸出,其已儲存至名為 recoveryconfig.json 的檔案中。
az backup restore restore-azurewl --resource-group SQLResourceGroup \
--vault-name SQLVault \
--restore-config recoveryconfig.json \
--output json
輸出會顯示為:
{
"eTag": null,
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupJobs/e9cd9e73-e3a3-425a-86a9-8dd1c500ff56",
"location": null,
"name": "e9cd9e73-e3a3-425a-86a9-8dd1c500ff56",
"properties": {
"actionsInfo": [
"1"
],
"activityId": "9e7c8ee4-f1ef-11ec-8a2c-3c52826c1a9a",
"backupManagementType": "AzureWorkload",
"duration": "0:00:04.304322",
"endTime": null,
"entityFriendlyName": "master [testSQLVM]",
"errorDetails": > [!NOTE]
> Information the user should notice even if skimmingnull,
"extendedInfo": {
"dynamicErrorMessage": null,
"propertyBag": {
"Job Type": "Restore as files"
},
"tasksList": [
{
"status": "InProgress",
"taskId": "Transfer data from vault"
}
]
},
"isUserTriggered": true,
"jobType": "AzureWorkloadJob",
"operation": "Restore",
"startTime": "2022-06-22T05:53:32.951666+00:00",
"status": "InProgress",
"workloadType": "SQLDataBase"
},
"resourceGroup": "SQLResourceGroup",
"tags": null,
"type": "Microsoft.RecoveryServices/vaults/backupJobs"
}
回應會提供您作業名稱。 您可以使用 az backup job show 命令,利用此作業名稱來追蹤作業狀態。
注意
如果您不想要還原整個鏈結,而只是一部分的檔案,請遵循此處所述的步驟。
跨訂用帳戶還原
透過跨訂用帳戶還原 (CSR),如果還原權限可供使用,則您可以彈性地還原至租用戶下的任何訂用帳戶和任何保存庫。 根據預設,所有復原服務保存庫 (現有和新建立的保存庫) 都會啟用 CSR。
注意
- 您可以從復原服務保存庫觸發 [跨訂用帳戶還原]。
- 只有串流型備份才支援 CSR,快照型備份不支援 CSR。
- 不支援使用 CSR 的跨區域還原(CRR)。
az backup vault create
新增參數 cross-subscription-restore-state
,此參數可讓您在保存庫建立和更新期間設定保存庫的 CSR 狀態。
az backup recoveryconfig show
新增參數 --target-subscription-id
,此參數可讓您在觸發 SQL 或 HANA 資料來源的跨訂用帳戶還原時,提供目標訂用帳戶作為輸入。
範例:
az backup vault create -g {rg_name} -n {vault_name} -l {location} --cross-subscription-restore-state Disable
az backup recoveryconfig show --restore-mode alternateworkloadrestore --backup-management-type azureworkload -r {rp} --target-container-name {target_container} --target-item-name {target_item} --target-resource-group {target_rg} --target-server-name {target_server} --target-server-type SQLInstance --target-subscription-id {target_subscription} --target-vault-name {target_vault} --workload-type SQLDataBase --ids {source_item_id}