Azure CLI kullanarak Azure VM'deki SQL veritabanlarını geri yükleme

Azure CLI, Komut Satırı'ndan veya betikler aracılığıyla Azure kaynakları oluşturmak ve yönetmek için kullanılır. Bu makalede, Azure CLI kullanarak Bir Azure VM'de yedeklenmiş SQL veritabanının nasıl geri yükleneceği açıklanır. Bu eylemleri Azure portalını kullanarak da gerçekleştirebilirsiniz.

CLI komutlarını çalıştırmak için Azure Cloud Shell'i kullanın.

Bu makale, Azure VM'de çalışan ve Azure Backup ile yedeklenmiş bir SQL veritabanınız olduğunu varsayıyor. SQL veritabanınızı yedeklemek için CLI kullanarak Azure'da bir SQL veritabanını yedeklemeyi kullandıysanız aşağıdaki kaynakları kullanıyorsunuz demektir:

  • adlı SQLResourceGroupbir kaynak grubu.
  • adlı SQLVaultbir kasa.
  • adlı VMAppContainer;Compute;SQLResourceGroup;testSQLVMkorumalı kapsayıcı.
  • sqldatabase;mssqlserver;testdb adlı yedeklenmiş bir veritabanı/öğe.
  • westus Bölgedeki kaynaklar.

Bugün desteklediğimiz yedekleme ve geri yükleme senaryolarını görüntülemek için destek matrisine bakın. Sık sorulan sorular için sık sorulan sorulara bakın.

Yedeklenen veritabanı için geri yükleme noktalarını görüntüleme

Bir veritabanının tüm kurtarma noktalarının listesini görüntülemek için az backup recoverypoint list komutunu şu şekilde kullanın:

az backup recoverypoint list --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --item-name "sqldatabase;mssqlserver;testdb" \
   --output table

Kurtarma noktalarının listesi şu şekilde görünür:

Name                      Time                               BackupManagementType   Item Name               		RecoveryPointType
-------------------       ---------------------------------  ---------------------  ----------------------  		------------------
7660777527047692711       2019-12-10T04:00:32.346000+00:00   AzureWorkload          sqldatabase;mssqlserver;testdb  Full
7896624824685666836       2019-12-15T10:33:32.346000+00:00   AzureWorkload          sqldatabase;mssqlserver;testdb  Differential
DefaultRangeRecoveryPoint                                    AzureWorkload          sqldatabase;mssqlserver;testdb  Log

Yukarıdaki listede üç kurtarma noktası vardır: tam yedekleme, farklı yedekleme ve günlük yedekleme için.

Note

Ayrıca, az backup recoverypoint show-log-chain komutunu kullanarak her kesintisiz günlük yedekleme zincirinin başlangıç ve bitiş noktalarını görüntüleyebilirsiniz.

Veritabanını geri yükleme önkoşulları

Veritabanını geri yüklemeden önce aşağıdaki önkoşulların karşılandığından emin olun:

  • Kasada Bölgeler Arası Geri Yükleme etkinleştirildiyse veritabanını yalnızca aynı bölgedeki bir SQL örneğine veya farklı bir bölgeye geri yükleyebilirsiniz.
  • Hedef örnek, Bölgeler Arası Geri Yükleme ve Abonelikler Arası Geri Yükleme dışında kaynakla aynı kasaya kaydedilmiş olmalıdır. .

Veritabanını geri yükleme

Azure Backup, Azure VM'lerinde çalışan SQL veritabanlarını şu şekilde geri yükleyebilir:

  • Günlük yedeklerini kullanarak belirli bir tarih veya saati (saniyesine kadar) geri yükleyin. Azure Backup, seçilen zamana göre geri yüklemek için gereken uygun tam, değişiklik yedeklemelerini ve günlük yedeklemeleri zincirini otomatik olarak belirler.
  • Belirli bir kurtarma noktasına ulaşmak için belirli bir tam veya farklılaştırılmış yedekten geri yükleyin.

Veritabanını geri yüklemek için, az restore restore-azurewl komutunu kullanın, bu komut girişlerden biri olarak kurtarma yapılandırması nesnesi gerektirir. Az backup recoveryconfig show komutunu kullanarak bu nesneyi oluşturabilirsiniz. Kurtarma yapılandırması nesnesi, geri yükleme gerçekleştirmek için tüm ayrıntıları içerir. Bunlardan biri geri yükleme modudur: OriginalWorkloadRestore veya AlternateWorkloadRestore.

Note

OriginalWorkloadRestore: Verileri özgün kaynakla aynı SQL örneğine geri yükler. Bu seçenek orijinal veritabanının üzerine yazar. AlternateWorkloadRestore: Veritabanını alternatif bir konuma geri yükler ve özgün kaynak veritabanını saklar.

Alternatif konuma geri yükleme

Veritabanını alternatif bir konuma geri yüklemek için geri yükleme modu olarak AlternateWorkloadRestore kullanın. Daha sonra, önceki bir zaman noktası veya herhangi bir önceki geri yükleme noktası olabilecek geri yükleme noktasını seçmelisiniz.

Önceki bir geri yükleme noktasına geri yüklemeye devam edelim. Veritabanı için geri yükleme noktalarının listesini görüntüleyin ve geri yüklemek istediğiniz noktayı seçin. Burada, 7660777527047692711 adlı geri yükleme noktasını kullanalım.

Yukarıdaki geri yükleme noktası adı ve geri yükleme moduyla, az backup recoveryconfig show komutunu kullanarak kurtarma yapılandırması nesnesini oluşturun. Bu komutta kalan parametreleri denetleyin:

  • --target-item-name: Geri yüklenen veritabanı tarafından kullanılacak ad. Bu senaryoda restored_database adını kullandık.
  • --target-server-name: Kurtarma Hizmetleri kasasına başarıyla kaydedilen ve geri yüklenecek veritabanıyla aynı bölgede kalan bir SQL sunucusunun adı. Burada veritabanını, testSQLVM adlı koruduğun SQL sunucusuna geri yüklüyorsunuz.
  • --target-server-type: SQL veritabanlarının geri yüklenmesi için SQLInstance kullanmanız gerekir.

az backup recoveryconfig show --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --item-name "SQLDataBase;mssqlserver;testdb" \
    --restore-mode AlternateWorkloadRestore \
    --rp-name 7660777527047692711 \
    --target-item-name restored_database \
    --target-server-name testSQLVM \
    --target-server-type SQLInstance \
    --workload-type SQLDataBase \
    --output json

Yukarıdaki sorguya verilen yanıt, şu şekilde görünen bir kurtarma yapılandırma nesnesidir:

{
  "container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupFabrics/Azure/protectionContainers/vmappcontainer;compute;SQLResourceGroup;testSQLVM",
  "container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
  "database_name": "MSSQLSERVER/restored_database",
  "filepath": null,
  "item_type": "SQL",
  "item_uri": "SQLDataBase;mssqlserver;testdb",
  "log_point_in_time": null,
  "recovery_mode": null,
  "recovery_point_id": "7660777527047692711",
  "restore_mode": "AlternateLocation",
  "source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
  "workload_type": "SQLDataBase",
  "alternate_directory_paths": []
}

Şimdi veritabanını geri yüklemek için az restore-azurewl komutunu çalıştırın. Bu komutu kullanmak için, recoveryconfig.json adlı bir dosyaya kaydedilen yukarıdaki JSON çıkışını girin.

az backup restore restore-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --recovery-config recoveryconfig.json \
    --output table

Çıkış şu şekilde görünür:

Name                                  Operation    Status      Item Name                          Backup Management Type    Start Time UTC                    Duration
------------------------------------  -----------  ----------  ---------------------------------  ------------------------  --------------------------------  --------------
be7ea4a4-0752-4763-8570-a306b0a0106f  Restore      InProgress  testdb [testSQLVM]  				  AzureWorkload             2022-06-21T03:51:06.898981+00:00  0:00:05.652967

Yanıt size iş adını sağlar. az backup job show komutunu kullanarak iş durumunu izlemek için bu iş adını kullanabilirsiniz.

Geri yükleme ve üzerine yazma

Özgün konuma geri yüklemek için, geri yükleme modu olarak OriginalWorkloadRestore kullanın. Daha sonra önceki bir zaman noktası veya önceki geri yükleme noktalarından herhangi biri olabilecek geri yükleme noktasını seçmeniz gerekir.

Örnek olarak, '28-11-2019-09:53:00' tarihindeki önceki zaman dilimini geri yüklemek için seçelim. Bu geri yükleme noktasını şu biçimlerde sağlayabilirsiniz: dd-mm-yy, dd-mm-yyyy-hh:mm:ss. Geri yüklemek için geçerli bir zaman noktası seçmek için, kesintisiz günlük zinciri yedekleme aralıklarını listeleyen az backup recoverypoint show-log-chain komutunu kullanın.

az backup recoveryconfig show --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --item-name "sqldatabase;mssqlserver;testdb" \
    --restore-mode OriginalWorkloadRestore \
    --log-point-in-time 20-06-2022-09:02:41 \
    --output json

Yukarıdaki sorguya verilen yanıt, şu şekilde görünen bir kurtarma yapılandırma nesnesidir:

{
  "alternate_directory_paths": null,
  "container_id": null,
  "container_uri": "VMAppContainer;Compute;SQLResourceGroup;testSQLVM",
  "database_name": null,
  "filepath": null,
  "item_type": "SQL",
  "item_uri": "SQLDataBase;mssqlserver;testdb",
  "log_point_in_time": "20-06-2022-09:02:41",
  "recovery_mode": null,
  "recovery_point_id": "DefaultRangeRecoveryPoint",
  "restore_mode": "OriginalLocation",
  "source_resource_id": "/subscriptions/62b829ee-7936-40c9-a1c9-47a93f9f3965/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
  "workload_type": "SQLDataBase"
}

Şimdi veritabanını geri yüklemek için az restore-azurewl komutunu çalıştırın. Bu komutu kullanmak için, recoveryconfig.json adlı bir dosyaya kaydedilen yukarıdaki JSON çıkışını girin.

az backup restore restore-azurewl --resource-group sqlResourceGroup \
    --vault-name sqlVault \
    --recovery-config recoveryconfig.json \
    --output table

Çıkış şu şekilde görünür:

Name                                  Operation    Status      Item Name                        Backup Management Type    Start Time UTC                    Duration
------------------------------------  -----------  ----------  -------------------------------  ------------------------  --------------------------------  --------------
1730ec49-166a-4bfd-99d5-93027c2d8480  Restore      InProgress  testdb [testSQLVM]  				AzureWorkload             2022-06-21T04:04:11.161411+00:00  0:00:03.118076

Yanıt size iş adını sağlar. az backup job show komutunu kullanarak iş durumunu izlemek için bu iş adını kullanabilirsiniz.

İkincil bölgeye geri yükleme

Veritabanını ikincil bölgeye geri yüklemek için, geri yükleme yapılandırmasında ikincil bölgede bulunan bir hedef kasa ve sunucu belirtin.

az backup recoveryconfig show --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;compute;SQLResourceGroup;testSQLVM" \
    --item-name "sqldatabase;mssqlserver;testdb" \
    --restore-mode AlternateWorkloadRestore \
    --from-full-rp-name 293170069256531 \
    --rp-name 293170069256531 \
    --target-server-name targetSQLServer \
    --target-container-name "VMAppContainer;compute;SQLResourceGroup;targetSQLServer" \
    --target-item-name testdb_restore_1 \
    --target-server-type SQLInstance \
    --workload-type SQLDataBase \
    --target-resource-group SQLResourceGroup \
    --target-vault-name targetVault \
    --backup-management-type AzureWorkload

Yanıt, şu şekilde görünen bir kurtarma yapılandırma nesnesidir:

 {
  "container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/targetVault/backupFabrics/Azure/protectionContainers/vmappcontainer;compute;SQLResourceGroup;targetSQLServer",
  "container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
  "database_name": "MSSQLSERVER/testdb_restore_1",
  "filepath": null,
  "item_type": "SQL",
  "item_uri": "SQLDataBase;mssqlserver;testdb",
  "log_point_in_time": null,
  "recovery_mode": null,
  "recovery_point_id": "293170069256531",
  "restore_mode": "AlternateLocation",
  "source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
  "workload_type": "SQLDataBase",
  "alternate_directory_paths": []
}

`az restore restore-azurewl komutunda bu kurtarma yapılandırmasını kullanın.` --use-secondary-region Veritabanını ikincil bölgeye geri yüklemek için bayrağını seçin.

az backup restore restore-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --recovery-config recoveryconfig.json \
    --use-secondary-region \
    --output table

Çıkış şu şekilde görünür:

Name                                  Operation           Status      Item Name                  Backup Management Type    Start Time UTC                    Duration
------------------------------------  ------------------  ----------  -------------------------  ------------------------  --------------------------------  --------------
0d863259-b0fb-4935-8736-802c6667200b  CrossRegionRestore  InProgress  testdb [testSQLVM] 		 AzureWorkload             2022-06-21T08:29:24.919138+00:00  0:00:12.372421

Note

İkincil bölgede kullanılabilir yedekleme verilerinin RPO değeri 12 saattir. Bu nedenle, CRR'yi açtığınızda, ikincil bölgenin RPO'su 12 saat + log sıklığı süresi (minimum 15 dakika olarak ayarlanabilir) olur.

Dosya olarak geri yükleme

Yedekleme verilerini veritabanı yerine dosya olarak geri yüklemek için geri yükleme modu olarak RestoreAsFiles kullanın. Ardından, önceki bir zamana ait nokta veya herhangi bir önceki geri yükleme noktası olabilecek geri yükleme noktasını seçin. Dosyalar belirtilen yola bırakıldıktan sonra, bu dosyaları veritabanı olarak geri yüklemek istediğiniz herhangi bir SQL makinesine götürebilirsiniz. Bu dosyaları herhangi bir makineye taşıyabildiğiniz için artık verileri abonelikler ve bölgeler arasında geri yükleyebilirsiniz.

Geri yüklemek için önceki zaman noktasını 28-11-2019-09:53:00 ve yedek dosyalarının aynı SQL sunucusundaki C:\restoreasfiles olarak döküleceği konumu seçin. Bu geri yükleme noktasını şu biçimlerden birinde sağlayabilirsiniz: dd-mm-yyyy veya dd-mm-yyyy-hh:mm:ss. Geri yüklemek için geçerli bir zaman noktası seçmek için, kesintisiz günlük zinciri yedekleme aralıklarını listeleyen az backup recoverypoint show-log-chain komutunu kullanın.

Yukarıdaki geri yükleme noktası adı ve geri yükleme moduyla, az backup recoveryconfig show komutunu kullanarak kurtarma yapılandırması nesnesini oluşturun. Bu komutta kalan parametrelerin her birini denetleyin:

  • --target-container-name: Kurtarma Hizmetleri kasasına başarıyla kaydedilen ve geri yüklenecek veritabanıyla aynı bölgede bulunan bir SQL sunucusunun adı. Veritabanını, koruduğunuz aynı SQL sunucusuna, mssqlserver adıyla dosya olarak geri getirelim.
  • --rp-name: Belirli bir anlık geri yükleme için geri yükleme noktası adı DefaultRangeRecoveryPoint'tir.
az backup recoveryconfig show --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --item-name "sqldatabase;mssqlserver;testdb" \
    --restore-mode RestoreAsFiles \
    --rp-name 932606668166874635 \
    --target-container-name "VMAppContainer;Compute;SQLResourceGroup;testSQLVM" \
    --filepath "C:\restoreasfiles" \
    --output json

Yukarıdaki sorguya verilen yanıt şu şekilde görünen bir kurtarma yapılandırma nesnesidir:

{
  "alternate_directory_paths": null,
  "container_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupFabrics/Azure/protectionContainers/VMAppContainer;Compute;SQLResourceGroup;testSQLVM",
  "container_uri": "VMAppContainer;compute;SQLResourceGroup;testSQLVM",
  "database_name": null,
  "filepath": "C:\restoreasfiles",
  "item_type": "SQL",
  "item_uri": "SQLDataBase;mssqlserver;testdb",
  "log_point_in_time": null,
  "recovery_mode": "FileRecovery",
  "recovery_point_id": "932606668166874635",
  "restore_mode": "AlternateLocation",
  "source_resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.Compute/virtualMachines/testSQLVM",
  "workload_type": "SQLDataBase"
}

Şimdi veritabanını dosyalar olarak geri yüklemek için az restore restore-azurewl komutunu çalıştırın. Bu komutu kullanmak için yukarıdaki recoveryconfig.json adlı dosyaya kaydedilen JSON çıkışını girin.

az backup restore restore-azurewl --resource-group SQLResourceGroup \
    --vault-name SQLVault \
    --recovery-config recoveryconfig.json \
    --output json

Çıkış şu şekilde görünür:

{
  "eTag": null,
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/SQLResourceGroup/providers/Microsoft.RecoveryServices/vaults/SQLVault/backupJobs/e9cd9e73-e3a3-425a-86a9-8dd1c500ff56",
  "location": null,
  "name": "e9cd9e73-e3a3-425a-86a9-8dd1c500ff56",
  "properties": {
    "actionsInfo": [
      "1"
    ],
    "activityId": "9e7c8ee4-f1ef-11ec-8a2c-3c52826c1a9a",
    "backupManagementType": "AzureWorkload",
    "duration": "0:00:04.304322",
    "endTime": null,
    "entityFriendlyName": "testdb [testSQLVM]",
    "errorDetails": null,
    "extendedInfo": {
      "dynamicErrorMessage": null,
      "propertyBag": {
        "Job Type": "Restore as files"
      },
      "tasksList": [
        {
          "status": "InProgress",
          "taskId": "Transfer data from vault"
        }
      ]
    },
    "isUserTriggered": true,
    "jobType": "AzureWorkloadJob",
    "operation": "Restore",
    "startTime": "2022-06-22T05:53:32.951666+00:00",
    "status": "InProgress",
    "workloadType": "SQLDataBase"
  },
  "resourceGroup": "SQLResourceGroup",
  "tags": null,
  "type": "Microsoft.RecoveryServices/vaults/backupJobs"
}

Yanıt size iş adını sağlar. az backup job show komutunu kullanarak iş durumunu izlemek için bu iş adını kullanabilirsiniz.

Note

Zincirin tamamını geri yüklemek istemiyorsanız ancak dosyaların yalnızca bir alt kümesini geri yüklemek istiyorsanız, burada belgelendiği gibi adımları izleyin.

Abonelikler Arası Geri Yükleme

Abonelikler Arası Geri Yükleme (CSR) ile, geri yükleme izinleri varsa kiracınızın altındaki herhangi bir aboneliğe ve herhangi bir kasaya geri yükleme esnekliğine sahip olursunuz. CsR varsayılan olarak tüm Kurtarma Hizmetleri kasalarında (mevcut ve yeni oluşturulan kasalar) etkinleştirilir.

Note

  • Kurtarma Hizmetleri kasasından Abonelikler Arası Geri Yükleme'yi tetikleyebilirsiniz.
  • CSR yalnızca akış tabanlı yedekleme için desteklenir ve anlık görüntü tabanlı yedekleme için desteklenmez.
  • CSR ile Bölgeler Arası Geri Yükleme (CRR) desteklenmez.
az backup vault create

Kasa oluşturma ve güncelleştirme sırasında kasanın CSR durumunu ayarlayabilmenizi sağlayan cross-subscription-restore-state parametresini ekleyin.

az backup recoveryconfig show

SQL veya HANA veri kaynakları için Çapraz Abonelik Geri Yükleme'yi tetiklerken giriş olarak hedef aboneliği sağlamanıza olanak tanıyan parametreyi --target-subscription-id ekleyin.

Example:

   az backup vault create -g {rg_name} -n {vault_name} -l {location} --cross-subscription-restore-state Enable
   az backup recoveryconfig show --restore-mode alternateworkloadrestore --backup-management-type azureworkload -r {rp} --target-container-name {target_container} --target-item-name {target_item} --target-resource-group {target_rg} --target-server-name {target_server} --target-server-type SQLInstance --target-subscription-id {target_subscription} --target-vault-name {target_vault} --workload-type SQLDataBase --ids {source_item_id}

SQL örneği anlık görüntülerini geri getir

Aşağıdaki örnekler Bash değil, PowerShell shell sözdizimi kullanır. Bu makalede gösterilen anlık görüntü seçeneklerini sunan bir Azure CLI sürümünü kullanın. Snapshot restore ön koşullarını ve destek matrisini gözden geçirin.

Kullanmadan önce yer tutucuları değiştirin. Ortak kurulumu tamamla ve sadece gerekli geri yükleme senaryosunu seç. Aşağıdaki örnekler alternatiflerdir, baştan sona uygulanacak bir script değildir. Restore komutları verilerin üzerine yazabilir veya disk bağlantılarını değiştirebilir.

Anlık görüntü geri yükleme değişkenlerini ayarlayın

$vaultSubscription için Vault'un aboneliğini kullanın. Hedef kaynak grubunu ve kullanıcı tarafından atanan yönetilen kimliği gerekli izinlerle hazırlayın:

$vaultSubscription = "<vault-subscription-id>"
$vaultRg = "<vault-rg>"
$vaultName = "<vault-name>"
$sourceVm = "<source-vm-name>"
$targetVm = "<target-vm-name>"
$targetInstanceName = "<target-instance-name>"
$restoreRg = "<restore-resource-group>"
$uamiId = "/subscriptions/<subscription-id>/resourceGroups/<identity-rg>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"
$vaultArgs = @("--subscription", $vaultSubscription, "--resource-group", $vaultRg, "--vault-name", $vaultName)

az backup vault show --subscription $vaultSubscription --resource-group $vaultRg --name $vaultName
az backup container list @vaultArgs --backup-management-type AzureWorkload `
  --query "[].{Name:name,VM:properties.friendlyName}" --output table
$containerName = "<native-source-container-name>"
$targetContainerName = "<native-target-container-name>"
$sourceArgs = $vaultArgs + @("--container-name", $containerName, "--backup-management-type", "AzureWorkload")

az backup item list @sourceArgs --workload-type SQLInstance --output json
$instanceItemName = "<native-protected-instance-item-name>"
$instanceArgs = $sourceArgs + @("--item-name", $instanceItemName, "--workload-type", "SQLInstance")

Hizmet çıktısından tam olarak yerel konteyner ve korunan öğe isimlerini kopyalayın. Yukarıdaki kaynak ve hedef kurulum aynı vault'u kullanıyor. Alternatif konum geri yüklemeleri için, hedef örneğin bulunabilir olduğundan emin olun:

az backup protectable-item show @vaultArgs --workload-type MSSQL `
  --protectable-item-type SQLInstance --name $targetInstanceName --server-name $targetVm

Bu örneklerdeki uzun opsiyonlar ayrıca aşağıdaki kısa takma adları da destekler:

Uzun seçenek Alias
--restore-point-query-type --rp-query-type
--get-latest-recovery-point-only --latest-rp-only
--base-snapshot-recovery-point-id --base-snapshot-rp-id
--base-recovery-point-datasource-id --base-datasource-id

Anlık görüntü kurtarma noktalarını sorgulama

Bir zaman penceresi için istenen tüm kurtarma noktası türlerini, sadece anlık görüntüleri veya sadece en son anlık görüntüyü listeleyin:

$startDate = (Get-Date).ToUniversalTime().AddDays(-7).ToString("dd-MM-yyyy-HH:mm:ss")
$endDate = (Get-Date).ToUniversalTime().ToString("dd-MM-yyyy-HH:mm:ss")
az backup recoverypoint list @instanceArgs --start-date $startDate --end-date $endDate `
  --restore-point-query-type FullDifferentialAndSnapshot --output json
az backup recoverypoint list @instanceArgs --restore-point-query-type Snapshot --output json
az backup recoverypoint list @instanceArgs --restore-point-query-type Snapshot `
  --get-latest-recovery-point-only true --output json

Bir kurtarma noktasını açıkça seçin; liste sıralamasını varsaymayın. Dahil edilen veritabanları ve dosya sistemi bilgilerini incelemek için tam detaylarını alın:

$snapshotRpName = "<selected-snapshot-recovery-point-name>"
$snapshotJson = az backup recoverypoint show @instanceArgs --name $snapshotRpName --output json
if ($LASTEXITCODE -ne 0) { throw "Could not read the selected snapshot recovery point." }
$snapshotRp = $snapshotJson | ConvertFrom-Json

$snapshotRp.properties.extendedInfo.includedDatabases | Select-Object datasourceName, datasourceId
$snapshotRp.properties.extendedInfo.snapshotRecoveryPointInfo.snapshotResourceGroup
$snapshotRp.properties.extendedInfo.snapshotRecoveryPointInfo.sourceFilesystemInfo |
  Select-Object label, fileSystemType, accessPaths, isOnStorageSpace, storageSpaceInfo, diskInfoList

Anlık görüntü tabanlı log aralıklarını sorgula

örneğin ayrıntılarınıprotectedItemDataSourceId geri alın. Bu ID, günlük sorguları için temel veri kaynağıdır, bireysel bir veritabanının veri kaynağı ID'si değildir.

$instanceJson = az backup item show @sourceArgs --name $instanceItemName `
  --workload-type SQLInstance --output json
if ($LASTEXITCODE -ne 0) { throw "Could not read the protected instance." }
$instanceItem = $instanceJson | ConvertFrom-Json
$instanceDatasourceId = $instanceItem.properties.protectedItemDataSourceId

az backup item list @sourceArgs --workload-type MSSQL --output json
$dbItemName = "<selected-native-database-item-name>"
$databaseArgs = $sourceArgs + @("--item-name", $dbItemName, "--workload-type", "MSSQL")
az backup recoverypoint show-log-chain @databaseArgs `
  --recovery-mode SnapshotAttachAndRecover `
  --base-snapshot-recovery-point-id $snapshotRpName `
  --base-recovery-point-datasource-id $instanceDatasourceId --output json

Anlık görüntüye dahil olan veritabanlarından birine karşılık gelen bir veritabanı öğesi seçin. Bireysel kurtarma noktalarını günlük aralıkları olarak ele almak yerine, sürekli kurtarma süresi aralıkları için show-log-chain kullanın.

İnstansı özgün konuma geri yükleme

Orijinal konum geri yükleme (OLR) yapılandırmasını oluşturun.

$configFile = ".\instance-olr.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
  --restore-mode OriginalWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Göndermeden önce, hacim eşlemelerini inceleyin. Orijinal konum geri yükleme, orijinal veritabanlarının üzerine yazabilir.

Örneğin alternatif konuma geri yüklenmesi

Hedef konteyner, sunucu ve SQL örneğini kullanın. --target-item-name öğesini gerekli hedef veritabanı adına veya hizmet tarafından desteklenen bir örnek adlandırma desenine ayarlayın:

$configFile = ".\instance-alr.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --target-item-name "<target-database-name-or-service-supported-instance-pattern>" `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Instans belirli bir zamandaki geri yükleme

Önceki sorgulardan seçilen instance anlık görüntüsünü ve temel veri kaynağı ID'sini kullanın. Dahil edilen her veritabanını benzersiz bir korunan öğeye çözüp, ardından bu anlık görüntüden sonraki log aralıklarını sorgula:

$includedDatabases = @($snapshotRp.properties.extendedInfo.includedDatabases)
if ($includedDatabases.Count -eq 0) { throw "The snapshot has no included databases." }
$itemsJson = az backup item list @sourceArgs --workload-type MSSQL --output json
if ($LASTEXITCODE -ne 0) { throw "Could not list protected databases." }
$databaseItems = @($itemsJson | ConvertFrom-Json)
$logRangesPerDb = @{}
foreach ($database in $includedDatabases) {
  $matchingItems = @($databaseItems | Where-Object {
    $_.properties.protectedItemDataSourceId -eq $database.datasourceId
  })
  if ($matchingItems.Count -eq 0) {
    $matchingItems = @($databaseItems | Where-Object {
      $_.name -eq "SQLDataBase;$($database.datasourceName)" -or
      $_.properties.friendlyName -eq $database.datasourceName
    })
  }
  if ($matchingItems.Count -ne 1) {
    throw "Could not uniquely resolve included database $($database.datasourceName)."
  }
  $rangesJson = az backup recoverypoint show-log-chain @sourceArgs `
    --item-name $matchingItems[0].name --workload-type MSSQL `
    --recovery-mode SnapshotAttachAndRecover `
    --base-snapshot-recovery-point-id $snapshotRpName `
    --base-recovery-point-datasource-id $instanceDatasourceId `
    --query "[].properties.timeRanges[]" --output json
  if ($LASTEXITCODE -ne 0) { throw "Could not query snapshot-based log ranges." }
  $logRangesPerDb[$database.datasourceName] = @(
    foreach ($range in ($rangesJson | ConvertFrom-Json)) {
      if (-not $range.startTime -or -not $range.endTime) {
        throw "The service returned a log range without startTime or endTime."
      }
      [PSCustomObject]@{
        ItemName = $matchingItems[0].name
        StartTime = ([DateTimeOffset]$range.startTime).UtcDateTime
        EndTime = ([DateTimeOffset]$range.endTime).UtcDateTime
      }
    }
  )
  if ($logRangesPerDb[$database.datasourceName].Count -eq 0) {
    throw "No snapshot-based log ranges for $($database.datasourceName)."
  }
}

Bir veritabanının aralıklarını inceleyin ve bir UTC zamanını seçin. Aşağıdaki örnek, o veritabanı için en son bitiş zamanını seçer ve ardından bu saatin dahil edilen her veritabanı için de mevcut olup olmadığını doğrular. Doğrulama başarısız olursa, ortak mevcut aralıklar içinde bir zaman seçin ve kontrolü tekrar yapın:

$selectedDatabase = "<instance-name>;<database-name>"
if (-not $logRangesPerDb.ContainsKey($selectedDatabase)) {
  throw "Select a database from logRangesPerDb.Keys."
}
$selectedRanges = @($logRangesPerDb[$selectedDatabase] | Sort-Object EndTime)
$selectedRanges | Format-Table ItemName, StartTime, EndTime
$rangeIndex = -1
$pointInTime = $selectedRanges[$rangeIndex].EndTime
foreach ($databaseName in $logRangesPerDb.Keys) {
  $matchingRanges = @($logRangesPerDb[$databaseName] | Where-Object {
    $_.StartTime -le $pointInTime -and $_.EndTime -ge $pointInTime
  })
  if ($matchingRanges.Count -eq 0) {
    throw "The chosen restore time is unavailable for $databaseName."
  }
}
$pit = $pointInTime.ToString("dd-MM-yyyy-HH:mm:ss")

PITR yapılandırmasını temel anlık görüntü ve doğrulanmış günlük tekrar süresi kullanarak oluşturun:

$configFile = ".\instance-pit.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName --log-point-in-time $pit `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --target-item-name "<target-database-name-or-service-supported-instance-pattern>" `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --no-recovery-mode `
  --output json | Set-Content -Encoding utf8 $configFile

--no-recovery-mode veritabanlarının sonraki kurtarma adımları için kurtarılmamış durumda kalmasını talep eder. Bu davranışın iyileşme planınız için uygun olup olmadığını gözden geçirin.

Disk olarak instans geri yükleme

SnapshotAttach öğesini, snapshot bağlama ve ardından veritabanı kurtarma yerine, disk olarak geri yükleme (RAD) için kullanın:

$configFile = ".\instance-rad.json"
az backup recoveryconfig show @instanceArgs --rp-name $snapshotRpName `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Bir instans altında korunan veritabanını geri getirin

Kaynak konteynerden tam olarak yerel veritabanı öğesi adını seçin. Kurtarma noktası geri yüklemeleri için, açıkça bir veritabanı anlık görüntüsü seçin:

az backup item list @sourceArgs --workload-type MSSQL --output json
$dbItemName = "<native-protected-database-item-name>"
$databaseArgs = $sourceArgs + @("--item-name", $dbItemName, "--workload-type", "MSSQL")
az backup recoverypoint list @databaseArgs --restore-point-query-type Snapshot --output json
$dbSnapshotRpName = "<chosen-database-snapshot-recovery-point-name>"
az backup recoverypoint show @databaseArgs --name $dbSnapshotRpName --output json

Veritabanını alternatif konuma geri yükleme

$configFile = ".\database-alr.json"
az backup recoveryconfig show @databaseArgs --rp-name $dbSnapshotRpName `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --target-item-name "<restored-db-name>" --snapshot-rg $restoreRg `
  --identity-arm-id $uamiId --no-recovery-mode --output json |
  Set-Content -Encoding utf8 $configFile

Veritabanını belirli bir zamandaki durumuna geri yükleme

Mevcut log aralıklarını sorgulayın ve geri dönen bir aralık içinde bir UTC zamanını seçin. dd-MM-yyyy-HH:mm:ss biçimini kullanın:

az backup recoverypoint show-log-chain @databaseArgs --output json
$pit = "<dd-MM-yyyy-HH:mm:ss-in-UTC-within-a-returned-range>"
$configFile = ".\database-pit.json"
az backup recoveryconfig show @databaseArgs --log-point-in-time $pit `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttachAndRecover `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --target-item-name "<restored-db-name>" --snapshot-rg $restoreRg `
  --identity-arm-id $uamiId --no-recovery-mode --output json |
  Set-Content -Encoding utf8 $configFile

Önceki veritabanı geri yükleme örnekleri de --no-recovery-mode kullanır. Göndermeden önce o ayarı gözden geçirin.

Veritabanını diskler olarak geri yükleme

$configFile = ".\database-rad.json"
az backup recoveryconfig show @databaseArgs --rp-name $dbSnapshotRpName `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Veritabanını diskler olarak, günlükleri dosyalar olarak geri yükleme

$pit öğesini, veritabanı PITR örneğinde olduğu gibi, veritabanı log aralıklarından geçerli bir UTC zamanına ayarlayın. Disk eki yapılandırmasını oluşturun, ardından log dosyalarının hedefini belirleyin:

$configFile = ".\database-rad-logs.json"
az backup recoveryconfig show @databaseArgs --log-point-in-time $pit `
  --restore-mode AlternateWorkloadRestore --recovery-mode SnapshotAttach `
  --target-container-name $targetContainerName --target-server-name $targetVm `
  --target-server-type SQLInstance --target-instance-name $targetInstanceName `
  --snapshot-rg $restoreRg --identity-arm-id $uamiId --output json |
  Set-Content -Encoding utf8 $configFile

Konfigürasyon oluşturmanın başarılı olduğunu doğruladıktan sonra, oluşturulan eşlemeleri düzenleyin:

$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.target_directory_mapping = @{ all = 'C:\temp' }
($cfg.target_physical_path | Where-Object source_path -eq 'E:\').target_path = 'M:\'
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile

Anlık görüntü geri yüklemeyi inceleyin ve gönderin

Her seçilen senaryo için, çıktısını kullanmadan önce az backup recoveryconfig show işleminin başarılı olduğunu doğrulayın. Oluşturulan dosya ve birim eşlemelerini inceleyin. Sadece farklı hedef yol gerektiren kaynak hacimleri yeniden eşleyin. Örnek sürücü harflerini gerçek yollarla değiştirin:

$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.target_physical_path | Format-Table source_path, target_path
($cfg.target_physical_path | Where-Object source_path -eq 'E:\').target_path = 'X:\'
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile

Önceki yeniden eşleme isteğe bağlıdır. Seçtiğiniz senaryo için amaçlanan eşlemeleri, veritabanı disk ve log dosyası yapılandırmaları dahil olmak üzere koruyun.

Dosya sistemi çatışmasını çözmek için disk bağlantısının kesilmesi gerekiyorsa, oluşturulan yapılandırmaya yalnızca açıkça onaylanmış disk kimlikleri ekleyin:

$cfg = Get-Content -Raw $configFile | ConvertFrom-Json
$cfg.disks_to_detach_on_clash = @(
  "/subscriptions/<subscription-id>/resourceGroups/<disk-rg>/providers/Microsoft.Compute/disks/<disk-name>"
)
$cfg | ConvertTo-Json -Depth 100 | Set-Content -Encoding utf8 $configFile

Warning

Mevcut disklerin ayrılması, hedef iş yüklerini bozabilir. Geri yüklemeyi göndermeden önce her disk kimliğini ve tam kurtarma yapılandırmasını doğrulayın. İsteğe bağlı disk ayırma örneğini, işlem zorunlu ve onaylanmışsa uygulayın.

Seçilen işlem için yalnızca yapılandırma dosyasını gönderin:

az backup restore restore-azurewl @vaultArgs --recovery-config $configFile

Geri dönen iş adını az backup job show ile takip edin. Durdurma koruması ve kayıt kaldırma komutları için bkz. SQL örneği snapshot yedeklemelerini Yönet.

Sonraki adım

  • Azure CLI kullanılarak yedeklenen SQL veritabanlarını yönetin.