本文介绍如何使用 Azure PowerShell 将 PostgreSQL 数据库还原到通过 Azure 备份备份备份的 Azure Database for PostgreSQL 服务器。 还可以使用 Azure 门户、 Azure CLI 和 REST API 还原 PostgreSQL 数据库。
由于 PostgreSQL 数据库是一个平台即服务(PaaS)数据库,因此不支持替换现有数据库(从中执行备份)来还原 Original-Location 恢复(OLR)选项。 可以从恢复点还原,以在同一 Azure Database for PostgreSQL 服务器或任何其他 PostgreSQL 服务器中创建新数据库。 此选项称为Alternate-Location Recovery (ALR)。 ALR 有助于同时保留源数据库和还原的(新)数据库。
本文中的示例是指在资源组testBkpVaultRG
下命名为TestBkpVault
的现有备份保管库:
$TestBkpVault = Get-AzDataProtectionBackupVault -VaultName TestBkpVault -ResourceGroupName "testBkpVaultRG"
还原以创建新的 PostgreSQL 数据库
设置权限
备份保管库使用托管标识访问其他 Azure 资源。 要从备份还原,备份保管库的托管标识需要对应将数据库还原到的 Azure Database for PostgreSQL 服务器拥有一组权限。
若要在目标 PostgreSQL 服务器上为保管库的系统分配托管标识分配相关权限,请参阅 备份 PostgreSQL 数据库所需的权限集。
若要将恢复点作为文件还原到存储帐户,备份保管库的系统分配的托管标识需要对目标存储帐户的访问权限。
提取相关恢复点
使用 Get-AzDataProtectionBackupInstance
命令提取所有实例并标识相关实例:
$AllInstances = Get-AzDataProtectionBackupInstance -ResourceGroupName "testBkpVaultRG" -VaultName $TestBkpVault.Name
还可使用 Az.Resourcegraph
和 Search-AzDataProtectionBackupInstanceInAzGraph
命令在多个保管库和订阅的实例中搜索恢复点:
$AllInstances = Search-AzDataProtectionBackupInstanceInAzGraph -ResourceGroupName "testBkpVaultRG" -VaultName $TestBkpVault.Name -DatasourceType AzureDatabaseForPostgreSQL -ProtectionStatus ProtectionConfigured
若要筛选搜索条件,请使用 PowerShell 客户端搜索功能:
Search-AzDataProtectionBackupInstanceInAzGraph -ResourceGroupName "testBkpVaultRG" -VaultName $TestBkpVault.Name -DatasourceType AzureDatabaseForPostgreSQL -ProtectionStatus ProtectionConfigured | Where-Object { $_.BackupInstanceName -match "empdb11"}
标识实例后,提取相关的恢复点:
$rp = Get-AzDataProtectionRecoveryPoint -ResourceGroupName "testBkpVaultRG" -VaultName $TestBkpVault.Name -BackupInstanceName $AllInstances[2].BackupInstanceName
如果需要从存档层提取恢复点,请添加客户端筛选器:
Get-AzDataProtectionRecoveryPoint -ResourceGroupName "testBkpVaultRG" -VaultName $TestBkpVault.Name -BackupInstanceName $AllInstances[2].BackupInstanceName | Where-Object {$_.Property.RecoveryPointDataStoresDetail[0].Type -match "Archive" }
准备还原请求
PostgreSQL 数据库有各种还原选项。 可将恢复点还原为另一个数据库或还原为文件。 恢复点也可以位于存档层上。
还原为数据库
构造要在目标 PostgreSQL 服务器(已按照上文的详细说明向其分配权限)中创建的新 PostgreSQL 数据库的 Azure 资源管理器 ID。 包括所需的 PostgreSQL 数据库名称。 例如,可以在资源组 targetrg
中具有不同订阅、名为 targetossserver
的目标 PostgreSQL 服务器下将 PostgreSQL 数据库命名为 emprestored21
:
$targetOssId = /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx/resourceGroups/targetrg/providers/providers/Microsoft.DBforPostgreSQL/servers/targetossserver/databases/emprestored21
Initialize-AzDataProtectionRestoreRequest
使用命令准备还原请求,其中包含所有相关的详细信息:
$OssRestoreReq = Initialize-AzDataProtectionRestoreRequest -DatasourceType AzureDatabaseForPostgreSQL -SourceDataStore VaultStore -RestoreLocation $TestBkpVault.Location -RestoreType AlternateLocation -RecoveryPoint $rps[0].Property.RecoveryPointId -TargetResourceId $targetOssId -SecretStoreURI "https://restoreoss-test.vault.azure.net/secrets/dbauth3" -SecretStoreType AzureKeyVault
对于基于存档的恢复点,需要:
- 从存档数据存储解除冻结到保管库数据存储。
- 修改源数据存储。
- 添加其他参数以指定解除冻结优先级。
- 指定解除冻结的恢复点应在保管库数据存储中保留的持续时间。
- 从此恢复点还原为数据库。
使用以下命令,为先前提到的所有操作一并准备请求:
$OssRestoreFromArchiveReq = Initialize-AzDataProtectionRestoreRequest -DatasourceType AzureDatabaseForPostgreSQL -SourceDataStore ArchiveStore -RestoreLocation $TestBkpVault.Location -RestoreType AlternateLocation -RecoveryPoint $rps[0].Property.RecoveryPointId -TargetResourceId $targetOssId -SecretStoreURI "https://restoreoss-test.vault.azure.net/secrets/dbauth3" -SecretStoreType AzureKeyVault -RehydrationDuration 12 -RehydrationPriority Standard
作为文件还原
如 前面所述,提取存储帐户中分配权限的容器的 URI。 以下示例使用名为 testossstorageaccount
的存储帐户下具有不同订阅的名为 testcontainerrestore
的容器:
$contURI = "https://testossstorageaccount.blob.core.windows.net/testcontainerrestore"
Initialize-AzDataProtectionRestoreRequest
使用命令准备还原请求,其中包含所有相关的详细信息:
$OssRestoreAsFilesReq = Initialize-AzDataProtectionRestoreRequest -DatasourceType AzureDatabaseForPostgreSQL -SourceDataStore VaultStore -RestoreLocation $TestBkpVault.Location -RestoreType RestoreAsFiles -RecoveryPoint $rps[0].Property.RecoveryPointId -TargetContainerURI $contURI -FileNamePrefix "empdb11_postgresql-westus_1628853549768"
对于基于存档的恢复点,请修改源数据存储。 添加解冻优先级和解冻恢复点的保留时长(以天为单位):
$OssRestoreAsFilesFromArchiveReq = Initialize-AzDataProtectionRestoreRequest -DatasourceType AzureDatabaseForPostgreSQL -SourceDataStore ArchiveStore -RestoreLocation $TestBkpVault.Location -RestoreType RestoreAsFiles -RecoveryPoint $rps[0].Property.RecoveryPointId -TargetContainerURI $contURI -FileNamePrefix "empdb11_postgresql-westus_1628853549768" -RehydrationDuration "14" -RehydrationPriority Standard
触发还原
使用 Start-AzDataProtectionBackupInstanceRestore
命令以您先前准备的请求触发恢复。
Start-AzDataProtectionBackupInstanceRestore -BackupInstanceName $AllInstances[2].BackupInstanceName -ResourceGroupName "testBkpVaultRG" -VaultName $TestBkpVault.Name -Parameter $OssRestoreReq
跟踪作业
使用 Get-AzDataProtectionJob
命令跟踪作业。 你可以列出所有作业并提取特定作业详细信息。
还可使用 Az.ResourceGraph
来跟踪所有备份保管库中的作业。 使用 Search-AzDataProtectionJobInAzGraph
命令获取跨所有备份保管库的相关作业:
$job = Search-AzDataProtectionJobInAzGraph -Subscription $sub -ResourceGroupName "testBkpVaultRG" -Vault $TestBkpVault.Name -DatasourceType AzureDatabaseForPostgreSQL -Operation OnDemandBackup