Przywracaj bazy danych i instancje SQL Server na maszynach wirtualnych platformy Azure za pomocą programu PowerShell

Ten artykuł opisuje, jak przywrócić kopie zapasowe baz danych przesyłanych strumieniowo oraz kopie zapasowe migawek wystąpień SQL za pomocą Azure PowerShell. Możesz przywrócić punkt odzyskiwania lub użyć logów transakcyjnych do odzyskiwania w czasie (PITR).

Prerequisites

  • Zainstaluj najnowszy moduł Azure PowerShell, w tym Az.RecoveryServices. Przywracanie strumieniowe SQL wymaga wersji Az 6.0.0 lub nowszej. Przykłady snapshotów wymagają wersji modułu, która ujawnia parametry snapshotów pokazane tutaj.
  • Musisz mieć istniejącą bazę danych SQL lub kopię zapasową instancji. Przejrzyj wymagania wstępne przywracania i macierz wsparcia snapshotów.
  • Do przywracania snapshotów przygotuj docelową grupę zasobów oraz zarządzaną tożsamość przypisaną przez użytkownika z wymaganymi uprawnieniami. Przejrzyj wymagania dotyczące przywracania snapshotów.
  • Zarejestruj docelową maszynę wirtualną w odpowiednim magazynie usługi Recovery Services przed przywracaniem do lokalizacji alternatywnej.
  • Zamień wartości w nawiasach kątowych. Uruchom wspólną konfigurację dla wybranego scenariusza, a następnie wybierz jeden przykład konfiguracji przywracania. Przykłady konfiguracji nie rozpoczynają przywracania, dopóki nie zatwierdzisz konfigurację.

Zaloguj się, wybierz subskrypcję magazynu i pobierz informacje o magazynie:

Connect-AzAccount
Select-AzSubscription -SubscriptionId "<vault-subscription-id>"
$vault = Get-AzRecoveryServicesVault -ResourceGroupName "<vault-rg>" -Name "<vault-name>"

Przywróć kopię zapasową bazy danych utworzoną metodą strumieniową

Wybierz bazę danych i czas odzyskiwania

Ogranicz wyszukiwanie w bazie danych do kontenera źródłowej maszyny wirtualnej:

$sourceContainer = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer `
    -BackupManagementType AzureWorkload -FriendlyName "<source-vm>" -VaultId $vault.ID
$databaseItem = Get-AzRecoveryServicesBackupItem -Container $sourceContainer `
    -WorkloadType MSSQL -Name "SQLDataBase;<instance-name>;<database-name>" `
    -VaultId $vault.ID
$startDate = (Get-Date).AddDays(-7).ToUniversalTime()
$endDate = (Get-Date).ToUniversalTime()
Get-AzRecoveryServicesBackupRecoveryPoint -Item $databaseItem `
    -StartDate $startDate -EndDate $endDate -VaultId $vault.ID
$fullRecoveryPoint = Get-AzRecoveryServicesBackupRecoveryPoint -Item $databaseItem `
    -RecoveryPointId "<recovery-point-id>" -VaultId $vault.ID

Dla PITR, zapytaj zakresy ciągłych logów za pomocą Get-AzRecoveryServicesBackupRecoveryLogChain, a następnie wybierz czas UTC w jednym z tych zakresów:

$logRanges = Get-AzRecoveryServicesBackupRecoveryLogChain -Item $databaseItem -VaultId $vault.ID
$logRanges | Select-Object ItemName, StartTime, EndTime
$pointInTime = (Get-Date "<yyyy-MM-ddTHH:mm:ssZ>").ToUniversalTime()

Dla strumieniowego PITR usługa określa pełną kopię zapasową i łańcuch logów potrzebne do przywrócenia na wybrany moment w czasie.

Przywróć do pierwotnej lokalizacji

Wybierz punkt odzyskiwania pełnego lub różnicowego:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $fullRecoveryPoint -OriginalWorkloadRestore -VaultId $vault.ID

Alternatywnie, użyj wybranego punktu w czasie:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -PointInTime $pointInTime -Item $databaseItem -OriginalWorkloadRestore -VaultId $vault.ID

Warning

Przywrócenie bazy danych do pierwotnej lokalizacji nadpisuje oryginalną bazę danych. Przejrzyj konfigurację odzyskiwania przed jej przesłaniem.

Przywracanie do lokalizacji alternatywnej

Wybierz docelowy kontener VM oraz instancję SQL:

$targetContainer = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer `
    -BackupManagementType AzureWorkload -FriendlyName "<target-vm>" -VaultId $vault.ID
$targetInstance = Get-AzRecoveryServicesBackupProtectableItem -WorkloadType MSSQL `
    -ItemType SQLInstance -Name "<target-instance>" -ServerName "<target-vm>" `
    -VaultId $vault.ID

Dla pełnego lub różnicowego punktu odzyskiwania:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $fullRecoveryPoint -AlternateWorkloadRestore `
    -TargetItem $targetInstance -TargetContainer $targetContainer -VaultId $vault.ID

Dla PITR:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -PointInTime $pointInTime -Item $databaseItem -AlternateWorkloadRestore `
    -TargetItem $targetInstance -TargetContainer $targetContainer -VaultId $vault.ID

Sprawdź wygenerowaną nazwę bazy danych i ścieżki plików. Zmień je w razie potrzeby w miejscu docelowym:

$recoveryConfig | Format-List
$recoveryConfig.targetPhysicalPath | Format-Table
$recoveryConfig.RestoredDBName = "<restored-database-name>"

Przywróć kopie zapasowe przesyłane strumieniowo jako pliki

Aby przywrócić pełną lub różnicową kopię zapasową jako pliki na zarejestrowanej docelowej maszynie wirtualnej:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $fullRecoveryPoint -TargetContainer $targetContainer `
    -RestoreAsFiles -FilePath "<target-folder>" -VaultId $vault.ID

Dla log PITR, zażądaj plików z najnowszej odpowiedniej pełnej kopii zapasowej:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -PointInTime $pointInTime -Item $databaseItem -TargetContainer $targetContainer `
    -RestoreAsFiles -FilePath "<target-folder>" -VaultId $vault.ID

Aby użyć konkretnej pełnej kopii zapasowej do przywracania plików, dodaj -FromFull $fullRecoveryPoint do polecenia konfiguracji PITR.

Wyszukaj punkty odzyskiwania migawek

Wybierz chronioną instancję

Poniższa konfiguracja wybiera element instancji i wyświetla jego punkty przywracania. Użyj tej konfiguracji do scenariuszy przywracania instancji później w tym artykule:

$sourceContainer = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer `
    -BackupManagementType AzureWorkload -FriendlyName "<source-vm>" -VaultId $vault.ID
$instanceItem = Get-AzRecoveryServicesBackupItem -Container $sourceContainer `
    -WorkloadType MSSQLInstance -Name "sqlinstance;<instance-name>" -VaultId $vault.ID
$startDate = (Get-Date).AddDays(-7).ToUniversalTime()
$endDate = (Get-Date).ToUniversalTime()

$recoveryPoints = Get-AzRecoveryServicesBackupRecoveryPoint -Item $instanceItem `
    -StartDate $startDate -EndDate $endDate `
    -RestorePointQueryType FullDifferentialAndSnapshot -VaultId $vault.ID
$snapshotPoints = Get-AzRecoveryServicesBackupRecoveryPoint -Item $instanceItem `
    -RestorePointQueryType Snapshot -VaultId $vault.ID
$latestSnapshot = Get-AzRecoveryServicesBackupRecoveryPoint -Item $instanceItem `
    -GetLatestRecoveryPointOnly -RestorePointQueryType Snapshot -VaultId $vault.ID
$snapshotPoints | Format-Table RecoveryPointId, RecoveryPointTime, RecoveryPointType

Wybierz identyfikator ze zwróconej listy. Pobierz ten punkt odzyskiwania według ID, aby uzyskać pełne szczegóły, zamiast zakładać, że pierwszy wpis na liście jest żądaną migawką:

$snapshotPoint = Get-AzRecoveryServicesBackupRecoveryPoint -Item $instanceItem `
    -RecoveryPointId "<snapshot-recovery-point-id>" -VaultId $vault.ID
$snapshotPoint.IncludedDatabases | Select-Object DatasourceName, DatasourceId
$snapshotPoint.SnapshotRecoveryPointInfo.SnapshotResourceGroup
$snapshotPoint.SnapshotRecoveryPointInfo.SourceFilesystemInfo | Select-Object `
    Label, FileSystemType, @{Name = 'AccessPaths'; Expression = { $_.AccessPaths -join ',' }}, IsOnStorageSpace

Zakresy dziennika zapytań powyżej migawki instancji

Zapytania łańcucha dziennika są skierowane do każdego elementu bazy danych zawartego w migawce. Bazowy identyfikator źródła danych to identyfikator ProtectedItemDataSourceId, a nie bazy danych DatasourceId:

$logRangesPerDatabase = @{}
foreach ($database in $snapshotPoint.IncludedDatabases) {
    $databaseItem = Get-AzRecoveryServicesBackupItem -Container $sourceContainer `
        -WorkloadType MSSQL -Name "SQLDataBase;$($database.DatasourceName)" -VaultId $vault.ID
    $logRangesPerDatabase[$database.DatasourceName] = @(
        Get-AzRecoveryServicesBackupRecoveryLogChain -Item $databaseItem `
            -RecoveryMode SnapshotAttachAndRecover `
            -BaseSnapshotRecoveryPointId $snapshotPoint.RecoveryPointId `
            -BaseRecoveryPointDatasourceId $instanceItem.ProtectedItemDataSourceId `
            -VaultId $vault.ID
    )
}
$logRangesPerDatabase["<instance-name>;<database-name>"] | Format-Table ItemName, StartTime, EndTime

Używaj Get-AzRecoveryServicesBackupRecoveryLogChain do zakresów czasowych. Get-AzRecoveryServicesBackupRecoveryPoint zwraca pojedyncze punkty odzyskania, a nie ciągłe zakresy logów.

Przywróć migawkę instancji

Użyj instancji i szczegółów $snapshotPoint z punktów odzyskiwania migawek zapytania. Zarówno konfiguracje snapshotów z oryginalną, jak i alternatywną lokalizacją wymagają docelowej grupy zasobów oraz przypisanej przez użytkownika tożsamości zarządzanej:

$identityId = "/subscriptions/<subscription-id>/resourceGroups/<identity-rg>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"
$targetResourceGroup = "<target-rg>"

Przywracanie do oryginalnej lokalizacji

Utwórz konfigurację przywracania oryginalnego obciążenia roboczego:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $snapshotPoint -OriginalWorkloadRestore `
    -TargetResourceGroupName $targetResourceGroup -UserAssignedIdentityId $identityId `
    -VaultId $vault.ID

Przywracanie do alternatywnej lokalizacji

Wybierz kontener docelowy i instancję. Użyj tego ustawienia docelowego do przywracania w alternatywnej lokalizacji, odtwarzania instancji do punktu w czasie (PITR) oraz przywracania jako dyski:

$targetContainer = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer `
    -BackupManagementType AzureWorkload -FriendlyName "<target-vm>" -VaultId $vault.ID
$targetInstance = Get-AzRecoveryServicesBackupProtectableItem -WorkloadType MSSQL `
    -ItemType SQLInstance -Name "<target-instance>" -ServerName "<target-vm>" -VaultId $vault.ID

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $snapshotPoint -AlternateWorkloadRestore `
    -TargetItem $targetInstance -TargetContainer $targetContainer `
    -TargetResourceGroupName $targetResourceGroup -UserAssignedIdentityId $identityId `
    -VaultId $vault.ID

Przywracanie do punktu w czasie

Najpierw uruchom zapytanie o zakres logów dla każdej bazy danych. Wybierz czas przywrócenia UTC, który jest dostępny dla każdej przywracanej bazy danych. Następujący test odrzuca czas spoza zakresów jakiejkolwiek bazy danych:

$pointInTime = (Get-Date "<yyyy-MM-ddTHH:mm:ssZ>").ToUniversalTime()
if ($logRangesPerDatabase.Count -eq 0) {
    throw "No database log ranges were retrieved for the selected snapshot."
}
foreach ($databaseName in $logRangesPerDatabase.Keys) {
    $matchingRanges = @($logRangesPerDatabase[$databaseName] | Where-Object {
        $_.StartTime.ToUniversalTime() -le $pointInTime -and
        $_.EndTime.ToUniversalTime() -ge $pointInTime
    })
    if ($matchingRanges.Count -eq 0) {
        throw "The selected restore time is unavailable for $databaseName."
    }
}

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $snapshotPoint -PointInTime $pointInTime `
    -AlternateWorkloadRestore -TargetItem $targetInstance -TargetContainer $targetContainer `
    -TargetResourceGroupName $targetResourceGroup -UserAssignedIdentityId $identityId `
    -RecoveryMode SnapshotAttachAndRecover -NoRecoveryMode -VaultId $vault.ID

Punkt odzyskania snapshotu identyfikuje migawkę bazy; -PointInTime określa cel powtórki z loga. Ten przykład powoduje, że -NoRecoveryMode pozostawia bazy danych w stanie nieodzyskanym na potrzeby kolejnych kroków odzyskiwania. Przejrzyj tę opcję w swoim planie odzyskiwania.

Przywróć jako dyski

Użyj SnapshotAttach do podłączenia dysków migawek zamiast wykonywać dołączanie migawki i odzyskiwanie bazy danych:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $snapshotPoint -AlternateWorkloadRestore `
    -TargetItem $targetInstance -TargetContainer $targetContainer `
    -TargetResourceGroupName $targetResourceGroup -UserAssignedIdentityId $identityId `
    -RecoveryMode SnapshotAttach -VaultId $vault.ID

Konfiguruj ścieżki docelowe i konflikty dysków

Sprawdź targetPhysicalPath przed przesłaniem jakiejkolwiek konfiguracji snapshotu instancji. Tomy źródłowe są wymienione z pustymi ścieżkami docelowymi. Ustaw docelową ścieżkę tylko dla woluminów wymagających przemapowania, na przykład podczas rozwiązywania konfliktu systemu plików:

$recoveryConfig.targetPhysicalPath | Format-Table SourcePath, TargetPath
($recoveryConfig.targetPhysicalPath | Where-Object { $_.SourcePath -eq "E:\" }).TargetPath = "X:\"

Zamień przykładowe ścieżki źródłowe i docelowe ścieżkami odpowiednimi dla punktu odzyskiwania i miejsca docelowego. Jeśli do rozwiązania kolizji potrzebne jest odłączenie dysku, wyraźnie zidentyfikuj dotknięte dyski:

$recoveryConfig.DisksToDetachOnClash = @(
    "/subscriptions/<subscription-id>/resourceGroups/<disk-rg>/providers/Microsoft.Compute/disks/<disk-name>"
)

Warning

Odłączenie istniejącego dysku może zakłócić obciążenia korzystające z niego. Potwierdź identyfikatory dysków oraz konfigurację docelowego systemu plików przed przesłaniem operacji przywracania.

Przywróć bazę danych chronioną w ramach instancji

Ogólna konfiguracja

Wybierz element kopii zapasowej bazy danych, docelowy kontener i instancję, docelową grupę zasobów oraz tożsamość:

$sourceContainer = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer `
    -BackupManagementType AzureWorkload -FriendlyName "<source-vm>" -VaultId $vault.ID
$databaseItem = Get-AzRecoveryServicesBackupItem -Container $sourceContainer `
    -WorkloadType MSSQL -Name "SQLDataBase;<instance-name>;<database-name>" -VaultId $vault.ID
$targetContainer = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer `
    -BackupManagementType AzureWorkload -FriendlyName "<target-vm>" -VaultId $vault.ID
$targetInstance = Get-AzRecoveryServicesBackupProtectableItem -WorkloadType MSSQL `
    -ItemType SQLInstance -Name "<target-instance>" -ServerName "<target-vm>" -VaultId $vault.ID
$targetResourceGroup = "<target-rg>"
$identityId = "/subscriptions/<subscription-id>/resourceGroups/<identity-rg>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"

Aby przywrócić z punktu odzyskiwania migawki, wypisz migawki z bazy danych i pobierz wybrany punkt według ID:

Get-AzRecoveryServicesBackupRecoveryPoint -Item $databaseItem `
    -RestorePointQueryType Snapshot -VaultId $vault.ID
$databaseSnapshot = Get-AzRecoveryServicesBackupRecoveryPoint -Item $databaseItem `
    -RecoveryPointId "<database-snapshot-recovery-point-id>" -VaultId $vault.ID

Przywracanie do lokalizacji alternatywnej

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $databaseSnapshot -AlternateWorkloadRestore `
    -TargetItem $targetInstance -TargetContainer $targetContainer `
    -TargetResourceGroupName $targetResourceGroup -UserAssignedIdentityId $identityId `
    -RecoveryMode SnapshotAttachAndRecover -NoRecoveryMode -VaultId $vault.ID

Przywracanie do punktu w czasie

Wypisz dostępne zakresy logów bazy danych i wybierz czas UTC w zwróconym zakresie:

$logRanges = Get-AzRecoveryServicesBackupRecoveryLogChain -Item $databaseItem -VaultId $vault.ID
$logRanges | Select-Object ItemName, StartTime, EndTime
$pointInTime = (Get-Date "<yyyy-MM-ddTHH:mm:ssZ>").ToUniversalTime()

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -PointInTime $pointInTime -Item $databaseItem -AlternateWorkloadRestore `
    -TargetItem $targetInstance -TargetContainer $targetContainer `
    -TargetResourceGroupName $targetResourceGroup -UserAssignedIdentityId $identityId `
    -RecoveryMode SnapshotAttachAndRecover -NoRecoveryMode -VaultId $vault.ID

Oba przykłady odzyskiwania bazy danych określają -NoRecoveryMode. Sprawdź, czy Twój plan odzyskiwania wymaga, aby baza danych pozostała nieprzywrócona.

Przywróć jako dyski

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $databaseSnapshot -AlternateWorkloadRestore `
    -TargetItem $targetInstance -TargetContainer $targetContainer `
    -TargetResourceGroupName $targetResourceGroup -UserAssignedIdentityId $identityId `
    -RecoveryMode SnapshotAttach -VaultId $vault.ID

Przywracaj jako dyski, a logi jako pliki

Wybierz czas z dostępnych zakresów logów bazy danych, jak w przykładzie PITR bazy danych, a następnie skonfiguruj miejsce docelowe pliku logu:

$recoveryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -PointInTime $pointInTime -Item $databaseItem -AlternateWorkloadRestore `
    -TargetItem $targetInstance -TargetContainer $targetContainer `
    -TargetResourceGroupName $targetResourceGroup -UserAssignedIdentityId $identityId `
    -RecoveryMode SnapshotAttach -TargetDirectoryMapping @{ all = "C:/temp" } `
    -VaultId $vault.ID

Dla każdej z tych konfiguracji migawek bazy danych należy przejrzeć ścieżki źródłowe i ustawić wymagane mapowania woluminów docelowych przed przesłaniem:

$recoveryConfig.targetPhysicalPath | Format-Table SourcePath, TargetPath
($recoveryConfig.targetPhysicalPath | Where-Object { $_.SourcePath -eq "E:\" }).TargetPath = "M:\"

Uruchom przywracanie i śledź zadanie

Przejrzyj wybraną konfigurację, a następnie zatwierdź ją przy użyciu Restore-AzRecoveryServicesBackupItem:

$recoveryConfig | Format-List
$restoreJob = Restore-AzRecoveryServicesBackupItem -WLRecoveryConfig $recoveryConfig -VaultId $vault.ID
$restoreJob

Użyj zwróconego ID zlecenia wraz z poleceniami monitorowania zadania.

Przywracanie między regionami dla kopii zapasowych strumieniowej bazy danych

Gdy włączysz przywracanie międzyregionalne, użyj -UseSecondaryRegion, aby wyszukiwać replikowane elementy, punkty odzyskiwania i łańcuchy dzienników. Docelowa maszyna wirtualna musi być zarejestrowana w magazynie w sparowanym regionie:

$secondaryItems = Get-AzRecoveryServicesBackupItem -BackupManagementType AzureWorkload `
    -WorkloadType MSSQL -VaultId $vault.ID -UseSecondaryRegion
$secondaryItems | Format-Table Name, FriendlyName
$secondaryItem = $secondaryItems | Where-Object { $_.Name -eq "<backup-item-name>" }
$secondaryPoint = Get-AzRecoveryServicesBackupRecoveryPoint -Item $secondaryItem `
    -RecoveryPointId "<recovery-point-id>" -UseSecondaryRegion -VaultId $vault.ID
Get-AzRecoveryServicesBackupRecoveryLogChain -Item $secondaryItem `
    -UseSecondaryRegion -VaultId $vault.ID

$pairedVault = Get-AzRecoveryServicesVault -ResourceGroupName "<paired-vault-rg>" -Name "<paired-vault-name>"
$secondaryContainer = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVMAppContainer `
    -FriendlyName "<secondary-vm>" -Status Registered -VaultId $pairedVault.ID
$secondaryInstance = Get-AzRecoveryServicesBackupProtectableItem -WorkloadType MSSQL `
    -ItemType SQLInstance -Container $secondaryContainer -VaultId $pairedVault.ID
$secondaryConfig = Get-AzRecoveryServicesBackupWorkloadRecoveryConfig `
    -RecoveryPoint $secondaryPoint -AlternateWorkloadRestore `
    -TargetItem $secondaryInstance -TargetContainer $secondaryContainer -UseSecondaryRegion -VaultId $vault.ID
Restore-AzRecoveryServicesBackupItem -WLRecoveryConfig $secondaryConfig `
    -RestoreToSecondaryRegion -VaultId $vault.ID

Wybierz unikalny element źródłowy i docelową instancję spośród zwróconych obiektów. Dla log PITR zbuduj konfigurację z -PointInTime i -Item $secondaryItem zamiast -RecoveryPoint. Przed podjęciem działań przejrzyj wymagania dotyczące przywracania między regionami . Ten przykład dotyczy strumieniowych kopii zapasowych bazy danych, a nie konfiguracji snapshotów międzyregionalnych.

Następne kroki