SQL Server-Sicherung und -Wiederherstellung mit dem Windows Azure-BLOB-Speicherdienst

In diesem Thema werden Konzepte, Überlegungen und Beispielcode eingeführt, die beim Konfigurieren und Schreiben von SQL Server-Sicherungen und -Wiederherstellungen unter Verwendung des Windows Azure-BLOB-Speicherdiensts von zentraler Bedeutung sind. Darüber hinaus werden die Vorteile zusammengefasst, die die Verwendung des Windows Azure-BLOB-Diensts bei der Speicherung von SQL Server-Sicherungen bietet.

Durch diese in SQL Server 2012 SP1 CU2 eingeführte Funktion können SQL Server-Sicherungen und -Wiederherstellungen direkt unter Verwendung des Windows Azure-BLOB-Diensts ausgeführt werden. Dank dieser Funktion können SQL Server-Datenbanken auf einer lokalen Instanz bzw. auf einer SQL Server-Instanz gesichert werden, auf der eine gehostete Umgebung, z. B. ein virtueller Windows Azure-Computer, ausgeführt wird. Die Sicherung von Daten in der Cloud bietet zahlreiche Vorteile, wie Verfügbarkeit, unbegrenzte Georeplikation durch Offsite-Speicherung und effiziente Datenmigration in und aus der Cloud. In dieser Version können BACKUP- oder RESTORE-Anweisungen mithilfe von TSQL oder SMO ausgegeben werden. Eine Sicherung oder Wiederherstellung im Windows Azure-BLOB-Speicherdienst mithilfe des Sicherungs- oder Wiederherstellungs-Assistenten von SQL Server Management Studio ist in dieser Version nicht verfügbar.

In SQL Server 2012 SP1 CU4 wird die Sicherung und Wiederherstellung unter Verwendung des Windows Azure-BLOB-Speicherdiensts mit PowerShell unterstützt. Informationen dazu, wie Sie das Update anfordern, finden Sie in diesem Knowledge Base-Artikel. Der Abschnitt "Beispiel" dieses Themas enthält PowerShell-Skripts. PowerShell-Beispielskripts zum Verwalten mehrerer Sicherungen finden Sie unter Use PowerShell to Backup Multiple Databases to Windows Azure Blob Storage Service.

Vorteile bei der Verwendung des Windows Azure-BLOB-Diensts für SQL Server-Sicherungen

  • Flexible, zuverlässige und unbegrenzte Offsite-Speicherung: Die Speicherung von Sicherungen im Windows Azure-BLOB-Dienst ist eine bequeme, flexible und benutzerfreundliche Möglichkeit, Daten extern zu speichern. Das Einrichten eines Offiste-Speichers für SQL Server-Sicherungen muss nicht schwieriger sein als das Bearbeiten vorhandener Skripts/Aufträge. Die räumliche Entfernung zwischen Offsite-Speicher und Produktionsdatenbank ist in der Regel so groß, dass ein Notfall niemals Auswirkungen auf beide Standorte hat. Indem Sie den BLOB-Speicher auf geografisch verteilte Standorte replizieren, erhalten Sie bei einem Notfall, der die gesamte Region betreffen könnte, eine zusätzliche Schutzebene. Darüber hinaus sind Sicherungen an jedem Standort jederzeit verfügbar und können problemlos für die Wiederherstellung genutzt werden.

  • Sicherungsarchiv: Der Windows Azure-BLOB-Speicherdienst bietet eine bessere Alternative zur Bandsicherung, die häufig zum Archivieren von Sicherungen verwendet wird. Bandspeichermedien müssen unter gleichzeitiger Berücksichtigung von Sicherheitsvorkehrungen u. U. physisch an einen externen Standort umgelagert werden. Die Speicherung von Sicherungen im Windows Azure-BLOB-Speicher ist eine direkte, hoch verfügbare und dauerhafte Archivierungslösung für Ihre Daten.

  • Keine zusätzliche Hardwareverwaltung: Mit Windows Azure-Diensten entsteht kein Mehraufwand durch die Hardwareverwaltung. Windows Azure-Dienste übernehmen die Hardwareverwaltung und ermöglichen die Georeplikation, um Redundanz und Schutz vor Hardwarefehlern zu gewährleisten.

  • SQL Server-Instanzen, die auf einem virtuellen Windows Azure-Computer ausgeführt werden, können derzeit unter Verwendung von Windows Azure-BLOB-Speicherdiensten gesichert werden, indem angeschlossene Datenträger erstellt werden. Die Anzahl der Datenträger, die an einen virtuellen Windows Azure-Computer angeschlossen werden können, ist allerdings begrenzt. Bei einer sehr großen Instanz beträgt die maximale Anzahl 16 Datenträger, während kleinere Instanzen weniger Datenträger unterstützen. Die Beschränkung auf 16 Datenträger kann durch eine direkte Sicherung im Windows Azure-BLOB-Speicher umgangen werden.

    Darüber hinaus steht die Sicherungsdatei, die jetzt im Windows Azure-BLOB-Speicherdienst gespeichert wird, direkt einem lokalen SQL Server oder einem anderen, auf einem virtuellen Windows Azure-Computer ausgeführten SQL Server zur Verfügung, ohne dass Datenbanken angefügt/getrennt oder die VHD heruntergeladen und angeschlossen werden muss.

  • Kostenvorteile: Sie zahlen nur für den genutzten Dienst. Die Option kann genauso kosteneffizient wie eine Offsite-Sicherungs-/Archivierungslösung sein. Weitere Informationen und Links finden Sie im Abschnitt Überlegungen zur Abrechnung in Windows Azure.

Überlegungen zur Abrechnung in Windows Azure:

Auf Grundlage der Speicherkosten für Windows Azure können Sie die für die Erstellung und Speicherung von Sicherungen in Windows Azure anfallenden Kosten ableiten. 

Der Windows Azure-Preisrechner unterstützt Sie bei der Kostenschätzung.

Speicher: Gebühren richten sich nach dem genutzten Speicherplatz sowie dem Grad der Redundanz und werden gestaffelt abgerechnet. Weitere Details und aktuelle Informationen finden Sie im Abschnitt Datenverwaltung des Artikels Preisdetails.

Datenübertragungen: In Windows Azure eingehende Datenübertragungen sind kostenfrei. Ausgehende Übertragungen werden nach Bandbreitennutzung und einer regionsspezifischen Staffelung berechnet. Ausführlichere Informationen finden Sie im Abschnitt Datenübertragungen des Artikels Preisdetails.

Anforderungen, Komponenten und Konzepte

In diesem Abschnitt:

  • Sicherheit

  • Einführung in die wichtigsten Komponenten und Konzepte

  • Windows Azure-BLOB-Speicherdienst

  • SQL Server-Komponenten

  • Einschränkungen

  • Unterstützung für BACKUP-/RESTORE-Anweisungen

Sicherheit

Die folgenden Sicherheitsüberlegungen und -anforderungen beziehen sich auf die Sicherung oder Wiederherstellung unter Verwendung der Windows Azure-BLOB-Speicherdienste.

  • Beim Erstellen eines Containers für den Windows Azure-BLOB-Speicherdienst sollten Sie den Zugriff auf Privat festlegen. Dadurch wird der Zugriff auf Benutzer oder Konten beschränkt, die über die erforderlichen Informationen zur Authentifizierung beim Windows Azure-Konto verfügen.

    SicherheitshinweisSicherheitshinweis

    SQL Server erfordert, dass der Name und Zugriffsschlüssel zur Authentifizierung beim Windows Azure-Konto in den SQL Server-Anmeldeinformationen gespeichert werden. Mithilfe dieser Informationen wird im Fall von Sicherungs- und Wiederherstellungsvorgängen die Authentifizierung beim Windows Azure-Konto ausgeführt.

  • Das zum Ausgeben von BACKUP- oder RESTORE-Befehlen verwendete Benutzerkonto sollte Mitglied der db_backup operator-Datenbankrolle sein und über Alter any credential-Berechtigungen verfügen.

Installationsvoraussetzungen

  • SQL Server auf einem virtuellen Azure-Computer: Wenn Sie SQL Server auf dem virtuellen Windows Azure-Computer installieren, installieren Sie SQL Server 2012 SP1 CU2 oder aktualisieren die vorhandene Instanz. Informationen dazu, wie Sie das Update beim Microsoft-Kundensupport anfordern, finden Sie in diesem Artikel.

  • SQL Server lokal ausgeführt: Diese Funktion ist in SQL Server 2012, SP1 CU2 oder höheren Versionen enthalten. Informationen dazu, wie Sie das Update beim Microsoft-Kundensupport anfordern, finden Sie in diesem Artikel.

Einführung in die wichtigsten Komponenten und Konzepte

In den folgenden beiden Abschnitten werden der Windows Azure-BLOB-Speicherdienst sowie die bei der Sicherung oder Wiederherstellung unter Verwendung des Windows Azure-BLOB-Speicherdiensts verwendeten SQL Server-Komponenten eingeführt. Es ist wichtig, die jeweiligen Komponenten und Interaktionen zwischen den einzelnen Komponenten zu verstehen, um Daten mit dem Windows Azure-BLOB-Speicherdienst zu sichern oder wiederherzustellen.

Der erste Schritt besteht im Erstellen eines Windows Azure-Kontos. SQL Server verwendet den Windows Azure storage account name und die zugehörigen access key-Werte zum Authentifizieren beim Speicherdienst sowie zum Schreiben und Lesen von BLOBs. Diese Authentifizierungsinformationen werden in den SQL Server-Anmeldeinformationen gespeichert und während Sicherungs- und Wiederherstellungsvorgängen verwendet. Eine vollständige exemplarische Vorgehensweise zum Erstellen eines Speicherkontos und Ausführen einer einfachen Wiederherstellung finden Sie unter Lernprogramm: SQL Server-Sicherung und -Wiederherstellung mit dem Windows Azure-Speicherdienst.

Zuordnen des Speicherkontos zu SQL-Anmeldeinformationen

Windows Azure-BLOB-Speicherdienst

Speicherkonto: Das Speicherkonto ist der Ausgangspunkt für alle Speicherdienste. Um auf den Windows Azure-BLOB-Speicherdienst zuzugreifen, erstellen Sie zunächst ein Windows Azure-Speicherkonto. Der storage account name und die zugehörigen access key-Eigenschaften sind für die Authentifizierung beim Windows Azure-BLOB-Speicherdienst und dessen Komponenten erforderlich.

Container: In einem Container können mehrere BLOBs gruppiert und eine unbegrenzte Anzahl von BLOBs gespeichert werden. Damit eine SQL Server-Sicherung in den Windows Azure-BLOB-Dienst geschrieben werden kann, muss mindestens der Stammcontainer erstellt werden.

BLOB: Eine Datei eines beliebigen Typs und beliebiger Größe. Es gibt zwei Arten von BLOBs, die im Windows Azure-BLOB-Speicherdienst gespeichert werden können: Block- und Seitenblobs. Bei der SQL Server-Sicherung werden Seitenblobs als Blobtyp verwendet. BLOBs sind im folgenden URL-Format adressierbar: https://<Speicherkonto>.blob.core.windows. net/<Container>/<Blob>

Azure BLOB-Speicher

Weitere Informationen zum Windows Azure-BLOB-Speicherdienst finden Sie unter Verwenden des Windows Azure-BLOB-Speicherdiensts.

Weitere Informationen zu Seitenblobs finden Sie unter Grundlegendes zu Block- und Seitenblobs.

SQL Server-Komponenten

URL: Eine URL gibt einen URI (Uniform Resource Identifier) für eine eindeutige Sicherungsdatei an. Mit der URL wird der Speicherort und Name der SQL Server-Sicherungsdatei angegeben. In dieser Implementierung sind nur URLs gültig, die auf ein Seitenblob in einem Windows Azure-Speicherkonto verweisen. Die URL muss auf ein tatsächliches BLOB, nicht nur auf einen Container verweisen. Wenn das BLOB nicht vorhanden ist, wird es erstellt. Wenn ein vorhandenes BLOB angegeben wird, erzeugt BACKUP einen Fehler, sofern nicht die WITH FORMAT-Option angegeben ist.

VorsichtshinweisVorsicht

Wenn Sie eine Sicherungsdatei kopieren und in den Windows Azure-BLOB-Speicherdienst hochladen möchten, sollten Sie Seitenblobs als Speicheroption verwenden. Wiederherstellungen von Blockblobs werden nicht unterstützt. Die Ausführung von RESTORE für ein Blockblob verursacht einen Fehler.

Beispiel für eine URL: http[s]://ACCOUNTNAME.Blob.core.windows. net/<CONTAINER>/<FILENAME.bak>. HTTPS ist zwar nicht erforderlich, aber empfehlenswert.

Anmeldeinformationen: SQL Server-Anmeldeinformationen sind ein Objekt zum Speichern von Authentifizierungsinformationen, die für die Verbindung mit einer Ressource außerhalb von SQL Server erforderlich sind. Hier werden Anmeldeinformationen von SQL Server-Sicherungs- und Wiederherstellungsvorgängen verwendet, um sich beim Windows Azure-BLOB-Speicherdienst zu authentifizieren. In den Anmeldeinformationen werden der Name des Speicherkontos und der Zugriffsschlüssel des Speicherkontos gespeichert. Sobald die Anmeldeinformationen erstellt wurden, müssen sie beim Ausgeben der BACKUP-/RESTORE-Anweisungen in der WITH CREDENTIAL-Option angegeben werden. Weitere Informationen zum Anzeigen, Kopieren oder erneuten Generieren von access keys für Speicherkonten finden Sie unter Zugriffsschlüssel für Speicherkonten.

Schritt-für-Schritt-Anweisungen zum Erstellen von SQL Server-Anmeldeinformationen finden Sie im Beispiel Erstellen von Anmeldeinformationen weiter unten in diesem Thema.

Weitere allgemeine Informationen über Anmeldeinformationen finden Sie unter Anmeldeinformationen.

Informationen mit weiteren Beispielen zur Verwendung von Anmeldeinformationen finden Sie unter Erstellen eines Proxys für den SQL Server-Agent.

Einschränkungen

  • Die maximal unterstützte Größe für Sicherungen beträgt 1 TB.

  • In dieser Implementierung können Sie BACKUP- und RESTORE-Anweisungen mithilfe von TSQL oder SMO ausgeben. Eine Sicherung oder Wiederherstellung im Windows Azure-BLOB-Speicherdienst mithilfe des Sicherungs- oder Wiederherstellungs-Assistenten von SQL Server Management Studio wird derzeit nicht unterstützt.

  • Das Erstellen von Namen für logische Geräte wird nicht unterstützt. Folglich ist es nicht möglich, eine URL mithilfe von sp_dumpdevice oder über SQL Server Management Studio als Sicherungsmedium hinzuzufügen.

  • Das Anfügen an vorhandene Sicherungs-BLOBs wird nicht unterstützt. Sicherungen auf einem vorhandenen BLOB können nur unter Verwendung der WITH FORMAT-Option überschrieben werden.

  • Sicherungen auf mehreren BLOBS in einem einzelnen Sicherungsvorgang werden nicht unterstützt. So gibt der folgende Code z. B. einen Fehler zurück:

    BACKUP DATABASE AdventureWorks2012 
    TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_1.bak' 
       URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_2.bak' 
          WITH CREDENTIAL = 'mycredential' 
         ,STATS = 5;
    GO 
    
  • Das Angeben einer Blockgröße mit BACKUP wird nicht unterstützt.

  • Das Angeben von MAXTRANSFERSIZE wird nicht unterstützt.

  • Das Angeben von Optionen für Sicherungssätze, wie RETAINDAYS und EXPIREDATE, wird nicht unterstützt.

  • Namen für Sicherungsmedien sind in SQL Server auf 259 Zeichen begrenzt. Da BACKUP TO URL 36 Zeichen für die erforderlichen Elemente zu Angabe der URL "https://.blob.core.windows. net//.bak" beansprucht, verbleiben insgesamt noch 223 Zeichen für Konto-, Container- und BLOB-Namen.

Unterstützung für BACKUP-/RESTORE-Anweisungen

BACKUP-/RESTORE-Anweisung

Unterstützt

Ausnahmen

Kommentare

BACKUP

BLOCKSIZE und MAXTRANSFERSIZE werden nicht unterstützt.

WITH CREDENTIAL muss angegeben werden

RESTORE

WITH CREDENTIAL muss angegeben werden

RESTORE FILELISTONLY

WITH CREDENTIAL muss angegeben werden

RESTORE HEADERONLY

WITH CREDENTIAL muss angegeben werden

RESTORE LABELONLY

WITH CREDENTIAL muss angegeben werden

RESTORE VERIFYONLY

WITH CREDENTIAL muss angegeben werden

RESTORE REWINDONLY

Allgemeine und Syntaxinformationen zu BACKUP-Anweisungen finden Sie unter BACKUP (Transact-SQL).

Allgemeine und Syntaxinformationen zu RESTORE-Anweisungen finden Sie unter RESTORE (Transact-SQL).

Unterstützung für BACKUP-Argumente

Argument

Unterstützt

Ausnahme

Kommentare

DATABASE

LOG

TO (URL)

Bei URL wird das Angeben bzw. Erstellen eines logischen Namens im Gegensatz zu DISK und TAPE nicht unterstützt.

Dieses Argument wird verwendet, um den URL-Pfad der Sicherungsdatei anzugeben.

MIRROR TO

WITH OPTIONS:

CREDENTIAL

WITH CREDENTIAL wird nur unterstützt, wenn Daten mit der BACKUP TO URL-Option im Windows Azure-BLOB-Speicherdienst gesichert werden.

DIFFERENTIAL

COPY_ONLY

COMPRESSION|NO_COMPRESSION

DESCRIPTION

NAME

EXPIREDATE | RETAINDAYS

NOINIT | INIT

Wenn diese Option verwendet wird, wird sie ignoriert.

Das Anfügen an BLOBs ist nicht möglich. Verwenden Sie zum Überschreiben einer Sicherung das FORMAT-Argument.

NOSKIP | SKIP

NOFORMAT | FORMAT

Wenn diese Option verwendet wird, wird sie ignoriert.

Eine Sicherung, die auf ein vorhandenes BLOB geschrieben wird, ist nur erfolgreich, wenn WITH FORMAT angegeben wird. Das vorhandene BLOB wird bei Angabe von WITH FORMAT überschrieben.

MEDIADESCRIPTION

MEDIANAME

BLOCKSIZE

BUFFERCOUNT

MAXTRANSFERSIZE

NO_CHECKSUM | CHECKSUM

STOP_ON_ERROR | CONTINUE_AFTER_ERROR

STATS

REWIND | NOREWIND

UNLOAD | NOUNLOAD

NORECOVERY | STANDBY

NO_TRUNCATE

Weitere Informationen zu BACKUP-Argumenten finden Sie unter BACKUP (Transact-SQL).

Unterstützung für RESTORE-Argumente

Argument

Unterstützt

Ausnahmen

Kommentare

DATABASE

LOG

FROM (URL)

Das FROM URL-Argument wird verwendet, um den URL-Pfad der Sicherungsdatei anzugeben.

WITH-Optionen:

CREDENTIAL

WITH CREDENTIAL wird nur unterstützt, wenn Daten mit der RESTORE FROM URL-Option vom Windows Azure-BLOB-Speicherdienst wiederhergestellt werden.

PARTIAL

RECOVERY | NORECOVERY | STANDBY

LOADHISTORY

MOVE

REPLACE

RESTART

RESTRICTED_USER

FILE

PASSWORD

MEDIANAME

MEDIAPASSWORD

BLOCKSIZE

BUFFERCOUNT

MAXTRANSFERSIZE

CHECKSUM | NO_CHECKSUM

STOP_ON_ERROR | CONTINUE_AFTER_ERROR

FILESTREAM

STATS

REWIND | NOREWIND

UNLOAD | NOUNLOAD

KEEP_REPLICATION

KEEP_CDC

ENABLE_BROKER | ERROR_BROKER_CONVERSATIONS | NEW_BROKER

STOPAT | STOPATMARK | STOPBEFOREMARK

Weitere Informationen zu RESTORE-Argumenten finden Sie unter RESTORE-Argumente (Transact-SQL).

Beispiele

Dieser Abschnitt enthält die folgenden Beispiele.

  • Erstellen von Anmeldeinformationen

  • Sichern einer vollständigen Datenbank

  • Sichern der Datenbank und des Protokolls

  • Erstellen einer vollständigen Dateisicherung der primären Dateigruppe

  • Erstellen einer differenziellen Dateisicherung der primären Dateigruppen

  • Wiederherstellen einer Datenbank und Verschieben von Dateien

  • Wiederherstellen eines bestimmten Zeitpunkts mithilfe von STOPAT

Erstellen von Anmeldeinformationen

Im folgenden Beispiel werden Anmeldeinformationen erstellt, in denen die Authentifizierungsinformationen für den Windows Azure-Speicher gespeichert werden.

  1. TSQL

    IF NOT EXISTS
    (SELECT * FROM sys.credentials 
    WHERE credential_identity = 'mycredential')
    CREATE CREDENTIAL mycredential WITH IDENTITY = 'mystorageaccount'
    ,SECRET = '<storage access key>' ;
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    string secret = "<storage access key>";
    
    // Create a Credential
    string credentialName = "mycredential";
    Credential credential = new Credential(server, credentialName);
    credential.Create(identity, secret);
    
  3. PowerShell

    # create variables
    $storageAccount = "mystorageaccount"
    $storageKey = "<storage access key>"
    $secureString = convertto-securestring $storageKey  -asplaintext -force
    $credentialName = "mycredential"
    
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # Create a credential
     New-SqlCredential -Name $credentialName -Path $srvpath -Identity $storageAccount -Secret $secureString
    

Sichern einer vollständigen Datenbank

Im folgenden Beispiel wird die AdventureWorks2012-Datenbank im Windows Azure-BLOB-Speicherdienst gesichert.

  1. TSQL

    BACKUP DATABASE AdventureWorks2012 
    TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak' 
          WITH CREDENTIAL = 'mycredential' 
         ,COMPRESSION
         ,STATS = 5;
    GO 
    
  1. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  2. PowerShell

    # create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME" 
    # for default instance, the $srvpath varilable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance
    CD $srvPath 
    $backupFile = $backupUrlContainer + "AdventureWorks2012" +  ".bak"
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On   
    

Sichern der Datenbank und des Protokolls

Im folgenden Beispiel wird die AdventureWorks2012-Beispieldatenbank gesichert, in der standardmäßig das einfache Wiederherstellungsmodell verwendet wird. Zur Unterstützung von Protokollsicherungen wird die AdventureWorks2012-Datenbank für die Verwendung des vollständigen Wiederherstellungsmodells geändert. Im Beispiel wird eine vollständige Datenbanksicherung im Windows-Azure-BLOB erstellt. Nach einer Reihe von Aktualisierungen wird das Protokoll gesichert. In diesem Beispiel wird für eine Sicherungsdatei ein Name mit einem Datums-/Zeitstempel erstellt.

  1. TSQL

    -- To permit log backups, before the full database backup, modify the database 
    -- to use the full recovery model.
    USE master;
    GO
    ALTER DATABASE AdventureWorks2012
       SET RECOVERY FULL;
    GO
    
    
    -- Back up the full AdventureWorks2012 database.
           -- First create a file name for the backup file with DateTime stamp
    
    DECLARE @Full_Filename AS VARCHAR (300);
    SET @Full_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Full_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.bak'; 
    --Back up Adventureworks2012 database
    
    BACKUP DATABASE AdventureWorks2012
    TO URL =  @Full_Filename
    WITH CREDENTIAL = 'mycredential';
    ,COMPRESSION
    GO
    -- Back up the AdventureWorks2012 log.
    DECLARE @Log_Filename AS VARCHAR (300);
    SET @Log_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Log_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.trn';
    BACKUP LOG AdventureWorks2012
     TO URL = @Log_Filename
    WITH CREDENTIAL = 'mycredential'
    ,COMPRESSION;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    
    // Generate Unique Url for data backup
    string urlDataBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}_Data-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup Database to Url
    Backup backupData = new Backup();
    backupData.CredentialName = credentialName;
    backupData.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backupData.Devices.AddDevice(urlDataBackup, DeviceType.Url);
    backupData.SqlBackup(server);
    
    // Generate Unique Url for data backup
    string urlLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}_Log-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup Database Log to Url
    Backup backupLog = new Backup();
    backupLog.CredentialName = credentialName;
    backupLog.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backupLog.Devices.AddDevice(urlLogBackup, DeviceType.Url);
    backupLog.Action = BackupActionType.Log;
    backupLog.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to theSQL Server Instance
    
    CD $srvPath 
    #Create a unique file name for the full database backup
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    #Backup Database to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Database  
    
    #Create a unique file name for log backup
    
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup Log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Log  
    

Erstellen einer vollständigen Dateisicherung der primären Dateigruppe

Im folgenden Beispiel wird eine vollständige Dateisicherung der primären Dateigruppe erstellt.

  1. TSQL

    --Back up the files in Primary:
    BACKUP DATABASE AdventureWorks2012
       FILEGROUP = 'Primary'
       TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012files.bck'
       WITH CREDENTIAL = 'mycredential'
       ,COMPRESSION;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bck",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Action = BackupActionType.Files;
    backup.DatabaseFileGroups.Add("PRIMARY");
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to the SQL Server Instance
    
    CD $srvPath 
    #Create a unique file name for the file backup
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bck"
    
    #Backup Primary File Group to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Files -DatabaseFileGroup Primary  
    

Erstellen einer differenziellen Dateisicherung der primären Dateigruppe

Im folgenden Beispiel wird eine differenzielle Dateisicherung der primären Dateigruppe erstellt.

  1. TSQL

    --Back up the files in Primary:
    BACKUP DATABASE AdventureWorks2012
       FILEGROUP = 'Primary'
       TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012filesdiff.bck'
       WITH 
          CREDENTIAL = 'mycredential'
          ,COMPRESSION
      ,DIFFERENTIAL;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Action = BackupActionType.Files;
    backup.DatabaseFileGroups.Add("PRIMARY");
    backup.Incremental = true;
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    #Create a differential backup of the primary filegroup
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Files -DatabaseFileGroup Primary -Incremental  
    

Wiederherstellen einer Datenbank und Verschieben von Dateien

Zum Wiederherstellen einer vollständigen Datenbanksicherung und Verschieben der wiederhergestellten Datenbank in das Verzeichnis C:\Programme\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data führen Sie die folgenden Schritte aus.

  1. TSQL

    -- Backup the tail of the log first
    
    DECLARE @Log_Filename AS VARCHAR (300);
    SET @Log_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Log_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.trn';
    BACKUP LOG AdventureWorks2012
     TO URL = @Log_Filename
    WITH CREDENTIAL = 'mycredential'
    ,NORECOVERY;
    GO
    
    RESTORE DATABASE AdventureWorks2012 FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
    WITH CREDENTIAL = 'mycredential'
    ,MOVE 'AdventureWorks2012_data' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf'
    ,MOVE 'AdventureWorks2012_log' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf'
          ,STATS = 5 
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string urlBackupData = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-Data{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Devices.AddDevice(urlBackupData, DeviceType.Url);
    backup.SqlBackup(server);
    
    // Generate Unique Url for tail log backup
    string urlTailLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-TailLog{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup Tail Log to Url
    Backup backupTailLog = new Backup();
    backupTailLog.CredentialName = credentialName;
    backupTailLog.Database = dbName;
    backupTailLog.Action = BackupActionType.Log;
    backupTailLog.NoRecovery = true;
    backupTailLog.Devices.AddDevice(urlTailLogBackup, DeviceType.Url);
    backupTailLog.SqlBackup(server);
    
    // Restore a database and move files
    string newDataFilePath = server.MasterDBLogPath  + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".mdf";
    string newLogFilePath = server.MasterDBLogPath  + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".ldf";
    
    Restore restore = new Restore();
    restore.CredentialName = credentialName;
    restore.Database = dbName;
    restore.ReplaceDatabase = true;
    restore.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restore.RelocateFiles.Add(new RelocateFile(dbName, newDataFilePath));
    restore.RelocateFiles.Add(new RelocateFile(dbName+ "_Log", newLogFilePath));
    restore.SqlRestore(server); 
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTNACENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance 
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    # Full database backup to URL
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupdbFile  -SqlCredential $credentialName -CompressionOption On    
    
    #Create a unique file name for the tail log backup
    $backuplogFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup tail log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName  -BackupAction Log -NoRecovery  
    
    # Restore Database and move files
    
    $newDataFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile ("AdventureWorks_Data","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf")
    $newLogFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("AdventureWorks_Log","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf")
    
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backupdbFile -RelocateFile @($newDataFilePath,$newLogFilePath)  
    

Wiederherstellen eines bestimmten Zeitpunkts mithilfe von STOPAT

Im folgenden Beispiel wird der Zustand einer Datenbank zu einem bestimmten Zeitpunkt wiederhergestellt und ein Wiederherstellungsvorgang veranschaulicht.

  1. TSQL

    RESTORE DATABASE AdventureWorks FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak' 
    WITH 
     CREDENTIAL = 'mycredential'
    ,MOVE 'AdventureWorks2012_data' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf'
    ,Move 'AdventureWorks2012_log' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf'
    ,NORECOVERY
    --,REPLACE
    ,STATS = 5;
    GO 
    
    RESTORE LOG AdventureWorks FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.trn' 
    WITH CREDENTIAL = 'mycredential'
    ,RECOVERY 
    ,STOPAT = 'Oct 23, 2012 5:00 PM' 
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string urlBackupData = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-Data{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Devices.AddDevice(urlBackupData, DeviceType.Url);
    backup.SqlBackup(server);
    
    // Generate Unique Url for Tail Log backup
    string urlTailLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-TailLog{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup Tail Log to Url
    Backup backupTailLog = new Backup();
    backupTailLog.CredentialName = credentialName;
    backupTailLog.Database = dbName;
    backupTailLog.Action = BackupActionType.Log;
    backupTailLog.NoRecovery = true;
    backupTailLog.Devices.AddDevice(urlTailLogBackup, DeviceType.Url);
    backupTailLog.SqlBackup(server);
    
    // Restore a database and move files
    string newDataFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".mdf";
    string newLogFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".ldf";
    
    Restore restore = new Restore();
    restore.CredentialName = credentialName;
    restore.Database = dbName;
    restore.ReplaceDatabase = true;
    restore.NoRecovery = true;
    restore.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restore.RelocateFiles.Add(new RelocateFile(dbName, newDataFilePath));
    restore.RelocateFiles.Add(new RelocateFile(dbName + "_Log", newLogFilePath));
    restore.SqlRestore(server);
    
    // Restore transaction Log with stop at 
    Restore restoreLog = new Restore();
    restoreLog.CredentialName = credentialName;
    restoreLog.Database = dbName;
    restoreLog.Action = RestoreActionType.Log;
    restoreLog.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restoreLog.ToPointInTime = DateTime.Now.ToString(); 
    restoreLog.SqlRestore(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # Navigate to SQL Server Instance Directory
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    # Full database backup to URL
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupdbFile  -SqlCredential $credentialName -CompressionOption On   
    
    #Create a unique file name for the tail log backup
    $backuplogFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup tail log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName  -BackupAction Log -NoRecovery   
    
    # Restore Database and move files
    
    $newDataFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile ("AdventureWorks_Data","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf")
    $newLogFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("AdventureWorks_Log","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf")
    
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backupdbFile -RelocateFile @($newDataFilePath,$newLogFilePath) -NoRecovery  
    
    # Restore Transaction log with Stop At:
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backuplogFile  -ToPointInTime (Get-Date).ToString()