Restaurar bancos de dados PostgreSQL do Azure usando a CLI do Azure

Este artigo explica como restaurar bancos de dados do Azure para PostgreSQL para um servidor PostgreSQL do Azure com o apoio do Backup do Azure.

Por ele ser um banco de dados PaaS, não há suporte para a opção OLR (Recuperação na Localização Original) para restauração pela substituição do banco de dados existente (do qual os backups foram feitos). Você pode restaurar a partir de um ponto de recuperação para criar um novo banco de dados no mesmo servidor PostgreSQL do Azure ou em qualquer outro servidor PostgreSQL. Isso é chamado de ALR (recuperação em Local Alternativo), o que ajuda a manter o banco de dados de origem e o banco de dados restaurado (novo).

Neste artigo, você aprenderá a:

  • Restaurar para criar um novo banco de dados PostgreSQL

  • Acompanhar o status da operação de restauração

Nos exemplos, usaremos o cofre de backup existente TestBkpVault no grupo de recursos testBkpVaultRG.

Restaurar um banco de dados PostgreSQL com apoio

Configurar permissões

O Cofre de Backup usa a Identidade Gerenciada para acessar outros recursos do Azure. Para restaurar do backup, a identidade gerenciada do cofre de backup requer um conjunto de permissões no servidor do Azure para PostgreSQL para o qual o banco de dados deve ser restaurado.

Para atribuir as permissões relevantes para a identidade gerenciada atribuída pelo sistema do cofre no servidor PostgreSQL de destino, confira o conjunto de permissões necessárias para fazer backup do banco de dados do Azure para PostgreSQL.

Para restaurar o ponto de recuperação como arquivos para uma conta de armazenamento, a identidade gerenciada atribuída pelo sistema do cofre de Backup precisa de acesso na conta de armazenamento de destino.

Busca do ponto de recuperação relevante

Para listar todas as instâncias de backup em um cofre, use o comando az dataprotection backup-instance list. Em seguida, busque a instância relevante usando o comando az dataprotection backup-instance show. Como alternativa, para cenários em escala, você pode listar as instâncias de backup entre cofres e assinaturas usando o comando az dataprotection backup-instance list-from-resourcegraph.

az dataprotection backup-instance list-from-resourcegraph --datasource-type AzureDatabaseForPostgreSQL -subscriptions "xxxxxxxx-xxxx-xxxx-xxxx"

  {
    "datasourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/ossdemoRG/providers/Microsoft.DBforPostgreSQL/servers/testpostgresql/databases/empdb11",
    "extendedLocation": null,
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/testBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupInstances/testpostgresql-empdb11-957d23b1-c679-4c94-ade6-c4d34635e149",
    "identity": null,
    "kind": "",
    "location": "",
    "managedBy": "",
    "name": "testpostgresql-empdb11-957d23b1-c679-4c94-ade6-c4d34635e149",
    "plan": null,
    "properties": {
      "currentProtectionState": "ProtectionConfigured",
      "dataSourceInfo": {
        "baseUri": null,
        "datasourceType": "Microsoft.DBforPostgreSQL/servers/databases",
        "objectType": "Datasource",
        "resourceID": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/ossdemoRG/providers/Microsoft.DBforPostgreSQL/servers/testpostgresql/databases/empdb11",
        "resourceLocation": "westus",
        "resourceName": "postgres",
        "resourceProperties": null,
        "resourceType": "Microsoft.DBforPostgreSQL/servers/databases",
        "resourceUri": ""
      },
      "dataSourceProperties": null,
      "dataSourceSetInfo": {
        "baseUri": null,
        "datasourceType": "Microsoft.DBforPostgreSQL/servers/databases",
        "objectType": "DatasourceSet",
        "resourceID": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/ossdemoRG/providers/Microsoft.DBforPostgreSQL/servers/testpostgresql",
        "resourceLocation": "westus",
        "resourceName": "testpostgresql",
        "resourceProperties": null,
        "resourceType": "Microsoft.DBforPostgreSQL/servers",
        "resourceUri": ""
      },
      "datasourceAuthCredentials": {
        "objectType": "SecretStoreBasedAuthCredentials",
        "secretStoreResource": {
          "secretStoreType": "AzureKeyVault",
          "uri": "https://vikottur-test.vault.azure.net/secrets/dbauth3",
          "value": null
        }
      },
      "friendlyName": "testpostgresql\\empdb11",
      "objectType": "BackupInstance",
      "policyInfo": {
        "policyId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/testBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupPolicies/osspol3",
        "policyParameters": null,
        "policyVersion": ""
      },
      "protectionErrorDetails": null,
      "protectionStatus": {
        "errorDetails": null,
        "status": "ProtectionConfigured"
      },
      "provisioningState": "Succeeded",
      "validationType": null
    },
    "protectionState": "ProtectionConfigured",
    "resourceGroup": "testBkpVaultRG",
    "sku": null,
    "subscriptionId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "tags": null,
    "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "type": "microsoft.dataprotection/backupvaults/backupinstances",
    "vaultName": "testBkpVault",
    "zones": null
  }
.
.
.
.
.

Depois que a instância for identificada, busque o ponto de recuperação relevante usando o comando az dataprotection recovery-point list.

az dataprotection recovery-point list --backup-instance-name testpostgresql-empdb11-957d23b1-c679-4c94-ade6-c4d34635e149 -g testBkpVaultRG --vault-name TestBkpVault

{
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/testBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupInstances/testpostgresql-empdb11-957d23b1-c679-4c94-ade6-c4d34635e149/recoveryPoints/9da55e757af94261afa009b43cd3222a",
  "name": "9da55e757af94261afa009b43cd3222a",
  "properties": {
    "friendlyName": "2031fdb43a914114b6ce644eb6fcb5ce",
    "objectType": "AzureBackupDiscreteRecoveryPoint",
    "policyName": "oss-clitest-policy",
    "policyVersion": null,
    "recoveryPointDataStoresDetails": [
      {
        "creationTime": "2021-09-13T15:17:41.209845+00:00",
        "expiryTime": null,
        "id": "beddea84-7b30-42a5-a752-7c75baf96a52",
        "metaData": "{\"objectType\":\"PostgresBackupMetadata\",\"version\":\"1.0\",\"postgresVersion\":\"11\",\"dbName\":\"postgres\",\"serverName\":\"testpostgresql\",\"serverFQDN\":\"testpostgresql.postgres.database.azure.com\",\"usernameUsed\":\"backupadmin@testpostgresql\",\"backupToolPath\":\"postgresql-11.6-1\\\\bin\\\\pg_dump.exe\",\"backupType\":\"Full\",\"backupDumpFormat\":\"CUSTOM\",\"backupToolArgsFormat\":\"--no-acl --no-owner --serializable-deferrable --no-tablespaces --quote-all-identifiers -Fc -d postgres://{0}:{1}@{2}:5432/{3}?sslmode=verify-full&sslrootcert=E:\\\\approot\\\\Plugins\\\\Postgres\\\\..\\\\..\\\\postgres-root.crt\",\"storageUnits\":{\"1\":\"DbBackupDumpData\"},\"streamNamesInFirstStorageUnit\":[\"dbbkpdmpdatastream-1631546260050\"],\"pitId\":\"2031fdb43a914114b6ce644eb6fcb5ce\",\"bytesTransferred\":2063,\"dataSourceSize\":8442527,\"backupToolVersion\":\"11\"}",
        "rehydrationExpiryTime": null,
        "rehydrationStatus": null,
        "state": "COMMITTED",
        "type": "VaultStore",
        "visible": true
      }
    ],
    "recoveryPointId": "9da55e757af94261afa009b43cd3222a",
    "recoveryPointTime": "2021-09-13T15:17:41.209845+00:00",
    "recoveryPointType": "Full",
    "retentionTagName": "default",
    "retentionTagVersion": "637671427933449525"
  },
  "resourceGroup": "testBkpVaultRG",
  "systemData": null,
  "type": "Microsoft.DataProtection/backupVaults/backupInstances/recoveryPoints"
}

Se precisar buscar o ponto de recuperação da camada de arquivo morto, a variável de tipo em recoveryPointDataStoreDetails será ArchiveStore.

Preparar a solicitação de restauração

Há várias opções de restauração para um banco de dados PostgreSQL. É possível restaurar o ponto de recuperação como outro banco de dados ou restaurar como arquivos. O ponto de recuperação também pode estar na camada de arquivo morto.

Restaurar como banco de dados

Construa a ID do ARM (ID do Azure Resource Manager) do novo banco de dados PostgreSQL. Você precisa criar isso com o servidor PostgreSQL de destino ao qual as permissões foram atribuídas. Além disso, construa o nome do banco de dados PostgreSQL necessário. Por exemplo, um banco de dados PostgreSQL pode ser nomeado como semprered21 em um servidor PostgreSQL de destino targetossserver no grupo de recursos targetrg com uma assinatura diferente.

$targetOssId = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx/resourceGroups/targetrg/providers/providers/Microsoft.DBforPostgreSQL/servers/targetossserver/databases/emprestored21"

Use o comando az dataprotection backup-instance restore initialize-for-data-recovery para preparar a solicitação de restauração com todos os detalhes relevantes.

az dataprotection backup-instance restore initialize-for-data-recovery --datasource-type AzureDatabaseForPostgreSQL  --restore-location {location} --source-datastore VaultStore --target-resource-id $targetOssId --recovery-point-id 9da55e757af94261afa009b43cd3222a --secret-store-type AzureKeyVault --secret-store-uri "https://restoreoss-test.vault.azure.net/secrets/dbauth3" > OssRestoreReq.JSON

Para um ponto de recuperação baseado em arquivo, você precisa:

  1. Reidratar do repositório de dados de arquivos para o repositório de cofres
  2. Modificar o armazenamento de dados de origem
  3. Adicionar outros parâmetros para especificar a prioridade de reidratação
  4. Especificar a duração de retenção do ponto de recuperação reidratado no armazenamento de dados do cofre
  5. Restaurá-lo como um banco de dados por meio desse ponto de recuperação

Usar o comando a seguir para preparar a solicitação para todas as operações mencionadas anteriormente, ao mesmo tempo.

az dataprotection backup-instance restore initialize-for-data-recovery --datasource-type AzureDatabaseForPostgreSQL  --restore-location {location} --source-datastore ArchiveStore --target-resource-id $targetOssId --recovery-point-id 9da55e757af94261afa009b43cd3222a --secret-store-type AzureKeyVault --secret-store-uri "https://restoreoss-test.vault.azure.net/secrets/dbauth3" --rehydration-priority Standard --rehydration-duration 12 > OssRestoreFromArchiveReq.JSON

Restaurar como arquivos

Busque o URI (Uniform Resource Identifier) do contêiner na conta de armazenamento à qual as permissões foram atribuídas. Por exemplo, um contêiner chamado testcontainerrestore em uma conta de armazenamento testossstorageaccount com uma assinatura diferente.

$contURI = "https://testossstorageaccount.blob.core.windows.net/testcontainerrestore"

Use o comando az dataprotection backup-instance restore initialize-for-data-recovery para preparar a solicitação de restauração com todos os detalhes relevantes.

az dataprotection backup-instance restore initialize-for-data-recovery-as-files --datasource-type AzureDatabaseForPostgreSQL  --restore-location {location} --source-datastore VaultStore -target-blob-container-url $contURI --target-file-name "empdb11_postgresql-westus_1628853549768" --recovery-point-id 9da55e757af94261afa009b43cd3222a > OssRestoreAsFilesReq.JSON

Para o ponto de recuperação baseado em arquivo morto, no seguinte script:

  • Modifique o armazenamento de dados de origem.
  • Adicione a prioridade de reidratação e a duração de retenção, em dias, do ponto de recuperação reidratado.
az dataprotection backup-instance restore initialize-for-data-recovery-as-files --datasource-type AzureDatabaseForPostgreSQL  --restore-location {location} --source-datastore ArchiveStore -target-blob-container-url $contURI --target-file-name "empdb11_postgresql-westus_1628853549768" --recovery-point-id 9da55e757af94261afa009b43cd3222a --rehydration-priority Standard --rehydration-duration 12 > OssRestoreAsFilesReq.JSON

Para validar se o arquivo JSON conseguirá criar recursos, use o comando az dataprotection backup-instance validate-for-restore.

Disparar a restauração

Use o comando az dataprotection backup-instance restore trigger para disparar a operação de restauração com a solicitação preparada anteriormente.

az dataprotection backup-instance restore trigger -g testBkpVaultRG --vault-name TestBkpVault --backup-instance-name testpostgresql-empdb11-957d23b1-c679-4c94-ade6-c4d34635e149 --restore-request-object OssRestoreReq.JSON

Acompanhar o trabalho

Acompanhe todos os trabalhos usando o comando az dataprotection job list. Você pode listar todos os trabalhos e buscar um detalhe de trabalho específico.

Você também pode usar o Az.ResourceGraph para acompanhar os trabalhos em todos os cofres de backup. Use o comando az dataprotection job list-from-resourcegraph para obter o trabalho relevante que está em todos os cofres de Backup.

az dataprotection job list-from-resourcegraph --datasource-type AzureDatabaseForPostgreSQL --operation Restore

Próximas etapas