Восстановление баз данных Azure для PostgreSQL с помощью Azure CLI

В этой статье показано, как восстановить базы данных Azure PostgreSQL на сервере Azure PostgreSQL с резервным копированием, выполняемым Azure Backup.

Так как это база данных PaaS, вариант восстановления в исходное расположение для восстановления путем замены существующей базы данных (из которой были сделаны резервные копии) не поддерживается. Вы можете выполнить восстановление из точки восстановления, чтобы создать новую базу данных на том же сервере Azure PostgreSQL или любом другом сервере PostgreSQL. Это называется восстановлением в другое расположение, которое позволяет сохранить как базу данных-источник, так и восстановленную (новую) базу данных.

В этой статье вы узнаете, как выполнять следующие задачи.

  • Восстановление с созданием базы данных PostgreSQL

  • Отслеживание состояния операции восстановления

В примерах мы будем ссылаться на существующее хранилище BackupTestBkpVault в группе ресурсов testBkpVaultRG.

Восстановление базы данных PostgreSQL, для которой была создана резервная копия

Настройка разрешений

Для доступа к другим ресурсам Azure хранилище Azure Backup использует управляемое удостоверение. Для восстановления из резервной копии управляемому удостоверению резервного хранилища требуется набор разрешений для сервера Azure PostgreSQL, на который должна быть восстановлена база данных.

Чтобы назначить соответствующие разрешения для управляемого удостоверения хранилища, назначаемого системой, на целевом сервере PostgreSQL, используйте набор разрешений, требуемых для резервного копирования базы данных Azure PostgreSQL.

Чтобы восстановить точку восстановления в качестве файлов в учетную запись хранения, управляемому удостоверению хранилища Backup, назначаемому системой, требуется доступ к целевой учетной записи хранения.

Получение соответствующей точки восстановления

Чтобы получить список всех экземпляров резервных копий в хранилище, используйте команду az dataprotection backup-instance list. Затем извлеките нужный экземпляр с помощью команды az dataprotection backup-instance show. Кроме того, для масштабных сценариев можно отобразить список экземпляров резервных копий в разных хранилищах и подписках с помощью команды 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
  }
.
.
.
.
.

После определения экземпляра получите соответствующую точку восстановления с помощью команды 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"
}

Если вам нужно получить точку восстановления с архивного уровня, тип переменной в recoveryPointDataStoreDetails будет ArchiveStore.

Подготовка запроса на восстановление

Для базы данных PostgreSQL доступны разные варианты восстановления. Точку восстановления можно восстановить как другую базу данных или как файлы. Точка восстановления также может находиться на архивном уровне.

Восстановление как базы данных

Создайте идентификатор Azure Resource Manager (ARM ID) для новой базы данных PostgreSQL. Это нужно создать на целевом сервере PostgreSQL, которому были назначены разрешения. Также создайте обязательное имя базы данных PostgreSQL. Например, базе данных PostgreSQL может быть присвоено имя emprestored21 на целевом сервере PostgreSQL targetossserver в группе ресурсов targetrg с другой подпиской.

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

Чтобы подготовить запрос на восстановление со всеми нужными сведениями, выполните команду az dataprotection backup-instance restore initialize-for-data-recovery.

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

Для точки восстановления на архивном уровне необходимо:

  1. Восстановить данные из архивного хранилища в основное.
  2. изменить исходный источник данных;
  3. добавить другие параметры, чтобы указать приоритет восстановления;
  4. указать время, в течение которого восстановленная точка восстановления должна храниться в основном хранилище данных;
  5. выполнить восстановление в виде базы данных из этой точки восстановления.

Чтобы подготовить запрос, выполняющий сразу все указанные выше операции, выполните следующую команду.

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

Восстановление в виде файлов

Получите универсальный код ресурса (URI) контейнера в учетной записи хранения, которому были присвоены разрешения. Например, это может быть контейнер testcontainerrestore в учетной записи хранения testossstorageaccount с другой подпиской.

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

Чтобы подготовить запрос на восстановление со всеми нужными сведениями, выполните команду az dataprotection backup-instance restore initialize-for-data-recovery-as-files.

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

Для архивной точки восстановления следующий скрипт выполняет следующее:

  • Изменить исходный источник данных.
  • добавляет приоритет восстановления и длительность хранения (в днях) для восстановленной точки восстановления.
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

Чтобы проверить, будут ли новые ресурсы успешно созданы с помощью JSON-файла, выполните команду az dataprotection backup-instance validate-for-restore.

Запуск процесса восстановления

Используйте команду az dataprotection backup-instance restore trigger, чтобы активировать операцию восстановления с помощью ранее подготовленного запроса.

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

Отслеживание заданий

Для отслеживания заданий используется команда az dataprotection job list. Можно вывести список всех заданий и получить сведения о конкретном задании.

Для отслеживания всех заданий во всех хранилищах Azure Backup можно также использовать команду Az.ResourceGraph. Используйте команду az dataprotection job list-from-resourcegraph для получения соответствующего задания, которое может находиться в любом из хранилищ Backup.

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

Дальнейшие действия