使用 Azure PowerShell 还原 PostgreSQL 数据库

本文介绍如何使用 Azure PowerShell 将 PostgreSQL 数据库还原到通过 Azure 备份备份备份的 Azure Database for PostgreSQL 服务器。 还可以使用 Azure 门户Azure CLIREST 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.ResourcegraphSearch-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

对于基于存档的恢复点,需要:

  1. 从存档数据存储解除冻结到保管库数据存储。
  2. 修改源数据存储。
  3. 添加其他参数以指定解除冻结优先级。
  4. 指定解除冻结的恢复点应在保管库数据存储中保留的持续时间。
  5. 从此恢复点还原为数据库。

使用以下命令,为先前提到的所有操作一并准备请求:

$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