Контекст
Ми розробляємо систему з великою базою даних внизу. Це база даних 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
групи файлів? Чи оновленням значень до null, як я намагаюся вище, або за замовчуванням до null, коли файл відсутній чи щось?
Або я, можливо, підходжу до проблеми неправильно?
Я за своєю природою розробник і не маю великих знань як DBA, тому вибачте мене, якщо я тут не помічаю якусь дрібницю.