Contexto
Estamos desarrollando un sistema con una base de datos de gran tamaño en la parte inferior. Es una base de datos MS SQL que se ejecuta en SQL Server 2008 R2. El tamaño total de la base de datos es de aproximadamente 12 GB.
De estos, aproximadamente 8,5 GB están en una sola tabla BinaryContent
. Como su nombre indica, esta es una tabla donde almacenamos archivos simples, de cualquier tipo, directamente en la tabla como un BLOB. Recientemente hemos estado probando la posibilidad de mover todos estos archivos de la base de datos al sistema de archivos usando FILESTREAM.
Hicimos las modificaciones necesarias a nuestra base de datos sin ningún problema, y nuestro sistema aún funciona bien después de la migración. La BinaryContent
tabla se ve más o menos así:
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 todo lo que reside en el PRIMARY
grupo de archivos, excepto el campo FileBinaryContent
que está en un grupo de archivos separado FileStreamContentFG
.
Escenario
Desde el punto de vista del desarrollador, a menudo nos gustaría una copia nueva de la base de datos de nuestro entorno de producción, para poder trabajar con los datos más recientes. En esos casos, rara vez estamos interesados en los archivos almacenados en BinaryContent (ahora usando FILESTREAM).
Tenemos esto casi funcionando como nos gustaría. Realizamos una copia de seguridad de la base de datos, sin la secuencia de archivos como esta:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
Y restaurarlo así:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
Esto parece estar funcionando bien, y nuestro sistema funciona siempre y cuando evitemos las partes que usan el FileBinaryContent
campo. Por ejemplo, podemos ejecutar la siguiente consulta sin problemas:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
Naturalmente, si descomento la línea anterior, incluida FileContentBinary
en la consulta, aparece un error:
Los datos de objetos grandes (LOB) para la tabla "dbo.BinaryContent" residen en un grupo de archivos sin conexión ("FileStreamContentFG") al que no se puede acceder.
Nuestro sistema maneja archivos donde el contenido está configurado null
, así que lo que me gustaría hacer es algo como esto:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
Pero esto, por supuesto, me da el mismo error que el anterior. En este punto estoy atascado.
Pregunta
¿Hay alguna forma de restaurar la base de datos sin tener que restaurar todo desde el FileStreamContentFG
grupo de archivos? ¿Actualizando los valores a nulo como lo intento anteriormente, o por defecto a nulo cuando falta el archivo o algo así?
¿O tal vez estoy abordando el problema de manera incorrecta?
Soy desarrollador por naturaleza y no tengo mucho conocimiento como DBA, así que discúlpeme si estoy pasando por alto algo trivial aquí.