Sichern mehrerer Datenbanken in Azure Blob Storage – PowerShell

Gilt für:SQL Server

Dieses Thema enthält Beispielskripts, die verwendet werden können, um Sicherungen in Azure Blob Storage mit PowerShell-Cmdlets zu automatisieren.

Übersicht über PowerShell-Cmdlets für Sicherungen und Wiederherstellungen

Die Backup_SqlDatabase und die Restore-SqlDatabase sind die beiden wichtigsten Cmdlets, die für Sicherungs- und Wiederherstellungsvorgänge verfügbar sind.

Darüber hinaus gibt es weitere Cmdlets, die erforderlich sein können, um Sicherungen in Microsoft Azure Blob Storage zu automatisieren, wie z.B. die SqlCredential-Cmdlets.

Eine Liste aller verfügbaren Cmdlets finden Sie unter SqlServer-Cmdlets.

Tipp

Die SqlCredential-Cmdlets werden in Szenarios für den Azure Blob Storage bei der Sicherung und Wiederherstellung verwendet. Weitere Details zu Anmeldeinformationen und deren Verwendung finden Sie unter SQL Server-Sicherung und -Wiederherstellung mit Microsoft Azure Blob Storage.

PowerShell für mehrere Datenbanken, Sicherungsvorgänge mit mehreren Instanzen

Die folgenden Abschnitte enthalten die Skripts für verschiedene Vorgänge wie das Erstellen von SQL-Anmeldeinformationen in mehreren SQL Server-Instanzen, das Sichern aller Benutzerdatenbanken in einer Instanz von SQL Server usw. Sie können diese Skripts verwenden, um Sicherungsvorgänge gemäß den Anforderungen Ihrer Umgebung zu automatisieren oder zu planen. Die Skripts, die hier bereitgestellt werden, sind Beispiele und können für Ihre Umgebung geändert oder erweitert werden.

Folgende Überlegungen sind bei Beispielskripts zu bedenken:

  • SQL Server PowerShell implementiert Cmdlets, um in der Pfadstruktur zu navigieren, die die Hierarchie von Objekten darstellt, die von einem PowerShell-Anbieter unterstützt werden. Wenn Sie zu einem Knoten im Pfad navigiert haben, können Sie andere Cmdlets verwenden, um grundlegende Vorgänge für das aktuelle Objekt auszuführen.

    Weitere Informationen finden Sie unter Navigate SQL Server PowerShell Paths.

  • Get-ChildItem -Cmdlet: Welche Informationen von Get-ChildItem zurückgegeben werden, hängt vom Speicherort in einem SQL Server-PowerShell-Pfad ab. Wenn der Speicherort auf der Computerebene liegt, gibt dieses Cmdlets alle SQL Server-Datenbank-Engine-Instanzen zurück, die auf dem Computer installiert sind. Oder, wenn der Speicherort aber auf Objektebene, wie z. B. Datenbanken, liegt, dann gibt dieses Cmdlet eine Liste von Datenbankobjekten zurück. Standardmäßig gibt das Get-ChildItem -Cmdlet keine Systemobjekte zurück. Verwenden Sie den Parameter –Force, um die Systemobjekte anzuzeigen.

  • Für alle Sicherungs- und Wiederherstellungsvorgänge von Azure Blob Storage werden ein Azure-Speicherkonto und SQL-Anmeldeinformationen benötigt.

Erstellen von SQL-Anmeldeinformationen für alle Instanzen von SQL Server

Das folgende Skript kann verwendet werden, um generische SQL-Anmeldeinformationen für alle Instanzen von SQL Server auf dem Computer zu erstellen. Wenn bereits vorhandene Anmeldeinformationen mit dem gleichen Namen für eine der Instanzen des Computers vorliegen, zeigt das Skript den Fehler an und wird dann fortgesetzt.

# load the sqlps module
import-module sqlps  
  
# set parameters
$sqlPath = "sqlserver:\sql\$($env:COMPUTERNAME)"
$storageAccount = "<myStorageAccount>"  
$storageKey = "<myStorageAccessKey>"  
$secureString = ConvertTo-SecureString $storageKey -AsPlainText -Force  
$credentialName = "myCredential-$(Get-Random)"

Write-Host "Generate credential: " $credentialName
  
#cd to sql server and get instances  
cd $sqlPath
$instances = Get-ChildItem

#loop through instances and create a SQL credential, output any errors
foreach ($instance in $instances)  {
    try {
        $path = "$($sqlPath)\$($instance.DisplayName)\credentials"
        New-SqlCredential -Name $credentialName -Identity $storageAccount -Secret $secureString -Path $path -ea Stop | Out-Null
        Write-Host "...generated credential $($path)\$($credentialName)."  }
    catch { Write-Host $_.Exception.Message } }

Hinweis

Die Anweisung -ea Stop | Out-Null wird für die benutzerdefinierte Ausnahmeausgabe verwendet. Wenn Sie PowerShell-Standardfehlermeldungen bevorzugen, kann diese Anweisung entfernt werden.

Entfernen von SQL-Anmeldeinformationen aus allen Instanzen von SQL Server

Das folgende Skript kann verwendet werden, um bestimmte Anmeldeinformationen aus allen SQL Server-Instanzen auf dem Computer zu entfernen. Wenn die Anmeldeinformationen in einer bestimmten Instanz nicht vorhanden sind, wird eine Fehlermeldung angezeigt, und das Skript wird fortgesetzt, bis alle Instanzen überprüft sind.

import-module sqlps

$sqlPath = "sqlserver:\sql\$($env:COMPUTERNAME)"
$credentialName = "<myCredential>"

Write-Host "Delete credential: " $credentialName

cd $sqlPath
$instances = Get-ChildItem

#loop through instances and delete a SQL credential
foreach ($instance in $instances)  {
    try {
        $path = "$($sqlPath)\$($instance.DisplayName)\credentials\$($credentialName)"
        Remove-SqlCredential -Path $path -ea Stop | Out-Null
        Write-Host "...deleted credential $($path)."  }
    catch { Write-Host $_.Exception.Message } }

Vollständige Sicherung aller Datenbanken

Mit dem folgenden Skript erstellen Sie Sicherungen aller Datenbanken auf dem Computer. Dies gilt sowohl für Benutzerdatenbanken als auch für die msdb -Systemdatenbank. Das Skript filtert tempdb - und model -Systemdatenbanken heraus.

import-module sqlps  

$sqlPath = "sqlserver:\sql\$($env:COMPUTERNAME)"
$storageAccount = "<myStorageAccount>"  
$blobContainer = "<myBlobContainer>"  
$backupUrlContainer = "https://$storageAccount.blob.core.windows.net/$blobContainer/"  
$credentialName = "<myCredential>"

Write-Host "Backup database: " $backupUrlContainer
  
cd $sqlPath
$instances = Get-ChildItem

#loop through instances and backup all databases (excluding tempdb and model)
foreach ($instance in $instances)  {
    $path = "$($sqlPath)\$($instance.DisplayName)\databases"
    $databases = Get-ChildItem -Force -Path $path | Where-object {$_.name -ne "tempdb" -and $_.name -ne "model"}

    foreach ($database in $databases) {
        try {
            $databasePath = "$($path)\$($database.Name)"
            Write-Host "...starting backup: " $databasePath
            Backup-SqlDatabase -Database $database.Name -Path $path -BackupContainer $backupUrlContainer -SqlCredential $credentialName -Compression On
            Write-Host "...backup complete."  }
        catch { Write-Host $_.Exception.Message } } }

Vollständige Sicherung für Systemdatenbanken auf nur einer bestimmten SQL Server-Instanz

Das vollständige Skript kann zum Sichern der master - und der msdb -Datenbanken in einer benannten Instanz von SQL Server verwendet werden. Das gleiche Skript kann für jede Instanz verwendet werden, indem der Wert des Instanzparameters geändert wird. Die Standardinstanz von SQL Server hat den Namen DEFAULT.

import-module sqlps  

$sqlPath = "sqlserver:\sql\$($env:COMPUTERNAME)"
$instanceName = "DEFAULT"
$storageAccount = "<myStorageAccount>"  
$blobContainer = "<myBlobContainer>"  
$backupUrlContainer = "https://$storageAccount.blob.core.windows.net/$blobContainer/"  
$credentialName = "<myCredential>"

Write-Host "Backup database: " $instanceName " to " $backupUrlContainer
  
cd "$($sqlPath)\$($instanceName)"

#loop through instance and backup specific databases
$databases = "master", "msdb"  
foreach ($database in $databases) {
    try {
        Write-Host "...starting backup: " $database
        Backup-SqlDatabase -Database $database -BackupContainer $backupUrlContainer -SqlCredential $credentialName -Compression On
        Write-Host "...backup complete." }
    catch { Write-Host $_.Exception.Message } }

Siehe auch

SQL Server-Sicherung und -Wiederherstellung mit Azure Blob Storage

SQL Server-Sicherung über URLs – bewährte Methoden und Problembehandlung