مشاركة عبر


استعادة قواعد بيانات PostgreSQL باستخدام Azure CLI

توضح هذه المقالة كيفية استخدام Azure CLI لاستعادة قواعد بيانات PostgreSQL إلى قاعدة بيانات Azure لخادم PostgreSQL الذي قمت بنسخه احتياطيا عبر Azure Backup. يمكنك أيضا استعادة قاعدة بيانات PostgreSQL باستخدام مدخل Microsoft AzureوAzure PowerShellوواجهة برمجة تطبيقات REST.

نظرا لأن قاعدة بيانات PostgreSQL هي قاعدة بيانات النظام الأساسي كخدمة (PaaS)، فإن خيار Original-Location Recovery (OLR) لاستعادته عن طريق استبدال قاعدة البيانات الموجودة (من حيث تم أخذ النسخ الاحتياطية) غير مدعوم. يمكنك الاستعادة من نقطة استرداد لإنشاء قاعدة بيانات جديدة في نفس قاعدة بيانات Azure لخادم PostgreSQL أو في أي خادم PostgreSQL آخر. يسمى هذا الخيار Alternate-Location Recovery (ALR). يساعد ALR على الاحتفاظ بكل من قاعدة البيانات المصدر وقاعدة البيانات المستعادة (الجديدة).

تشير الأمثلة في هذه المقالة إلى مخزن النسخ الاحتياطي الموجود المسمى TestBkpVault ضمن مجموعة testBkpVaultRGالموارد .

استعادة قاعدة بيانات PostgreSQL المزودة بنسخة احتياطية

إعداد الأذونات

يستخدم مخزن النسخ الاحتياطي هوية مدارة للوصول إلى موارد Azure الأخرى. للاستعادة من نسخة احتياطية، تتطلب الهوية المدارة لمخزن النسخ الاحتياطي مجموعة من الأذونات على قاعدة بيانات Azure لخادم PostgreSQL الذي يجب استعادة قاعدة البيانات إليه.

لتعيين الأذونات ذات الصلة للهوية المدارة المعينة من قبل النظام للمخزن على خادم PostgreSQL الهدف، راجع مجموعة الأذونات اللازمة لإجراء نسخ احتياطي لقاعدة بيانات PostgreSQL.

لاستعادة نقطة الاسترداد كملفات إلى حساب تخزين، تحتاج الهوية المدارة المعينة من قبل النظام إلى الوصول إلى حساب التخزين المستهدف.

إحضار نقطة الاسترداد ذات الصلة

لسرد جميع مثيلات النسخ الاحتياطي داخل المخزن، استخدم 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-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
  }
.
.
.
.
.

بعد تحديد المثيل، أحضر نقطة الاسترداد ذات الصلة باستخدام 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"
}

إذا كنت بحاجة إلى إحضار نقطة الاسترداد من طبقة الأرشيف، فإن type المتغير في recoveryPointDataStoreDetails هو ArchiveStore.

تجهيز طلب الاستعادة

هناك خيارات استعادة مختلفة لقاعدة بيانات PostgreSQL. يمكنك استعادة نقطة الاسترداد كقاعدة بيانات أخرى أو استعادة كملفات. يمكن أن تكون نقطة الاسترداد أيضا على مستوى الأرشيف.

الاستعادة كقاعدة بيانات

إنشاء معرف Azure Resource Manager لقاعدة بيانات PostgreSQL الجديدة باستخدام خادم PostgreSQL الهدف الذي قمت بتعيين الأذونات له. أيضاً، أنشئ اسم قاعدة بيانات PostgreSQL المطلوب. على سبيل المثال، يمكن تسمية emprestored21 قاعدة بيانات PostgreSQL ضمن خادم 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-aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e --restore-request-object OssRestoreReq.JSON

تتبع الوظائف

تعقب المهام باستخدام az dataprotection job list الأمر . يمكنك سرد جميع الوظائف وجلب تفاصيل مهمة معينة.

يمكنك أيضا استخدام Az.ResourceGraph لتعقب المهام عبر جميع خزائن النسخ الاحتياطي. az dataprotection job list-from-resourcegraph استخدم الأمر للحصول على المهمة ذات الصلة عبر جميع خزائن النسخ الاحتياطي:

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