你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
将 Azure SQL 托管实例中的数据库还原到之前的某个时间点
适用于:Azure SQL 托管实例
可以使用时间点还原来创建一个数据库作为另一个数据库在过去某个时间点的副本。 本文介绍如何对 Azure SQL 托管实例中的数据库执行时间点还原。
概述
时间点还原在恢复方案中很有用,例如,对于错误或故障引起的事件、数据无法正确加载或关键数据被删除的情况。 此外,还可以使用它来测试和审核数据库部署。 Azure 备份文件保留 7 到 35 天,具体取决于数据库设置。
在以下情况下,可以使用时间点还原来还原数据库:
- 从现有数据库进行还原
- 从已删除数据库还原数据库
- 将数据库还原到同一托管实例或另一托管实例
- 将数据库还原到同一订阅中的托管实例或不同订阅中的托管实例
下表显示了 SQL 托管实例的时间点还原方案:
方案 |
Azure 门户 |
Azure CLI |
PowerShell |
将现有数据库还原到同一托管实例 |
是 |
是 |
是 |
将现有数据库还原到另一托管实例 |
是 |
是 |
是 |
将已删除的数据库还原到同一托管实例 |
是 |
是 |
是 |
将已删除的数据库还原到另一托管实例 |
是 |
是 |
是 |
将现有数据库还原到另一订阅中的托管实例 |
是 |
是 |
是 |
将已删除的数据库还原到另一订阅中的托管实例 |
是 |
是 |
是 |
权限
若要恢复数据库,必须具备以下角色之一:
- 订阅中 SQL Server 参与者角色或 SQL 托管实例参与者角色(具体取决于恢复目标)的成员
- 订阅所有者
若要将数据库还原到其他目标订阅,但你不属于 SQL 托管实例参与者角色,那么你还应具有以下权限:
- 源 SQL 托管实例上的 Microsoft.Sql/managedInstances/databases/readBackups/action。
- 目标 SQL 托管实例上的 Microsoft.Sql/managedInstances/crossSubscriptionPITR/action。
有关详细信息,请参阅 Azure RBAC:内置角色。
限制
以下限制适用于 SQL 托管实例中的时间点还原:
不能使用时间点还原来恢复整个 SQL 托管实例部署。 仅使用时间点还原来复制托管在 SQL 托管实例上的数据库。
时间点还原的限制取决于是将数据库还原到同一订阅中的托管实例,还是还原到另一订阅中的托管实例。
在 Azure SQL 托管实例上启用服务终结点策略时,将服务终结点策略放置在子网中可阻止对不同子网中的实例进行时间点还原。
警告
请注意托管实例的存储大小。 根据要还原的数据的大小,托管实例的存储可能会耗尽。 如果托管实例中没有足够的存储空间用于还原的数据,请使用其他方法。
还原到同一订阅
如果从一个托管实例还原到同一 Azure 订阅中的另一个托管实例,两个托管实例必须位于同一区域中。 目前不支持跨区域还原。
恢复到其他订阅
跨订阅还原时间点还原备份具有以下限制:
- 两个订阅必须在同一区域中。
- 两个订阅必须在同一租户中。
- 订阅类型必须是企业协议、云解决方案提供商、Microsoft 认证的合作伙伴或即用即付。
- 只能在主实例上使用还原操作。
- 只能从主要区域还原备份。 跨订阅时间点还原不支持从异地复制的次要区域还原数据库。
- 执行还原操作的用户必须分配有 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 托管数据库”页面的“基本信息”选项卡上,在“项目详细信息”下提供订阅和资源组详细信息。 然后,在“数据库详细信息”下提供计划还原的数据库的新名称。 确认下拉列表中列出了正确的托管实例。 然后选择“下一步: 数据源 >”
在“数据源”选项卡上,选择“使用现有数据”下的“时间点还原”。 提供包含源数据库的订阅、资源组和托管实例。 从“托管数据库”下拉列表中,选择要还原的数据库,然后选择要从中还原数据库的时间点。 源实例和目标实例可以是两个相同的实例,也可以是两个不同的实例。 选择“下一步: 其他设置 >”
在“其他设置”选项卡上,可以选中该框以从源数据库继承保留策略,也可以选择“配置保留期”以打开“配置策略”页面,并为还原的数据库设置所需的保留策略。 完成后,选择“查看 + 创建”。
在“查看 + 创建”上,验证成功后,选择“创建”以还原数据库。
此操作会启动还原过程,期间会创建一个新数据库,并在其中填充原始数据库在指定时间点的数据。 有关恢复过程的详细信息,请参阅恢复时间。
使用 Azure PowerShell 还原数据库。 有关详细信息,请参阅安装 Azure PowerShell 模块。 有关详细信息,请参阅 Restore-AzSqlInstanceDatabase。
运行以下代码选项之一,用你的值替换参数。
将数据库还原到同一托管实例:
$subscriptionId = "<subscription ID>"
$resourceGroupName = "<resource group name>"
$managedInstanceName = "<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 `
若要将数据库还原到另一托管实例,还需要指定目标资源组和目标托管实例的名称:
$targetResourceGroupName = "<resource group of the target managed instance>"
$targetInstanceName = "<name of the target 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 文档。
运行以下代码选项之一,用你的值替换参数。
将数据库还原到同一托管实例:
az sql midb restore -g mygroupname --mi myinstancename |
-n mymanageddbname --dest-name targetmidbname --time "2018-05-20T05:34:22"
若要将数据库还原到另一个托管实例,还需要指定目标资源组和托管实例的名称:
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 门户还原已删除的托管数据库,请执行以下步骤:
在 Azure 门户中,转到源托管实例。
在左侧菜单的“数据管理”下,选择“备份”。
在“显示数据库”下,选择“已删除”。
对于要还原的数据库,选择“还原”。
在“创建 Azure SQL 托管数据库”中,输入或选择要将数据库还原到的目标托管实例的详细信息。 选择“数据源”选项卡。
在“数据源”中,输入或选择源数据库的详细信息。 选择“其他设置”选项卡。
在“其他设置”中,配置保留设置。 选择“查看 + 创建” 选项卡。
在“查看 + 创建”中,选择“创建”以还原已删除的数据库。
若要还原已删除的托管数据库,请运行以下 PowerShell 代码选项之一,用你的值替换参数:
将已删除的数据库还原到同一托管实例:
$subscriptionId = "<subscription ID>"
Get-AzSubscription -SubscriptionId $subscriptionId
Select-AzSubscription -SubscriptionId $subscriptionId
$resourceGroupName = "<resource group name>"
$managedInstanceName = "<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
若要将数据库还原到其他托管实例,还需要指定目标资源组和目标托管实例的名称:
$targetResourceGroupName = "<resource group of target managed instance>"
$targetInstanceName = "<target 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
) 设置为目标订阅,并为 az sql midb restore
命令指定 -s 参数以标识源订阅:
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) 中直接连接到托管实例,然后使用 DROP
Transact-SQL (T-SQL) 命令:
DROP DATABASE WorldWideImporters;
使用以下方法之一连接到托管实例中的数据库:
在Azure 门户中,选择托管实例中的数据库。
在命令栏中,选择“删除”。
若要从托管实例中删除现有数据库,请运行以下 PowerShell 代码,用你的值替换参数:
$resourceGroupName = "<resource group name>"
$managedInstanceName = "<managed instance name>"
$databaseName = "<source database name>"
Remove-AzSqlInstanceDatabase -Name $databaseName -InstanceName $managedInstanceName -ResourceGroupName $resourceGroupName
若要从托管实例中删除现有数据库,请运行以下 Azure CLI 代码,用你的值替换参数:
az sql midb delete -g mygroupname --mi myinstancename -n mymanageddbname
更改新数据库名称以匹配原始数据库名称
使用 SQL Server Management Studio (SSMS) 直接连接到你的托管实例。 然后运行以下 T-SQL 查询。 该查询会将已还原数据库的名称更改为要覆盖的已删除数据库的名称。
ALTER DATABASE WorldWideImportersPITR MODIFY NAME = WorldWideImporters;
使用以下方法之一连接到托管实例中的数据库:
后续步骤
了解自动备份。