你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 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 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 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-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 的名称。 将数据库作为文件还原到已保护的同一 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 仅支持基于流式处理的备份,不支持基于快照的备份。
  • 不支持将跨区域还原 (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}

下一步