Database
 sql >> Database >  >> RDS >> Database

Backup e ripristino del database abilitato per FILESTREAM

Nei miei articoli precedenti, ho spiegato come creare e configurare la funzionalità FILESTREAM nell'istanza del server SQL. Inoltre, ho dimostrato come creare una tabella che ha una colonna FILESTREAM e calda per inserire ed eliminare i dati da essa.

In questo articolo, spiegherò come eseguire il backup e il ripristino del database abilitato per FILESTREAM. Inoltre, dimostrerò come ripristinare il filegroup FILESTREAM senza rendere il database offline.

Come spiegato nei miei articoli precedenti, quando abilitiamo FILESTREAM sull'istanza di SQL Server, è necessario creare un contenitore FILESTREAM con il filegroup FILESTREAM. Quando eseguiamo il backup del database abilitato per FILESTREAM, il backup del filegroup FILESTREAM verrà incluso nel set di backup. Quando ripristiniamo il database, SQL Server ripristinerà il database e il contenitore FILESTREAM e i file al suo interno.

Quando eseguiamo il backup di un database abilitato per FILESTREAM, esso:

  • Esegui il backup di tutti i file di dati disponibili del database.
  • Esegui il backup del filegroup FILESTREAM e dei file al suo interno.
  • Backup T-Log.

SQL Server offre la flessibilità di eseguire il backup solo del contenitore FILESTREAM. Se i file all'interno del contenitore FILESTREAM vengono danneggiati, non è necessario ripristinare l'intero database. Possiamo ripristinare solo il filegroup FILESTREAM.

In questa demo, ho intenzione di:

  • Spiega come eseguire un backup completo del database FS ed eseguire il backup solo del contenitore FILESTREAM.
  • Spiega come ripristinare il database abilitato per FILESTREAM.
  • Come ripristinare il contenitore FILESTREAM online e offline. Nota:SQL Server Enterprise Edition e Developer Edition supportano il ripristino ONLINE.

Impostazione demo:

In questa demo userò:

  1. Banca dati :SQL Server 2017
  2. Software :Studio di gestione di SQL Server.

Backup del database abilitato per FILESTREAM

Per dimostrare il processo di backup, ho creato un database abilitato per FILESTREAM denominato FileStream_Demo . Ha una tabella FILESTREAM denominata Document_Content .

Backup completo del database

Il backup di un database abilitato per FILESTREAM è un processo semplice. Per generarne un backup completo, eseguire il seguente script T-SQL.

BACKUP DATABASE [FileStream_Demo] TO  DISK = N'E:\Backups\FileStream_Demo.bak'
 WITH NOFORMAT, NOINIT,  NAME = N'FileStream_Demo-Full Database Backup', 
 SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Quello che segue è il registro di backup generato dall'esecuzione del comando di backup precedente:

/*Begin Backup DataFile*/

Processed 568 pages for database 'FileStream_Demo', file 'FileStream_Demo' on file 1.

/*Begin backup of FILESTREAM container*/

10 percent processed.
20 percent processed.
30 percent processed.
40 percent processed.
50 percent processed.
60 percent processed.
70 percent processed.
80 percent processed.
90 percent processed.
Processed 111106 pages for database 'FileStream_Demo', file 'Dummy-Documents' on file 1.

/*Begin backup of FILESTREAM container*/

Processed 4 pages for database 'FileStream_Demo', file 'FileStream_Demo_log' on file 1.
100 percent processed.

BACKUP DATABASE successfully processed 111677 pages in 18.410 seconds (47.391 MB/sec).

Come accennato all'inizio dell'articolo, in primo luogo, il server SQL esegue il backup del file di dati primario, quindi dei file di dati secondari e, infine, dei registri delle transazioni. Come puoi vedere nel registro di backup, in primo luogo, il file di dati primario di backup del server SQL, quindi il filegroup FILESTREAM e i dati ad esso associati e infine i registri delle transazioni.

Backup del contenitore FILESTREAM

Come accennato all'inizio dell'articolo, possiamo anche generare un backup del contenitore FILESTREAM. Per creare un backup del contenitore FILESTREAM, eseguire il seguente script T-SQL.

BACKUP DATABASE [FileStream_Demo] FILEGROUP = N'Dummy-Documents' TO  DISK = N'E:\Backups\FS_Container.bak' 
WITH NOFORMAT, NOINIT,  NAME = N'FileStream_Demo-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Ripristina database abilitato per FILESTREAM

Quando ripristiniamo il database FILESTREAM, SQL ripristina il contenitore FileStream insieme a tutti i file all'interno del contenitore FILESTREAM.

Per ripristinare il database, eseguire le seguenti attività:

  1. In SSMS, fai clic con il pulsante destro del mouse sul database e seleziona Ripristina database .
  2. Nella finestra di dialogo Ripristina, seleziona Dispositivo e fai clic su Sfoglia . Si aprirà un'altra finestra di dialogo. Nella finestra di dialogo, fai clic su  Aggiungi .
  3. Nel Individua file di backup finestra di dialogo, navigare nella struttura della directory, fare clic su un backup corretto e fare clic su OK .
  4. Una volta caricate le informazioni di backup nei Set di backup da ripristinare vista griglia, fai clic su OK per iniziare a ripristinare il processo.

In alternativa, puoi ripristinare un database eseguendo il comando seguente:

USE [master]
RESTORE DATABASE [FileStream_Demo] FROM  DISK = N'E:\Backups\FileStream_Demo.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 5
GO

Scenario di ripristino del database abilitato per FILESTREAM

Il filegroup FILESTREAM ripristina il processo come il processo di ripristino dei filegroup.

Per generare lo scenario di ripristino, crea un database abilitato per FILESTREAM denominato FileStream-Demo . Il database ha una tabella FILESTREAM denominata Document_Content . Inserisci alcuni dati e file casuali in Document_Content tabella.

Eseguire la query seguente per popolare i dettagli dei file inseriti nella tabella.

SELECT  
RootDirectory,  
FileName,  
FileAttribute,   
FileCreateDate,   
FileSize,  
FileStreamCol.PathName() AS FilePath FROM Document_Content  order by filesize desc

L'output è il seguente:

Quello che segue è uno screenshot del contenitore FILESTREAM:

Innanzitutto, genera un backup completo del database. Per questo, esegui il seguente comando.

BACKUP DATABASE [FileStream_Demo] TO DISK = N'E:\Backups\Full_FileStream_Demo_20180810.bak' WITH NOFORMAT, NOINIT,NAME = N'FileStream_Demo-Full Database Backup'

In secondo luogo, genera un backup FILEGROUP del filegroup FILESTREAM denominato Dummy-Document eseguendo il seguente comando:

BACKUP DATABASE [FileStream_Demo] FILEGROUP = N'Dummy-Documents' TO  DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' 
WITH NOFORMAT, NOINIT, NAME = N'FileStream_Demo-Full FILEGROUP Backup'

Per generare il danneggiamento di FILESTREAM, eliminare alcuni file dal contenitore FILESTREAM. Una volta eliminati quei file, prova a recuperare i dati da "Document_Content" eseguendo il comando seguente:

Use FileStream_Demo
Go
select * from Document_Content

Otterrai il seguente errore:

Msg 233, Level 20, State 0, Line 122
A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider, 
error: 0 - No process is on the other end of the pipe.)

Vedi lo screenshot seguente:

Ora, dobbiamo ripristinare il contenitore FILESTREAM per correggere questo errore. Abbiamo generato un backup completo e un backup del documento fittizio filegroup.

Possiamo ripristinare l'intero contenitore FILESTREAM ripristinando il filegroup FILESTREAM. Mostrerò:

  1. Ripristino offline del filegroup FILESTREAM.
  2. Ripristino online del filegroup FILESTREAM.

Ripristino offline del filegroup del contenitore FILESTREAM

Poiché avevo eliminato i file dal contenitore FILESTREAM, non è necessario ripristinare l'intero database. Quindi, invece di ripristinare l'intero database, ripristineremo l'unico filegroup. Per fare ciò, in primo luogo, genera un backup Tail-Log per acquisire le modifiche ai dati di cui non è stato eseguito il backup. Il backup del registro di coda deve essere eseguito utilizzando l'opzione NORECOVERY per portare il database in stato di ripristino e ciò offre la possibilità di applicare backup sul database. Per farlo, esegui la seguente query:

backup log [FileStream_Demo] to disk ='E:\Backups\FileStream_Filegroup_Demo_Log_1.trn' With NORECOVERY

Una volta generato il backup del registro di coda, il database sarà in modalità di ripristino. Ora possiamo applicare il backup di FILEGROUP su un database con l'opzione NORECOVERY. Per questo, esegui il seguente comando:

use master
go
RESTORE DATABASE [FileStream_Demo] FILE='Dummy-Documents' FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NORECOVERY,REPLACE;

Ora applica il backup del registro di coda con l'opzione RECOVERY. Per questo, esegui il seguente comando:

RESTORE LOG [FileStream_Demo] FROM  DISK = N'E:\Backups\FileStream_Filegroup_Demo_Log_1.trn'

Una volta ripristinato il backup, il database sarà online e tutti i file verranno ripristinati nel contenitore FILESTREAM. Per verificarlo, esegui il seguente comando:

SELECT  
RootDirectory,  
FileName,  
FileAttribute,   
FileCreateDate,   
FileSize,  
FileStreamCol.PathName() AS FilePath FROM Document_Content  order by filesize desc

L'output della query precedente è il seguente:

Ripristino online del filegroup FILESTREAM

Utilizzando SQL Server Enterprise Edition, possiamo ripristinare il backup quando il database è online. Ad esempio, se un file F1 del filegroup secondario FG-1 è danneggiato, è possibile ripristinare il file F1 mentre il database rimane online. La sequenza di ripristino del ripristino offline e del ripristino online è la stessa.

Come accennato in precedenza, per eseguire un ripristino online del filegroup FILESTREAM, crea il Documento fittizio file di dati offline. Per questo, esegui il seguente comando.

use master
go
Alter database [FileStream_Demo] MODIFY FILE (NAME='Dummy-Documents',OFFLINE)

Per verificare lo stato del file, eseguire la seguente query:

Use [FileStream_Demo]
Go
select File_id, type_desc,name, physical_name,state_desc,size from FileStream_Demo.sys.database_files

L'output è il seguente:

Abbiamo già eseguito il backup del documento fittizio filegroup. Quindi, una volta che il file di dati è offline, ripristinare il backup di FILEGROUP su un database con l'opzione NORECOVERY. Per questo, esegui il seguente comando:

use master
go
RESTORE DATABASE [FileStream_Demo] FILE='Dummy-Documents' FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NORECOVERY, REPLACE;

Ora, esegui un backup del registro del database per assicurarti che il punto in cui il file di dati è andato offline venga acquisito. Per questo, esegui il seguente comando:

backup log [FileStream_Demo] to disk ='E:\Backups\FileStream_Filegroup_Demo_Log1.trn'

Eseguire il comando seguente per ripristinare l'ultimo backup di T-Log.

use master
go
RESTORE LOG [FileStream_Demo] FROM  DISK = N'E:\Backups\FileStream_Filegroup_Demo_Log1.trn'

Una volta ripristinato il backup del registro, tutti i file nel contenitore FILESTREAM verranno ripristinati e il filegroup sarà online. Per verificarlo, esegui la seguente query:

Use [FileStream_Demo]
Go
select File_id, type_desc,name, physical_name,state_desc,size from FileStream_Demo.sys.database_files

L'output è il seguente:

Una volta ripristinato il backup, il database sarà online e tutti i file verranno ripristinati nel contenitore FILESTREAM. Per verificarlo, esegui il seguente comando:

SELECT  
RootDirectory,  
FileName,  
FileAttribute,   
FileCreateDate,   
FileSize,  
FileStreamCol.PathName() AS FilePath FROM Document_Content  order by filesize desc

L'output è il seguente:

Riepilogo

In questo articolo, ho spiegato:

  1. Come eseguire il backup e ripristinare il database abilitato per FILESTREAM e il filegroup FILESTREAM.
  2. Come ripristinare filegroup FILESTREAM online e offline.