Backup e ripristino di SQL Server con il servizio di archiviazione BLOB di Windows Azure

In questo argomento sono illustrati concetti, considerazioni e codici di esempio essenziali per la configurazione, la scrittura di backup di SQL Server nel servizio di archiviazione BLOB di Windows Azure e il ripristino dallo stesso. È inoltre disponibile un riepilogo dei vantaggi dell'utilizzo del servizio BLOB di Windows Azure per archiviare i backup di SQL Server.

Questa funzionalità, introdotta in SQL Server 2012 SP1 CU2, consente il backup e ripristino di SQL Server direttamente nel servizio BLOB di Windows Azure. Questa funzionalità può essere utilizzata per eseguire il backup dei database di SQL Server in un'istanza locale o in una di SQL Server in cui viene eseguito un ambiente ospitato, ad esempio la macchina virtuale di Windows Azure. L'esecuzione del backup nel cloud garantisce vantaggi quali disponibilità, archiviazione illimitata in una posizione esterna replicata a livello geografico e facilità di migrazione dei dati nel cloud. In questa versione è possibile eseguire le istruzioni BACKUP o RESTORE tramite tsql o SMO. L'esecuzione del backup nel servizio di archiviazione BLOB di Windows Azure o del ripristino dallo stesso tramite il Backup o ripristino guidato di SQL Server Management Studio non è disponibile in questa versione.

Nell'aggiornamento cumulativo 4 di SQL Server 2012 SP, è possibile eseguire backup e ripristini dal servizio di archiviazione BLOB di Windows Azure utilizzando PowerShell. Per richiedere questo aggiornamento, vedere questo articolo della Knowledge Base. In questo argomento sono inclusi gli script di PowerShell nella sezione di esempio. Per gli script di PowerShell di esempio per gestire più backup, vedere Use PowerShell to Backup Multiple Databases to Windows Azure Blob Storage Service.

Vantaggi dell'utilizzo del servizio BLOB di Windows Azure per i backup di SQL Server

  • Archiviazione flessibile, affidabile e illimitata in una posizione esterna: l'archiviazione dei backup nel servizio BLOB di Windows Azure può essere una soluzione esterna utile, flessibile e di facile accesso. La creazione dell'archiviazione in una posizione esterna per i backup di SQL Server può essere semplice quanto la modifica degli script o dei processi esistenti. Generalmente, l'archiviazione in una posizione esterna deve essere sufficientemente lontana dalla posizione del database di produzione per impedire che una singola situazione di emergenza possa influire sia sulla posizione esterna sia su quella del database di produzione. Scegliendo la replica a livello geografico dell'archiviazione BLOB si dispone di un ulteriore livello di protezione in caso di evento di emergenza che potrebbe influire sull'intera area. Inoltre, i backup sono disponibili sempre e in qualsiasi punto e possono essere facilmente utilizzati per i ripristini.

  • Archivio di backup: il servizio di archiviazione BLOB di Windows Azure offre un'alternativa migliore rispetto al più comune utilizzo della soluzione su nastro adottata per archiviare i backup. Per l'archiviazione su nastro potrebbero essere necessari il trasporto fisico in una struttura esterna e misure di protezione dei supporti. L'archiviazione dei backup nell'apposito servizio BLOB di Windows Azure garantisce una soluzione di archiviazione immediata, a elevata disponibilità e durevole.

  • Nessun overhead di gestione dell'hardware: non è previsto alcun problema di questo tipo con i servizi Windows Azure. Tramite i servizi Windows Azure viene gestito l'hardware e viene fornita una replica a livello geografico per garantire ridondanza e protezione da eventuali errori dell'hardware.

  • Attualmente, per le istanze di SQL Server in esecuzione in una macchina virtuale di Windows Azure, il backup nei servizi di archiviazione BLOB di Windows Azure può essere effettuato creando dischi collegati. Tuttavia, esiste un limite al numero di dischi che è possibile collegare a una macchina virtuale di Windows Azure, vale a dire 16 per un'istanza di dimensioni elevate e un po' di meno per istanze di dimensioni inferiori. Abilitando un backup diretto nell'archiviazione BLOB di Windows Azure è possibile evitare il limite di 16 dischi.

    Inoltre, il file di backup che è attualmente archiviato nel servizio di archiviazione BLOB di Windows Azure è direttamente disponibile in un'istanza di SQL Server locale o in un'altra di SQL Server in esecuzione in una macchina virtuale di Windows Azure, senza dover collegare/scollegare il database o scaricare e collegare il disco rigido virtuale.

  • Vantaggi economici: si paga solo il servizio utilizzato. Questo servizio può essere efficace dal punto di vista economico come soluzione di archiviazione esterna e di backup. Per ulteriori informazioni e per i collegamenti, vedere la sezione Considerazioni sui costi di Windows Azure.

Considerazioni sui costi di Windows Azure:

Conoscendo i costi correlati all'archiviazione di Windows Azure è possibile prevedere il costo della creazione e dell'archiviazione dei backup in Windows Azure. 

Per stimare i costi è possibile utilizzare il calcolatore dei costi di Windows Azure.

Archiviazione: i costi dipendono dallo spazio utilizzato e vengono calcolati in base a una scala graduata e al livello di ridondanza. Per ulteriori dettagli e informazioni aggiornate, vedere la sezione Gestione dati dell'articolo Dettagli prezzi.

Trasferimenti di dati: i trasferimenti in entrata dei dati in Windows Azure sono gratuiti. Per i trasferimenti in uscita viene addebitato il costo relativo all'utilizzo della larghezza di banda e il calcolo viene effettuato in base a una scala graduata specifica per l'area. Per ulteriori informazioni, vedere la sezione Trasferimenti di dati nell'articolo Dettagli prezzi.

Requisiti, componenti e concetti

Contenuto della sezione:

  • Sicurezza

  • Introduzione ai componenti e ai concetti chiave

  • Servizio di archiviazione BLOB di Windows Azure

  • Componenti di SQL Server

  • Limitazioni

  • Supporto per le istruzioni di backup/ripristino

Sicurezza

Di seguito sono riportati requisiti e considerazioni sulla sicurezza a cui attenersi per l'esecuzione del backup nei servizi di archiviazione BLOB di Windows Azure o del ripristino da questi servizi.

  • Quando si crea un contenitore per il servizio di archiviazione BLOB di Windows Azure, è consigliabile impostare l'accesso su privato. In questo modo si limita l'accesso agli utenti o account in grado di fornire le informazioni necessarie per l'autenticazione per l'account di Windows Azure.

    Nota sulla sicurezzaNota sulla sicurezza

    In SQL Server viene richiesto che il nome dell'account di Windows Azure e l'autenticazione della chiave di accesso siano archiviati nelle credenziali di SQL Server. Queste informazioni vengono utilizzate per eseguire l'autenticazione per l'account di Windows Azure in caso di esecuzione di operazioni di backup o ripristino.

  • All'account utente utilizzato per eseguire i comandi BACKUP o RESTORE deve essere associato il ruolo del database db_backup operator con autorizzazioni Alter any credential.

Prerequisiti di installazione

  • SQL Server in esecuzione in una macchina virtuale di Azure: se si installa SQL Server nella macchina virtuale di Windows Azure, installare SQL Server 2012 SP1 CU2 o aggiornare l'istanza esistente. Per richiedere l'aggiornamento al Supporto Tecnico Clienti Microsoft, vedere questo articolo.

  • Istanza locale di SQL Server: questa funzionalità è inclusa in SQL Server 2012, SP1 CU2 o versioni successive. Per richiedere l'aggiornamento al Supporto Tecnico Clienti Microsoft, vedere questo articolo.

Introduzione ai componenti e ai concetti chiave

Nelle due sezioni seguenti vengono illustrati il servizio di archiviazione BLOB di Windows Azure e i componenti di SQL Server utilizzati durante l'esecuzione del backup nel servizio di archiviazione BLOB di Windows Azure o del ripristino dallo stesso. È importante comprendere i componenti e la relativa interazione per eseguire il backup nel servizio di archiviazione BLOB di Windows Azure o il ripristino dallo stesso.

La creazione di un account di Windows Azure è il primo passaggio di questo processo. In SQL Server vengono utilizzati Windows Azure storage account name e i relativi valori access key per autenticare, scrivere e leggere BLOB nel servizio di archiviazione. Le credenziali di SQL Server, tramite cui vengono archiviate queste informazioni di autenticazione, vengono utilizzate durante le operazioni di backup o ripristino. Per una procedura dettagliata completa della creazione di un account di archiviazione e dell'esecuzione di un ripristino semplice, vedere la pagina relativa all'esercitazione per l'utilizzo del servizio di archiviazione di Windows Azure per il backup e il ripristino di SQL Server.

mapping dell'account di archiviazione alle credenziali SQL

Servizio di archiviazione BLOB di Windows Azure

Account di archiviazione: questo account è il punto di partenza per tutti i servizi di archiviazione. Per accedere al servizio di archiviazione BLOB di Windows Azure, creare innanzitutto un account di archiviazione di Windows Azure. storage account name e le relative proprietà access key sono necessari per eseguire l'autenticazione per il servizio di archiviazione BLOB di Windows Azure e i relativi componenti.

Contenitore: tramite un contenitore viene fornito un raggruppamento di un set di BLOB ed è possibile archiviare un numero illimitato di BLOB. Per scrivere un backup di SQL Server nel servizio BLOB di Windows Azure, è necessario aver creato almeno il contenitore radice.

BLOB: file di qualsiasi tipo e dimensioni. Esistono due tipi di BLOB che è possibile archiviare nel servizio di archiviazione BLOB di Windows Azure: BLOB in blocchi e di pagine. Nel backup di SQL Server, come tipo di BLOB, vengono utilizzati quelli di pagine. I BLOB sono indirizzabili utilizzando il formato URL seguente: https://<account di archiviazione>.blob.core.windows. net/<contenitore>/<blob>

Archiviazione BLOB Azure

Per ulteriori informazioni sul servizio di archiviazione BLOB di Windows Azure, vedere la pagina relativa alla modalità di utilizzo del servizio di archiviazione BLOB di Windows Azure

Per ulteriori informazioni sui BLOB di pagine, vedere la pagina relativa alle informazioni sui BLOB in blocchi e di pagine

Componenti di SQL Server

URL: tramite un URL viene specificato un URI (Uniform Resource Identifier) in un file di backup univoco. L'URL viene utilizzato per specificare il percorso e il nome del file di backup di SQL Server. In questa implementazione, l'unico URL valido è quello che punta a un BLOB di pagine di un account di archiviazione di Windows Azure. L'URL deve puntare a un BLOB effettivo, non solo a un contenitore. Se il BLOB non è disponibile, viene creato. Se viene specificato un BLOB esistente, l'operazione di backup non viene completata, a meno che non sia stata specificata l'opzione "WITH FORMAT".

Nota di attenzioneAttenzione

Se si sceglie di copiare e caricare un file di backup nel servizio di archiviazione BLOB di Windows Azure, utilizzare i BLOB di pagine come opzione di archiviazione. I ripristini dai BLOB in blocchi non sono supportati. Il ripristino da un BLOB in blocchi non viene completato e viene visualizzato un errore.

Di seguito è riportato un valore URL di esempio: http[s]://NOMEACCOUNT.Blob.core.windows. net/<CONTENITORE>/<NOMEFILE.bak>. Anche se non richiesto, è consigliabile utilizzare HTTPS.

Credenziale: una credenziale di SQL Server è un oggetto utilizzato per archiviare le informazioni di autenticazione necessarie per connettersi a una risorsa all'esterno di SQL Server. In questo caso, nei processi di backup e ripristino di SQL Server le credenziali vengono utilizzate per l'autenticazione per il servizio di archiviazione BLOB di Windows Azure. Nelle credenziali vengono archiviati il nome dell'account di archiviazione e i relativi valori della chiave di accesso. Una volta create, le credenziali devono essere specificate nell'opzione WITH CREDENTIAL durante l'esecuzione delle istruzioni BACKUP/RESTORE. Per ulteriori informazioni sulla modalità di visualizzazione, copia o rigenerazione dell'account di archiviazione access keys, vedere la pagina relativa alle chiavi di accesso dell'account di archiviazione.

Per istruzioni dettagliate sulla creazione di credenziali di SQL Server, vedere l'esempio Creare credenziali più avanti in questo argomento.

Per informazioni generali sulle credenziali, vedere la pagina relativa alle credenziali

Per informazioni o altri esempi in cui vengono utilizzate le credenziali, vedere Creazione di un proxy di SQL Server Agent.

Limitazioni

  • Le dimensioni massime di backup supportate sono 1 TB.

  • In questa implementazione è possibile eseguire istruzioni di backup o ripristino tramite TSQL o SMO. L'esecuzione di un backup nel servizio di archiviazione BLOB di Windows Azure o di un ripristino dallo stesso tramite il Backup o ripristino guidato di SQL Server Management Studio non è attualmente abilitata.

  • La creazione di un nome di dispositivo logico non è supportata. Di conseguenza, non è supportata neanche l'aggiunta di un URL come dispositivo di backup tramite sp_dumpdevice o SQL Server Management Studio.

  • L'accodamento ai BLOB di backup esistenti non è supportato. I backup in un BLOB esistente possono essere sovrascritti solo tramite l'opzione WITH FORMAT.

  • Il backup in più BLOB effettuato con una singola operazione non è supportato. Ad esempio, se si esegue l'operazione riportata di seguito viene restituito un errore:

    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 
    
  • La specifica delle dimensioni del blocco con BACKUP non è supportata.

  • La specifica di MAXTRANSFERSIZE non è supportata.

  • La specifica delle opzioni del set di backup, RETAINDAYS e EXPIREDATE, non è supportata.

  • In SQL Server è previsto un limite massimo di 259 caratteri per il nome di un dispositivo di backup. Per BACKUP TO URL vengono utilizzati 36 caratteri per gli elementi necessari utilizzati per specificare l'URL: "https://.blob.core.windows. net//.bak", lasciando 223 caratteri in tutto per l'account, il contenitore e i nomi BLOB.

Supporto per le istruzioni di backup/ripristino

Istruzione di backup/ripristino

Supportata

Eccezioni

Commenti

BACKUP

BLOCKSIZE e MAXTRANSFERSIZE non sono supportate.

Richiede la specifica di WITH CREDENTIAL

RESTORE

Richiede la specifica di WITH CREDENTIAL

RESTORE FILELISTONLY

Richiede la specifica di WITH CREDENTIAL

RESTORE HEADERONLY

Richiede la specifica di WITH CREDENTIAL

RESTORE LABELONLY

Richiede la specifica di WITH CREDENTIAL

RESTORE VERIFYONLY

Richiede la specifica di WITH CREDENTIAL

RESTORE REWINDONLY

Per dettagli sulla sintassi e informazioni generali sulle istruzioni di backup, vedere BACKUP (Transact-SQL).

Per dettagli sulla sintassi e informazioni generali sulle istruzioni di ripristino, vedere RESTORE (Transact-SQL).

Supporto per gli argomenti dell'istruzione BACKUP

Argomento

Supportato

Eccezione

Commenti

DATABASE

LOG

TO (URL)

Diversamente da DISK e TAPE, l'URL non supporta la specifica o la creazione di un nome logico.

Questo argomento viene utilizzato per specificare il percorso URL del file di backup.

MIRROR TO

Opzioni WITH:

CREDENTIAL

WITH CREDENTIAL è supportato solo quando si utilizza l'opzione BACKUP TO URL per eseguire il backup nel servizio di archiviazione BLOB di Windows Azure.

DIFFERENTIAL

COPY_ONLY

COMPRESSION|NO_COMPRESSION

DESCRIPTION

NAME

EXPIREDATE | RETAINDAYS

NOINIT | INIT

Se utilizzata, questa opzione è ignorata.

L'accodamento ai BLOB non è consentito. Per sovrascrivere un backup, utilizzare l'argomento FORMAT.

NOSKIP | SKIP

NOFORMAT | FORMAT

Se utilizzata, questa opzione è ignorata.

Un backup eseguito in un BLOB esistente non viene completato a meno che non venga specificato WITH FORMAT. Il BLOB esistente viene sovrascritto quando viene specificato WITH FORMAT.

MEDIADESCRIPTION

MEDIANAME

BLOCKSIZE

BUFFERCOUNT

MAXTRANSFERSIZE

NO_CHECKSUM | CHECKSUM

STOP_ON_ERROR | CONTINUE_AFTER_ERROR

STATS

REWIND | NOREWIND

UNLOAD | NOUNLOAD

NORECOVERY | STANDBY

NO_TRUNCATE

Per ulteriori informazioni sugli argomenti di backup, vedere BACKUP (Transact-SQL).

Supporto per gli argomenti dell'istruzione RESTORE

Argomento

Supportato

Eccezioni

Commenti

DATABASE

LOG

FROM (URL)

L'argomento FROM URL viene utilizzato per specificare il percorso URL del file di backup.

Opzioni WITH:

CREDENTIAL

WITH CREDENTIAL è supportato solo quando si utilizza l'opzione RESTORE FROM URL per eseguire il ripristino dal servizio di archiviazione BLOB di Windows Azure.

PARTIAL

RECOVERY | NORECOVERY | STANDBY

LOADHISTORY

MOVE

SOSTITUISCI

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

Per ulteriori informazioni sugli argomenti di ripristino, vedere Argomenti dell'istruzione RESTORE (Transact-SQL).

Esempi

In questa sezione sono disponibili gli esempi riportati di seguito.

  • Creazione di credenziali

  • Backup di un database completo

  • Backup del database e del log

  • Creazione di un backup di file completo del filegroup primario

  • Creazione di un backup di file differenziale dei filegroup primari

  • Ripristino di un database e spostamento dei file

  • Ripristino temporizzato tramite STOPAT

Creazione di credenziali

Nell'esempio seguente vengono create credenziali tramite cui vengono archiviate le informazioni sull'autenticazione dell'archiviazione di Windows Azure.

  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
    

Backup di un database completo

Nell'esempio riportato di seguito viene eseguito il backup del database AdventureWorks2012 nel servizio di archiviazione BLOB di Windows Azure.

  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   
    

Backup del database e del log

Nell'esempio riportato di seguito viene eseguito il backup del database di esempio AdventureWorks2012 per il quale viene utilizzato, per impostazione predefinita, il modello di recupero con registrazione minima. Per consentire il backup del log, il database AdventureWorks2012 viene modificato per l'utilizzo del modello di recupero con registrazione completa. Nell'esempio viene quindi creato un backup completo del database nel BLOB di Windows Azure e, dopo un periodo dedicato alle attività di aggiornamento, viene eseguito il backup del log. In questo esempio viene creato il nome di un file di backup con un indicatore datetime.

  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  
    

Creazione di un backup di file completo del filegroup primario

Nell'esempio seguente viene creato un backup di file completo del filegroup primario.

  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  
    

Creazione di un backup di file differenziale del filegroup primario

Nell'esempio seguente viene creato un backup di file differenziale del filegroup primario.

  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  
    

Ripristinare un database e spostare i file

Per ripristinare un backup completo del database e spostare il database ripristinato nella directory C:\Programmi\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data, attenersi ai passaggi riportati di seguito.

  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)  
    

Ripristino temporizzato tramite STOPAT

Nell'esempio seguente viene ripristinato lo stato di un database in un momento preciso e viene illustrata un'operazione di ripristino.

  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()