Contesto
Stiamo sviluppando un sistema con un database di grandi dimensioni in fondo. È un database MS SQL in esecuzione su SQL Server 2008 R2. La dimensione totale del database è di circa 12 GB.
Di questi, circa 8,5 GB si trovano in una singola tabella BinaryContent
. Come suggerisce il nome, questa è una tabella in cui archiviamo file semplici, di qualsiasi tipo, direttamente nella tabella come BLOB. Recentemente abbiamo testato la possibilità di spostare tutti questi file dal database nel file system usando FILESTREAM.
Abbiamo apportato le modifiche necessarie al nostro database senza problemi e il nostro sistema funziona ancora bene dopo la migrazione. La BinaryContent
tabella appare più o meno così:
CREATE TABLE [dbo].[BinaryContent](
[BinaryContentID] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](50) NOT NULL,
[BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL
) ON [PRIMARY] FILESTREAM_ON [FileStreamContentFG]
ALTER TABLE [dbo].[BinaryContent] ADD [FileContentBinary] [varbinary](max) FILESTREAM NULL
ALTER TABLE [dbo].[BinaryContent] ADD CONSTRAINT [DFBinaryContentRowGUID] DEFAULT (newsequentialid()) FOR [BinaryContentRowGUID]
Con tutto ciò che risiede nel PRIMARY
gruppo di file, tranne il campo FileBinaryContent
che si trova in un gruppo di file separato FileStreamContentFG
.
Scenario
Dal punto di vista di uno sviluppatore, vorremmo spesso una nuova copia del database dal nostro ambiente di produzione, per poter lavorare con i dati più recenti. In questi casi, siamo raramente interessati ai file archiviati in BinaryContent (ora usando FILESTREAM).
Abbiamo quasi funzionato come vorremmo. Eseguiamo il backup del database, senza il flusso di file in questo modo:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
E ripristinalo in questo modo:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
Questo sembra funzionare correttamente e il nostro sistema funziona fintanto che evitiamo le parti che utilizzano il FileBinaryContent
campo. Ad esempio, possiamo eseguire la seguente query senza problemi:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
Naturalmente, se annullo il commento alla riga precedente, incluso FileContentBinary
nella query, viene visualizzato un errore:
I dati di oggetti di grandi dimensioni (LOB) per la tabella "dbo.BinaryContent" risiedono in un filegroup offline ("FileStreamContentFG") a cui non è possibile accedere.
Le nostre maniglie file di sistema in cui il contenuto è impostato null
, in modo da quello che avrei piacerebbe fare è qualcosa di simile a questo:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
Ma questo ovviamente mi dà lo stesso errore di cui sopra. A questo punto sono bloccato.
Domanda
Esiste un modo per ripristinare il database senza dover ripristinare anche tutto dal FileStreamContentFG
gruppo di file? O aggiornando i valori su null come sto provando sopra, o per impostazione predefinita su null quando manca il file o qualcosa del genere?
O forse sto affrontando il problema nel modo sbagliato?
Sono uno sviluppatore per natura e non ho molta conoscenza come DBA, quindi scusami se sto trascurando qualcosa di banale qui.