从SQL Server 2008开始,数据库引入了FILESTREAM这个功能。对于BLOB数据,如Images, Video, Word文档等等,可以存放在文件系统中,而不是在数据库文件里。这对数据库备份和恢复有什么影响呢。我们通过一个例子,来检查一下带有FILESTREAM功能的数据库备份和恢复方案。
第一步,在数据库服务级别,启动FILESTREAM,我们可以打开数据库的配置管理器,找到数据库服务,并右键点击属性。找到FILESTREAM的设置,启用FILESTREAM。然后执行下面的语句,随后重新启动数据库服务。
EXEC sp_configure filestream_access_level, 2
RECONFIGURE
启用FILESTREAM
第二步,把们建一个数据库TESTFSDB。由于FILESTREAM使用一种特殊类型的文件组,所以必须至少为一个文件组指定CONTAINS FILESTREAM子句。
CREATE DATABASE TESTFSDB
GO
ALTER DATABASE TESTFSDB
ADD FILEGROUOP [FSGroup] CONTAINS FILESTREAM
GO
ALTER DATABASE TESTFSDB
ADD FILE (NAME=N’FSDATA’, FILENAME=N’D:\FSData’) TO FILEGROUPFSGroup
GO
执行上面语句后,filestream.hdr文件和$FSLOG文件夹会出现在D:\FSData目录下。Filestream.hdr文件是FILESTREAM容器的头文件。Filestream.hdr文件是重要的系统文件,包含FILESTREAM标头信息。请不要删除或者修改此文件。事实上,这个文件已经被数据库占用,在数据库服务启动状态下,是无法删除此文件的。
第三步,创建一个表,表名为FSTable。要使用FILESTREAM功能,我们必须要有一个字段,类型为VARBINARY(MAX)并指定FILESTREAM属性,而且还需要有另外一个字段是UNIQUEIDENTIFIER类型并指定ROWGUIDCOL属性。
use TESTFSDB
go
CREATE TABLE FSTable
(
[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
[FileName] NVARCHAR(100) ,
[BlobData] VARBINARY(MAX) FILESTREAM NULL
)
第四步,插入相应的数据。
INSERT INTO FSTable
SELECT NEWID(), 'File1', * FROM
OPENROWSET(BULK N'D:\temp\Image.jpg', SINGLE_BLOB) AS Document
INSERT INTO FSTable
SELECT NEWID(), 'File2', * FROM
OPENROWSET(BULK N'D:\temp\Image.jpg', SINGLE_BLOB) AS Document
数据插入后,我们可以看到,在D:\FSData文件夹子目录9ead5f8f-4e8b-459d-9e9c-205dabbee0ff下,有两个文件生成。我们可以把这两个文件复制出来,重命名为.jpg格式,然后用图形软件打开它。
第五步,对数据库做一个全备份和日志备份。
BACKUP DATABASE [TESTFSDB] TO DISK='C:\temp\TESTFSDB.bak'
BACKUP LOG [TESTFSDB] TO DISK='C:\temp\TESTFSDB.bak'
第六步,我们关闭数据库服务,并且删除整个D:\FSData文件夹和TESTFSDB数据库。随后,重新启动数据库服务,并依据TESTFSDB.bak文件对数据库TESTFSDB进行恢复。我们会发现,D:\FSData会被重新创建。并且查询表FSTable,我们能得到正确的数据。
通过上面的实验,我们可以知道,对于有FILESTREAM功能的数据库,在进行备份和恢复时,会自动包含FILESTREAM数据。并不需要额外做文件级别的备份和恢复。