Контекст
Мы разрабатываем систему с большой базой данных внизу. Это база данных 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
файловой группы? Либо путем обновления значений на ноль, как я пытаюсь выше, либо по умолчанию на ноль, когда файл отсутствует или что-то?
Или я, возможно, подхожу к проблеме неправильно?
Я по натуре разработчик и не очень разбираюсь в качестве администратора, поэтому прошу прощения, если я пропускаю некоторые тривиальные вещи здесь.
источник
Ответы:
То, что вы пытаетесь сделать, оставило бы базу данных в (транзакционно) несовместимом состоянии, следовательно, это невозможно.
Частичная доступность базы данных Whitepaper является полезным справочником и включает в себя пример того , как проверить , является ли конкретная таблица или файл в Интернете. Если бы ваш доступ к данным осуществлялся через хранимые процедуры, вы могли бы относительно легко включить эту проверку.
Один альтернативный (но несколько хакерский) подход, который может стоить посмотреть в вашем сценарии, состоит в том, чтобы скрыть таблицу и заменить ее представлением.
источник
Вы можете изолировать таблицу с помощью a
FILESTREAM
в отдельной базе данных и создать ссылку на нее вPRODUCTION
базе данных, используя представление.Это позволит вам делать то, что вы хотите, не прибегая к взломам.
источник