Obnovení databází Azure PostgreSQL pomocí Azure CLI

Tento článek vysvětluje, jak obnovit databáze Azure PostgreSQL na server Azure PostgreSQL zálohovaný službou Azure Backup.

Jako databáze PaaS není podporovaná možnost obnovení původního umístění (OLR) nahrazením stávající databáze (z místa, kde byly zálohy pořízeny). Můžete provést obnovení z bodu obnovení a vytvořit novou databázi na stejném serveru Azure PostgreSQL nebo na jakémkoli jiném serveru PostgreSQL, který se nazývá Obnovení alternativního umístění (ALR), které pomáhá zachovat zdrojovou i obnovenou (novou) databázi.

Tady použijeme existující trezor služby Backup TestBkpVault pod skupinou prostředků testBkpVaultRG v příkladech.

Obnovení zálohované databáze PostgreSQL

Nastavení oprávnění

Trezor služby Backup používá spravovanou identitu pro přístup k dalším prostředkům Azure. K obnovení ze zálohy vyžaduje spravovaná identita trezoru služby Backup sadu oprávnění na serveru Azure PostgreSQL, do kterého se má databáze obnovit.

Pokud chcete přiřadit příslušná oprávnění pro spravovanou identitu přiřazenou systémem trezoru na cílovém serveru PostgreSQL, podívejte se na sadu oprávnění potřebných k zálohování databáze Azure PostgreSQL.

Pokud chcete obnovit bod obnovení jako soubory do účtu úložiště, potřebuje spravovaná identita přiřazená systémem trezoru služby Backup přístup k cílovému účtu úložiště.

Načtení příslušného bodu obnovení

Pokud chcete vypsat všechny instance zálohování v trezoru, použijte příkaz az dataprotection backup-instance list . Pak načtěte příslušnou instanci pomocí příkazu az dataprotection backup-instance show . Alternativně pro scénáře ve velkém měřítku můžete vypsat instance zálohování napříč trezory a předplatnými pomocí příkazu 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
  }
.
.
.
.
.

Po identifikaci instance načtěte příslušný bod obnovení pomocí příkazu 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"
}

Pokud potřebujete načíst bod obnovení z archivní úrovně, pak proměnná typu v recoveryPointDataStoreDetails bude ArchiveStore.

Příprava žádosti o obnovení

Pro databázi PostgreSQL existují různé možnosti obnovení. Bod obnovení můžete obnovit jako jinou databázi nebo obnovit jako soubory. Bod obnovení může být také na archivní úrovni.

Obnovení jako databáze

Vytvořte ID Azure Resource Manageru (ID ARM) nové databáze PostgreSQL. Musíte to vytvořit s cílovým serverem PostgreSQL, ke kterému byla přiřazena oprávnění. Vytvořte také požadovaný název databáze PostgreSQL. Například databázi PostgreSQL lze pojmenovat emprestored21 v cílovém serveru PostgreSQL targetossserver ve skupině prostředků s jiným předplatným.

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

Pomocí příkazu az dataprotection backup-instance restore initialize-for-data-recovery připravte žádost o obnovení se všemi relevantními podrobnostmi.

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

V případě bodu obnovení založeného na archivu potřebujete:

  1. Dosazování z archivu úložiště dat do úložiště trezorů
  2. Úprava zdrojového úložiště dat
  3. Přidání dalších parametrů pro určení priority dosazování
  4. Zadejte dobu, po kterou má být bod obnovení dosazovaný v úložišti dat trezoru zachován.
  5. Obnovení jako databáze z tohoto bodu obnovení

Pomocí následujícího příkazu připravte požadavek na všechny předchozí uvedené operace najednou.

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

Obnovení souborů

Načtěte identifikátor URI (Uniform Resource Identifier) kontejneru v rámci účtu úložiště, ke kterému byla přiřazena oprávnění. Například kontejner s názvem testcontainerrestore v rámci účtu úložiště testosstorageaccount s jiným předplatným.

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

Pomocí příkazu az dataprotection backup-instance restore initialize-for-data-recovery-as-files připravte žádost o obnovení se všemi relevantními podrobnostmi.

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

V případě bodu obnovení založeného na archivu použijte následující skript:

  • Upravte zdrojové úložiště dat.
  • Přidejte prioritu dosazování a dobu uchování ve dnech rehydrovaného bodu obnovení.
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

Pokud chcete ověřit, jestli se soubor JSON úspěšně vytvoří nové prostředky, použijte příkaz az dataprotection backup-instance validate-for-restore .

Aktivace obnovení

Pomocí příkazu triggeru az dataprotection backup-instance restore aktivujte operaci obnovení s dříve připraveným požadavkem.

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

Úloha sledování

Pomocí příkazu az dataprotection job list můžete sledovat všechny úlohy. Můžete zobrazit seznam všech úloh a načíst konkrétní podrobnosti úlohy.

Ke sledování úloh napříč všemi trezory služby Backup můžete také použít Az.ResourceGraph . Pomocí příkazu az dataprotection job list-from-resourcegraph získejte příslušnou úlohu, která je ve všech trezorech služby Backup.

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

Další kroky