适用于:
Azure SQL 托管实例
本文介绍如何对 Azure SQL 托管实例中的数据库执行时间点还原。 可以使用时间点还原来创建一个数据库作为另一个数据库在过去某个时间点的副本。
概述
时间点还原在恢复方案中很有用。 例如,在错误或失败或数据未正确加载时或关键数据被删除的事件中。 此外,还可以使用它来测试和审核数据库部署。 Azure 备份文件保留 7 到 35 天,具体取决于数据库设置。
在以下情况下,可以使用时间点还原来还原数据库:
- 从现有数据库进行还原
- 从已删除数据库还原数据库
- 对于同一 SQL 托管实例或不同的 SQL 托管实例
- 到同一订阅中的 SQL 托管实例或不同订阅中的 SQL 托管实例
下表显示了 SQL 托管实例的时间点还原方案:
方案 |
Azure 门户 |
Azure CLI |
PowerShell |
将现有数据库还原到同一 SQL 托管实例 |
是 |
是 |
是 |
将现有数据库还原到其他 SQL 托管实例 |
是 |
是 |
是 |
将已删除的数据库还原到同一 SQL 托管实例 |
是 |
是 |
是 |
将已删除的数据库还原到其他 SQL 托管实例 |
是 |
是 |
是 |
将现有数据库还原到另一订阅中的 SQL 托管实例 |
是 |
是 |
是 |
将已删除的数据库还原到另一订阅中的 SQL 托管实例 |
是 |
是 |
是 |
权限
若要恢复数据库,必须具备以下角色之一:
- 订阅中 SQL Server 参与者角色或 SQL 托管实例参与者角色(具体取决于恢复目标)的成员
- 订阅所有者
若要将数据库还原到其他目标订阅,如果你不在 SQL 托管实例参与者 角色中,则还应具有以下权限:
- 源 SQL 托管实例上的 Microsoft.Sql/managedInstances/databases/readBackups/action。
- 目标 SQL 托管实例上的 Microsoft.Sql/managedInstances/crossSubscriptionPITR/action。
有关详细信息,请参阅 Azure 内置角色。
限制
以下限制适用于 SQL 托管实例中的时间点还原:
警告
请注意 SQL 托管实例的存储大小。 根据要还原的数据的大小,可能会耗尽 SQL 托管实例的存储。 如果 SQL 托管实例中没有足够的存储空间来处理还原的数据,请使用其他方法。
还原到同一订阅
如果从一个 SQL 托管实例还原到同一 Azure 订阅中的另一个 SQL 托管实例,则两个 SQL 托管实例必须位于同一区域。 目前不支持跨区域还原。
恢复到其他订阅
跨订阅还原时间点备份具有以下限制:
两个订阅必须在同一区域中。
两个订阅必须在同一租户中。
只能在主实例上使用还原操作。
只能从主要区域还原备份。 跨订阅时间点还原不支持从异地复制次要区域还原数据库。
执行还原作的用户必须具有 SQL 托管实例参与者 角色分配或具有以下显式权限:
- 源 SQL 托管实例上的 Microsoft.Sql/managedInstances/databases/readBackups/action。
- 目标 SQL 托管实例上的 Microsoft.Sql/managedInstances/crossSubscriptionPITR/action。
如果你要创建自己的密钥 (BYOK),该密钥必须存在于这两个订阅中。
还原现有数据库
可以使用 Azure 门户、PowerShell 或 Azure CLI 还原同一订阅中的现有数据库。 如果要使用 PowerShell 或 Azure CLI 还原到同一订阅中的不同实例,请确保指定目标 SQL 托管实例资源的属性。 默认情况下,数据库会还原到同一实例。
如果还原到其他订阅, 则创建或更新 v5.0.2022 或更高版本 API 调用的还原作必须包含以下值:
restorePointInTime
crossSubscriptionTargetManagedInstanceId
-
crossSubscriptionSourceDatabaseId
crossSubscriptionRestorableDroppedDatabaseId
或者。
若要还原现有数据库,可以转到 Azure 门户中的“数据库”页,然后选择“还原”来实现。
或者,若要还原数据库,可以按照以下步骤执行操作:
登录 Azure 门户。
转到计划将数据库还原到的目标 SQL 托管实例。
在“概述”页面上,选择“+ 新建数据库”,打开“创建 Azure SQL 托管数据库”页面。
在“创建 Azure SQL 托管数据库”页的“基本信息”选项卡上,在“项目详细信息”下提供订阅和资源组详细信息。 然后,在“数据库详细信息”下提供计划还原的数据库的新名称。 确认下拉列表中列出了正确的 SQL 托管实例。 然后选择“下一步: 数据源 >”
在“数据源”选项卡上,选择“使用现有数据”下的“时间点还原”。 提供包含源数据库的订阅、资源组和 SQL 托管实例。 从 “托管数据库 ”下拉列表中,选择要还原的数据库,然后选择要从中还原数据库的时间点。 源实例和目标实例可以是两个相同的实例,也可以是两个不同的实例。 选择“下一步: 其他设置 >”
在“其他设置”选项卡上,可以选中该框以从源数据库继承保留策略,也可以选择“配置保留期”以打开“配置策略”页面,并为还原的数据库设置所需的保留策略。 完成后,选择“查看 + 创建”。
在“查看 + 创建”上,验证成功后,选择“创建”以还原数据库。
此操作会启动还原过程,期间会创建一个新数据库,并在其中填充原始数据库在指定时间点的数据。 有关恢复过程的详细信息,请参阅恢复时间。
使用 Azure PowerShell 还原数据库。 有关详细信息,请参阅安装 Azure PowerShell 模块。 有关详细信息,请参阅 Restore-AzSqlInstanceDatabase。
运行以下代码选项之一,用你的值替换参数。
将数据库还原到同一 SQL 托管实例:
$subscriptionId = "<subscription ID>"
$resourceGroupName = "<resource group name>"
$managedInstanceName = "<SQL managed instance name>"
$databaseName = "<source database>"
$pointInTime = "2018-06-27T08:51:39.3882806Z"
$targetDatabase = "<name of the new database to create>"
Get-AzSubscription -SubscriptionId $subscriptionId
Select-AzSubscription -SubscriptionId $subscriptionId
Restore-AzSqlInstanceDatabase -FromPointInTimeBackup `
-ResourceGroupName $resourceGroupName `
-InstanceName $managedInstanceName `
-Name $databaseName `
-PointInTime $pointInTime `
-TargetInstanceDatabaseName $targetDatabase `
若要将数据库还原到另一个 SQL 托管实例,还指定目标资源组的名称和目标 SQL 托管实例:
$targetResourceGroupName = "<resource group of the target SQL managed instance>"
$targetInstanceName = "<name of the target SQL managed instance>"
Restore-AzSqlInstanceDatabase -FromPointInTimeBackup `
-ResourceGroupName $resourceGroupName `
-InstanceName $managedInstanceName `
-Name $databaseName `
-PointInTime $pointInTime `
-TargetInstanceDatabaseName $targetDatabase `
-TargetResourceGroupName $targetResourceGroupName `
-TargetInstanceName $targetInstanceName
若要将数据库还原到另一个订阅,请将上下文设置为目标订阅 (Set-AzContext
),并确保为所需的参数 -TargetSubscriptionID
提供一个值:
Set-AzContext -SubscriptionID "targetSubscriptionID"
Restore-AzSqlInstanceDatabase -FromPointInTimeBackup `
-SubscriptionId "sourceSubscriptionID" `
-ResourceGroupName "sourceRGName" `
-InstanceName "sourceManagedInstanceName" `
-Name "sourceDatabaseName" `
-PointInTime $pointInTime `
-TargetInstanceDatabaseName "targetDatabaseName" `
-TargetInstanceName "targetManagedInstanceName" `
-TargetResourceGroupName "targetResourceGroupName" `
-TargetSubscriptionId "targetSubscriptionId"
使用 Azure CLI 将数据库还原到某个时间点。 有关详细信息,请参阅安装 Azure CLI。 要详细了解可用参数,请参阅介绍如何在 SQL 托管实例中还原数据库的 CLI 文档。
运行以下代码选项之一,用你的值替换参数。
将数据库还原到同一 SQL 托管实例:
az sql midb restore -g mygroupname --mi myinstancename |
-n mymanageddbname --dest-name targetmidbname --time "2018-05-20T05:34:22"
若要将数据库还原到其他 SQL 托管实例,还指定目标资源组和 SQL 托管实例的名称:
az sql midb restore -g mygroupname --mi myinstancename -n mymanageddbname |
--dest-name targetmidbname --time "2018-05-20T05:34:22" |
--dest-resource-group mytargetinstancegroupname |
--dest-mi mytargetinstancename
若要还原到另一个订阅,请确保将上下文 (az account set
) 设置为目标订阅:
az account set -s "targetSubscriptionId" `
az sql midb restore -s sourcesubscriptionid -g sourcegroup
--mi sourceinstance -n sourcemanageddb --dest-name targetDbName
--dest-mi targetMI --dest-resource-group targetRG --time "2022-05-20T05:34:22"
还原已删除的数据库
可以使用 Azure 门户、Azure PowerShell 或 Azure CLI 还原已删除的数据库。
若要使用 Azure 门户还原已删除的 SQL 托管数据库,请执行以下作:
在 Azure 门户中,转到源 SQL 托管实例。
在左侧菜单的“数据管理”下,选择“备份”。
在“显示数据库”下,选择“已删除”。
对于要还原的数据库,选择“还原”。
在 “创建 Azure SQL 托管数据库”中,输入或选择要将数据库还原到的目标 SQL 托管实例的详细信息。 选择“数据源”选项卡。
在“数据源”中,输入或选择源数据库的详细信息。 选择“其他设置”选项卡。
在“其他设置”中,配置保留设置。 选择“查看 + 创建” 选项卡。
在“查看 + 创建”中,选择“创建”以还原已删除的数据库。
若要还原已删除的托管数据库,请运行以下 PowerShell 代码选项之一,用你的值替换参数:
将已删除的数据库还原到同一 SQL 托管实例:
$subscriptionId = "<subscription ID>"
Get-AzSubscription -SubscriptionId $subscriptionId
Select-AzSubscription -SubscriptionId $subscriptionId
$resourceGroupName = "<resource group name>"
$managedInstanceName = "<SQL managed instance name>"
$deletedDatabaseName = "<source database name>"
$targetDatabaseName = "<target database name>"
$deletedDatabase = Get-AzSqlDeletedInstanceDatabaseBackup -ResourceGroupName $resourceGroupName `
-InstanceName $managedInstanceName -DatabaseName $deletedDatabaseName
Restore-AzSqlinstanceDatabase -FromPointInTimeBackup -Name $deletedDatabase.Name `
-InstanceName $deletedDatabase.ManagedInstanceName `
-ResourceGroupName $deletedDatabase.ResourceGroupName `
-DeletionDate $deletedDatabase.DeletionDate `
-PointInTime UTCDateTime `
-TargetInstanceDatabaseName $targetDatabaseName
若要将数据库还原到其他 SQL 托管实例,还指定目标资源组的名称和目标 SQL 托管实例:
$targetResourceGroupName = "<resource group of target SQL managed instance>"
$targetInstanceName = "<target SQL managed instance name>"
Restore-AzSqlinstanceDatabase -FromPointInTimeBackup -Name $deletedDatabase.Name `
-InstanceName $deletedDatabase.ManagedInstanceName `
-ResourceGroupName $deletedDatabase.ResourceGroupName `
-DeletionDate $deletedDatabase.DeletionDate `
-PointInTime UTCDateTime `
-TargetInstanceDatabaseName $targetDatabaseName `
-TargetResourceGroupName $targetResourceGroupName `
-TargetInstanceName $targetInstanceName
若要将数据库还原到另一个订阅,请将上下文设置为目标订阅 (Set-AzContext
),并确保为所需的参数 -TargetSubscriptionID
和 -DeleteDate
提供值:
Set-AzContext -SubscriptionID "targetSubscriptionID"
Restore-AzSqlInstanceDatabase -FromPointInTimeBackup `
-SubscriptionId "sourceSubscriptionID" `
-ResourceGroupName "sourceRGName" `
-InstanceName "sourceManagedInstanceName" `
-Name "sourceDatabaseName" `
-PointInTime $pointInTime `
-TargetInstanceDatabaseName "targetDatabaseName" `
-TargetInstanceName "targetManagedInstanceName" `
-TargetResourceGroupName "targetResourceGroupName" `
-TargetSubscriptionId "targetSubscriptionId" `
-DeletionDate "deletion_date"
将已删除的数据库还原到同一订阅:
az sql midb restore -g resourcegroup --mi instancename
-n databasename --dest-name databasename --dest-mi instancename
--dest-resource-group resourcegroup --time "2023-02-23T11:54:00" --deleted-time "deletion_date"
若要将已删除的数据库还原到另一个订阅,请务必将上下文 (az account set
) 设置为目标订阅,并为命令指定 -s
参数 az sql midb restore
以标识源订阅:
az account set -s "targetSubscriptionId"
az sql midb restore -s sourcesubscriptionid -g sourcegroup
--mi sourceinstance -n sourcemanageddb --dest-name targetDbName
--dest-mi targetMI --dest-resource-group targetRG
--time "2022-05-20T05:34:22" --deleted-time "deletion_date"
覆盖现有数据库
若要覆盖现有数据库,必须执行以下作:
- 删除要覆盖的原始数据库。
- 将从时间点还原的数据库重命名为已删除的数据库的名称。
删除原始数据库
可以使用 Azure 门户、PowerShell 或 Azure CLI 删除数据库。
删除数据库的另一个选项是在 SQL Server Management Studio(SSMS)中直接连接到 SQL 托管实例,然后使用 DROP Transact-SQL (T-SQL) 命令:
DROP DATABASE WorldWideImporters;
使用以下方法之一连接到 SQL 托管实例中的数据库:
在 Azure 门户中,选择 SQL 托管实例中的数据库。
在命令栏中,选择“删除”。
若要从 SQL 托管实例中删除现有数据库,请使用替换为参数的值运行以下 PowerShell 代码:
$resourceGroupName = "<resource group name>"
$managedInstanceName = "<SQL managed instance name>"
$databaseName = "<source database name>"
Remove-AzSqlInstanceDatabase -Name $databaseName -InstanceName $managedInstanceName -ResourceGroupName $resourceGroupName
若要从 SQL 托管实例中删除现有数据库,请使用替换为参数的值运行以下 Azure CLI 代码:
az sql midb delete -g mygroupname --mi myinstancename -n mymanageddbname
更改新数据库名称以匹配原始数据库名称
使用 SQL Server Management Studio (SSMS) 直接连接到 SQL 托管实例。 然后运行以下 T-SQL 查询。 该查询会将已还原数据库的名称更改为要覆盖的已删除数据库的名称。
ALTER DATABASE WorldWideImportersPITR MODIFY NAME = WorldWideImporters;
使用以下方法之一连接到 SQL 托管实例中的数据库:
后续步骤