Share via


Restaurar bases de dados postgreSQL do Azure com a CLI do Azure

Este artigo explica como restaurar bases de dados PostgreSQL do Azure para um servidor PostgreSQL do Azure com cópia de segurança Azure Backup.

Sendo uma base de dados PaaS, a opção OLR (Original Location Recovery) para restaurar ao substituir a base de dados existente (a partir do local onde foram feitas as cópias de segurança) não é suportada. Pode restaurar a partir de um ponto de recuperação para criar uma nova base de dados no mesmo servidor PostgreSQL do Azure ou em qualquer outro servidor PostgreSQL. Chama-se Alternate-Location Recovery (ALR) que ajuda a manter ambos: a base de dados de origem e a base de dados restaurada (nova).

Neste artigo, vai aprender a:

  • Restaurar para criar uma nova base de dados PostgreSQL

  • Controlar o estado da operação de restauro

Vamos ver um Cofre de cópias de segurança existente TestBkpVault, no grupo de recursos testBkpVaultRG , nos exemplos.

Restaurar uma base de dados PostgreSQL com cópia de segurança

Configurar permissões

O cofre de cópias de segurança utiliza a identidade gerida para aceder a outros recursos do Azure. Para restaurar a partir da cópia de segurança, a identidade gerida do cofre do Backup requer um conjunto de permissões no servidor PostgreSQL do Azure para o qual a base de dados deve ser restaurada.

Para atribuir as permissões relevantes para a identidade gerida atribuída pelo sistema do cofre no servidor PostgreSQL de destino, veja o conjunto de permissões necessárias para fazer a cópia de segurança da base de dados PostgreSQL do Azure.

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

Obter o ponto de recuperação relevante

Para listar todas as instâncias de cópia de segurança num cofre, utilize o comando az dataprotection backup-instance list . Em seguida, obtenha a instância relevante com o comando az dataprotection backup-instance show . Em alternativa, para cenários em escala , pode listar instâncias de cópia de segurança entre cofres e subscrições com 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
  }
.
.
.
.
.

Assim que a instância for identificada, obtenha o ponto de recuperação relevante com 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 de obter o ponto de recuperação da camada de arquivo, a variável de tipo em recoveryPointDataStoreDetails será ArchiveStore.

Preparar o pedido de restauro

Existem várias opções de restauro para uma base de dados PostgreSQL. Pode restaurar o ponto de recuperação como outra base de dados ou restaurar como ficheiros. O ponto de recuperação também pode estar na camada de arquivo.

Restaurar como base de dados

Construa o ID de Resource Manager do Azure (ID do ARM) da nova base de dados PostgreSQL. Tem de o criar com o servidor PostgreSQL de destino ao qual foram atribuídas permissões. Além disso, construa o nome de base de dados PostgreSQL necessário. Por exemplo, uma base de dados PostgreSQL pode ser denominada com o nome de utilizador21 sob um target PostgreSQL server targetossserver no grupo de recursos targetrg com uma subscrição diferente.

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

Utilize o comando az dataprotection backup-instance restore initialize-for-data-recovery para preparar o pedido de restauro 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, tem de:

  1. Reidratar do arquivo de dados arquivo para o arquivo de cofres
  2. Modificar o arquivo de dados de origem
  3. Adicionar outros parâmetros para especificar a prioridade de reidratação
  4. Especifique a duração para a qual o ponto de recuperação reidratado deve ser retido no arquivo de dados do cofre
  5. Restaurar como uma base de dados a partir deste ponto de recuperação

Utilize o seguinte comando para preparar o pedido 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

Obtenha o Uniform Resource Identifier (URI) do contentor, dentro da conta de armazenamento à qual foram atribuídas permissões. Por exemplo, um contentor com o nome testcontainerrestore numa conta de armazenamento testossstorageaccount com uma subscrição diferente.

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

Utilize o comando az dataprotection backup-instance restore initialize-for-data-recovery-as-files para preparar o pedido de restauro 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 no arquivo, no seguinte script:

  • Modifique o arquivo 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 ficheiro JSON conseguirá criar novos recursos, utilize o comando az dataprotection backup-instance validate-for-restore .

Acionar o restauro

Utilize o comando az dataprotection backup-instance restore trigger para acionar a operação de restauro com o pedido previamente preparado.

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

Tarefa de controlo

Controle todas as tarefas com o comando az dataprotection job list . Pode listar todas as tarefas e obter um detalhe específico da tarefa.

Também pode utilizar o Az.ResourceGraph para controlar tarefas em todos os cofres do Backup. Utilize o comando az dataprotection job list-from-resourcegraph para obter a tarefa relevante que está em todos os cofres do Backup.

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

Passos seguintes