Partager via


Restaurer des bases de données PostgreSQL à l’aide d’Azure CLI

Cet article explique comment utiliser Azure CLI pour restaurer des bases de données PostgreSQL sur un serveur Azure Database pour PostgreSQL que vous avez sauvegardé via Sauvegarde Azure. Vous pouvez également restaurer une base de données PostgreSQL à l’aide du portail Azure, d’Azure PowerShell et de l’API REST.

Étant donné qu’une base de données PostgreSQL est une base de données PaaS (Platform as a Service), l’option Original-Location Recovery (OLR) à restaurer en remplaçant la base de données existante (à partir de laquelle les sauvegardes ont été effectuées) n’est pas prise en charge. Vous pouvez effectuer une restauration à partir d’un point de récupération pour créer une base de données dans le même serveur Azure Database pour PostgreSQL ou dans n’importe quel autre serveur PostgreSQL. Cette option est appelée Récupération d’emplacement alternatif (ALR). ALR permet de conserver à la fois la base de données source et la base de données restaurée (nouvelle).

Les exemples de cet article font référence à un coffre de sauvegarde existant nommé TestBkpVault sous le groupe testBkpVaultRGde ressources.

Restaurer une base de données PostgreSQL sauvegardée

Définir des autorisations

Un coffre de sauvegarde utilise une identité managée pour accéder à d’autres ressources Azure. Pour effectuer une restauration à partir d’une sauvegarde, l’identité managée du coffre de sauvegarde nécessite un ensemble d’autorisations sur le serveur Azure Database pour PostgreSQL sur lequel la base de données doit être restaurée.

Pour attribuer les autorisations appropriées pour l’identité managée affectée par le système d’un coffre sur le serveur PostgreSQL cible, consultez le ensemble d’autorisations nécessaires pour sauvegarder une base de données PostgreSQL.

Pour restaurer le point de récupération sous forme de fichiers dans un compte de stockage, l’identité managée affectée par le système du coffre de sauvegarde a besoin d’accéder au compte de stockage cible.

Récupérer le point de récupération approprié

Pour répertorier toutes les instances de sauvegarde dans un coffre, utilisez la commande az dataprotection backup-instance list. Récupérez ensuite l’instance appropriée à l’aide de la az dataprotection backup-instance show commande.

Par ailleurs, pour scénarios à grande échelle, vous pouvez répertorier les instances de sauvegarde entre les coffres et les abonnements à l’aide de la commande 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
  }
.
.
.
.
.

Après avoir identifié l’instance, récupérez le point de récupération approprié à l’aide de la az dataprotection recovery-point list commande :

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"
}

Si vous avez besoin d’extraire le point de récupération à partir du niveau archive, la type variable est recoveryPointDataStoreDetailsArchiveStore.

Préparer la demande de restauration

Il existe différentes options de restauration pour une base de données PostgreSQL. Vous pouvez restaurer le point de récupération sous la forme d’une autre base de données ou de fichiers. Le point de récupération peut également se trouver sur le niveau Archive.

Restaurer comme base de données

Construisez l’ID Azure Resource Manager de la nouvelle base de données PostgreSQL à l’aide du serveur PostgreSQL cible auquel vous avez attribué des autorisations. Vous pouvez également créer le nom de base de données PostgreSQL requis. Par exemple, une base de données PostgreSQL peut être nommée emprestored21 sous un serveur PostgreSQL cible nommé targetossserver dans le groupe targetrg de ressources avec un autre abonnement :

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

Utilisez la az dataprotection backup-instance restore initialize-for-data-recovery commande pour préparer la demande de restauration avec tous les détails pertinents :

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

Pour un point de récupération basé sur une archive, vous devez :

  1. Réalimentez du magasin de données d’archive vers le magasin de données du coffre.
  2. Modifier le magasin de données source
  3. Ajouter d’autres paramètres pour spécifier la priorité de réhydratation
  4. Spécifiez la durée pendant laquelle le point de récupération réhydraté doit être conservé dans le magasin de données du coffre.
  5. Effectuer la restauration sous forme de base de données à partir de ce point de récupération

Utilisez la commande suivante pour préparer la demande pour toutes les opérations mentionnées précédemment à la fois :

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

Restaurer sous forme de fichiers

Récupérez l’URI du conteneur dans le compte de stockage auquel vous avez attribué des autorisations. L’exemple suivant utilise un conteneur nommé testcontainerrestore sous un compte de stockage nommé testossstorageaccount avec un autre abonnement :

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

Utilisez la az dataprotection backup-instance restore initialize-for-data-recovery-as-files commande pour préparer la demande de restauration avec tous les détails pertinents :

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

Pour le point de récupération basé sur l’archive, dans le script suivant :

  • Modifier le magasin de données source
  • Ajoutez la priorité de réhydratation et la durée de rétention, en jours, du point de récupération réhydraté.
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

Pour vérifier si le fichier JSON réussit à créer de nouvelles ressources, utilisez la az dataprotection backup-instance validate-for-restore commande.

Déclencher la restauration

Utilisez la commande pour déclencher l’opération az dataprotection backup-instance restore trigger de restauration avec la demande préparée précédemment :

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

Suivre les travaux

Effectuez le suivi des travaux à l’aide de la az dataprotection job list commande. Vous pouvez répertorier tous les travaux et extraire le détail d’un travail particulier.

Vous pouvez également utiliser Az.ResourceGraph pour suivre tous les travaux dans l’ensemble des coffres de sauvegarde. Utilisez la commande az dataprotection job list-from-resourcegraph pour obtenir le travail approprié dans tous les coffres de sauvegarde :

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