Compartilhar via

使用 Azure CLI 还原 Azure VM 中的 SQL 数据库

Azure CLI用于通过命令行或通过脚本创建和管理Azure资源。 本文介绍如何使用 Azure CLI 在Azure VM 上还原备份的 SQL 数据库。 还可以使用 Azure portal 执行这些作。

本文假定已在使用 Azure Backup 备份的 Azure VM 上运行 SQL 数据库。 如果您使用了 在 Azure 中使用 CLI 备份 SQL 数据库 来备份您的 SQL 数据库,那么您正在使用以下资源:

  • 名为 SQLResourceGroup 的资源组。
  • 名为 SQLVault 的保管库。
  • 名为 VMAppContainer;Compute;SQLResourceGroup;testSQLVM 的受保护容器。
  • 名为 sqldatabase;mssqlserver;master 的已备份数据库/项。
  • chinanorth 区域中的资源。

若要查看我们今天支持的备份和还原方案,请参阅 支持矩阵。 有关常见问题,请参阅 常见问题

查看已备份数据库的还原点

若要查看数据库的所有恢复点的列表,请使用 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 备份恢复点 show-log-chain 命令查看每个未中断日志备份链的起点和终点。

还原数据库的先决条件

开始还原数据库前,请确保满足以下先决条件:

  • 如果保管库上启用了跨区域还原,则只能将数据库还原到同一区域中的 SQL 实例或另一个区域。
  • 目标实例必须注册到与源相同的保管库,但在进行跨区域还原和跨订阅还原时除外。 .

还原数据库

Azure Backup可将在Azure VM 上运行的 SQL 数据库还原为:

  • 使用日志备份还原到特定的日期或时间(精确到秒)。 Azure Backup会自动根据所选时间确定还原所需的适当完整备份、差异备份和日志备份链。
  • 还原特定的完整备份或差异备份,这样就可以还原到特定的恢复点。

若要还原数据库,请使用 az 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 server的名称,位于和要还原的数据库相同的区域。 在这里,你将数据库还原到已保护的同一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-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-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-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 server上的 /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 server的名称。 让我们将数据库以文件形式还原到您已保护的名为hxehost的同一SQL Server上。
  • --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-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 命令跟踪作业状态。

注意事项

如果不想还原整个链,但只还原文件子集,请按照here中所述的步骤进行作。

跨订阅还原

通过跨订阅还原 (CSR),如果具有还原权限,您可以灵活地还原到您租户下的任何订阅和任何保管库。 默认情况下,将在所有恢复服务保管库(现有和新创建的保管库)上启用 CSR。

注意事项

  • 可以通过恢复服务保管库触发跨订阅恢复。
  • CSR 仅支持基于流式处理的备份,不支持基于快照的备份。
  • 不支持将跨区域还原 (CRR) 与 CSR 一起使用。
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}

下一步