背景
我们正在开发一个系统,该系统的底部有一个大型数据库。它是在SQL Server 2008 R2上运行的MS SQL数据库。数据库的总大小约为12 GB。
其中约有8.5 GB位于单个表中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
查询中的行,则会收到错误消息:
表“ dbo.BinaryContent”的大对象(LOB)数据位于无法访问的脱机文件组(“ FileStreamContentFG”)上。
我们的系统处理,其中内容被设置为文件null
,所以我会喜欢做的是这样的:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
但这当然给了我与上述相同的错误。在这一点上,我被困住了。
问题
有什么方法可以还原数据库而又不必还原FileStreamContentFG
文件组中的所有内容?是通过在我上面尝试将值更新为null还是在缺少文件或其他内容时将其默认设置为null?
还是我可能以错误的方式来解决问题?
我天生就是一名开发人员,没有DBA的知识,所以如果我在这里忽略了一些琐碎的事情,请原谅我。