Контекст
Мы разрабатываем систему с большой базой данных внизу. Это база данных MS SQL, работающая на SQL Server 2008 R2. Общий размер базы данных составляет около 12 ГБ.
Из них примерно 8,5 ГБ находятся в одной таблице BinaryContent
. Как следует из названия, это таблица, в которой мы храним простые файлы любого типа непосредственно в таблице как BLOB. Недавно мы тестировали возможность перемещения всех этих файлов из базы данных в файловую систему с помощью FILESTREAM.
Мы внесли необходимые изменения в нашу базу данных без каких-либо проблем, и наша система все еще работает нормально после миграции. BinaryContent
Таблица выглядит примерно так:
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]
Со всем, что находится в PRIMARY
файловой группе, кроме поля, FileBinaryContent
которое находится в отдельной файловой группе FileStreamContentFG
.
Сценарий
С точки зрения разработчика, мы часто хотели бы иметь свежую копию базы данных из нашей производственной среды, чтобы иметь возможность обрабатывать самые последние данные. В этих случаях мы редко интересуемся файлами, хранящимися в BinaryContent (теперь использующем FILESTREAM).
У нас это почти работает, как мы хотели. Мы создаем резервную копию базы данных без потока файлов, например:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
И восстановить это так:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
Кажется, это работает нормально, и наша система работает, пока мы избегаем частей, которые используют FileBinaryContent
поле. Например, мы можем без проблем выполнить следующий запрос:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
Естественно, если я откомментирую строку выше, в том числе FileContentBinary
в запросе, я получаю сообщение об ошибке:
Данные больших объектов (LOB) для таблицы "dbo.BinaryContent" находятся в автономной файловой группе ("FileStreamContentFG"), к которой нет доступа.
Наша система обрабатывает файлы, для которых установлено содержимое null
, поэтому я хотел бы сделать что-то вроде этого:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
Но это, конечно, дает мне ту же ошибку, что и выше. На данный момент я застрял.
Вопрос
Можно ли как-нибудь восстановить базу данных без необходимости восстанавливать все из FileStreamContentFG
файловой группы? Либо путем обновления значений на ноль, как я пытаюсь выше, либо по умолчанию на ноль, когда файл отсутствует или что-то?
Или я, возможно, подхожу к проблеме неправильно?
Я по натуре разработчик и не очень разбираюсь в качестве администратора, поэтому прошу прощения, если я пропускаю некоторые тривиальные вещи здесь.