Partilhar via


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

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

Sendo um banco de dados PaaS, a opção OLR (Original Location Recovery) para restaurar substituindo o banco de dados existente (de onde os backups foram feitos) não é suportada. 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, que é chamado de ALR (Alternate-Location Recovery) que ajuda a manter ambos - o banco de dados de origem e o banco de dados restaurado (novo).

Aqui, vamos usar um cofre de backup existente TestBkpVault, sob o grupo de recursos testBkpVaultRG nos exemplos.

Restaurar um banco de dados PostgreSQL com backup

Configurar permissões

O cofre de backup usa identidade gerenciada para acessar outros recursos do Azure. Para restaurar a partir do backup, a identidade gerenciada do cofre de backup requer um conjunto de permissões no servidor PostgreSQL do Azure 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 vault no servidor PostgreSQL de destino, consulte o conjunto de permissões necessárias para fazer backup do banco de dados PostgreSQL do Azure.

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

Buscar o ponto de recuperação relevante

Para listar todas as instâncias de backup em um vault, 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 instâncias de backup em 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-aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
    "identity": null,
    "kind": "",
    "location": "",
    "managedBy": "",
    "name": "testpostgresql-empdb11-aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
    "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-aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e -g testBkpVaultRG --vault-name TestBkpVault

{
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/testBkpVaultRG/providers/Microsoft.DataProtection/backupVaults/testBkpVault/backupInstances/testpostgresql-empdb11-aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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 você precisar buscar o ponto de recuperação na camada de arquivamento, a variável de tipo em recoveryPointDataStoreDetails será ArchiveStore.

Preparar a solicitação de restauração

Existem várias opções de restauração para um banco de dados PostgreSQL. Você pode 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 arquivamento.

Restaurar como banco de dados

Construa a ID do Azure Resource Manager (ID ARM) 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 emprestored21 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 arquivamento, você precisa:

  1. Reidrate do armazenamento de dados de arquivo para o armazenamento do vault
  2. Modificar o armazenamento de dados de origem
  3. Adicionar outros parâmetros para especificar a prioridade de reidratação
  4. Especifique a duração durante a qual o ponto de recuperação reidratado deve ser mantido no armazenamento de dados do vault
  5. Restaurar como um banco de dados a partir deste ponto de recuperação

Use o comando a seguir para preparar a solicitação para todas as operações mencionadas anteriormente, de uma só vez.

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 ficheiros

Buscar o URI (Uniform Resource Identifier) do contêiner, dentro da 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-as-files 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 ponto de recuperação baseado em arquivamento, no seguinte script:

  • Modifique o armazenamento de dados de origem.
  • Adicione a prioridade de reidratação e a duração da 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 terá êxito na criação de novos recursos, use o comando az dataprotection backup-instance validate-for-restore .

Acionar 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-aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e --restore-request-object OssRestoreReq.JSON

Acompanhamento do trabalho

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

Você também pode usar Az.ResourceGraph para rastrear 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óximos passos