FILESTREAM功能被禁用

2016-03-08 17:56 整理,未发布

1、背景

从别处拿来一备份文件

restore headeronly from DISK = N'E:\AdventureWorks2008_F_20161109.bak' 
restore filelistonly from DISK = N'E:\AdventureWorks2008_F_20161109.bak' 
View Code


还原数据库

复制代码
--还原数据库
RESTORE DATABASE [AdventureWorks2008New] FROM DISK = N'E:\AdventureWorks2008_F_20161109.bak' WITH FILE = 1
,  MOVE N'AdventureWorks2008_Data' TO N'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\AdventureWorks2008New_Data.mdf'
,  MOVE N'AdventureWorks2008_Log' TO N'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\AdventureWorks2008New_Log.ldf'
,  MOVE N'AdventureWorks2008_Fs' TO N'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\AdventureWorks2008New_Fs'
,  NOUNLOAD,REPLACE,STATS = 10
GO
View Code
复制代码


错误信息是说FILESTREAM 功能被禁用。

2、启用FILESTREAM功能

文件流特性通过将二进制大字段数据存储在本地文件系统中,从而将Windows新技术文件系统(NTFS)和SQL Server数据库引擎集成在一起。你可以使用Transact-SQL语句来查询、插入或更新数据,或者使用Win32文件系统界面来直接访问数据。

2.1、启用SQL Server服务中的文件流支持

Step1、SQL Server配制管理器->服务属性->文件流->勾选[针对Transact-SQL访问启用文件流]
Step2、设置文件流访问级别

复制代码
USE master
GO
EXEC sp_configure filestream_access_level, 2 --同时支持T-SQL和Win32流访问
GO
RECONFIGURE
GO
--查看value
SELECT * FROM sys.sysconfigures s WHERE comment LIKE '%filestream%'
View Code
复制代码

请按步骤1->步骤2的顺序操作,如果按步骤2->步骤1,在还原时会提示FILESTREAM 功能被禁用,此时需要再次执行步骤2语句。
单独只操作步骤1或步骤2还原会提示FILESTREAM 功能被禁用。

复制代码
--再次还原数据库,成功还原
RESTORE DATABASE [AdventureWorks2008New] FROM DISK = N'E:\AdventureWorks2008_F_20161109.bak' WITH FILE = 1
,  MOVE N'AdventureWorks2008_Data' TO N'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\AdventureWorks2008New_Data.mdf'
,  MOVE N'AdventureWorks2008_Log' TO N'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\AdventureWorks2008New_Log.ldf'
,  MOVE N'AdventureWorks2008_Fs' TO N'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\AdventureWorks2008New_Fs'
,  NOUNLOAD,REPLACE,STATS = 10
GO
View Code
复制代码

2.2、配制数据库来支持文件流存储

这里我针对示例数据库添加一个文件流,确保你已启用FILESTREAM功能

复制代码
--添加文件流文件组、文件
USE [master]
GO
ALTER DATABASE [AdventureWorks2008] ADD FILEGROUP [FileStreamGrp] CONTAINS FILESTREAM 
GO
ALTER DATABASE [AdventureWorks2008] ADD FILE ( NAME = N'AdventureWorks2008_Fs', FILENAME = N'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\AdventureWorks2008_Fs' ) TO FILEGROUP [FileStreamGrp]
GO
View Code
复制代码

此时数据库已包含一个文件流,备份数据库

复制代码
--备份数据库
BACKUP DATABASE [AdventureWorks2008] TO  DISK = N'E:\AdventureWorks2008_F_20161109.bak' 
WITH NOFORMAT, NOINIT,  NAME = N'AdventureWorks2008-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
GO
View Code
复制代码

你已经有了一个备份文件,那么就可以回到文章的开始了。。。
当然,你也可以创建一个全新的带文件流的数据库

复制代码
USE master
GO
IF EXISTS(SELECT name FROM sys.databases WHERE name = 'HumanResources')
DROP DATABASE HumanResources
GO
CREATE DATABASE HumanResources
ON
PRIMARY(
NAME = HumanRscsDat,
FILENAME = 'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\HumanRscsDat.mdf'),
FILEGROUP FileStreamGrp CONTAINS FILESTREAM(
NAME = HumanRscsFs,
FILENAME = 'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\HumanRscsFs')
LOG ON(
NAME = HumanRscsLog,
FILENAME = 'D:\SQL08R2\MSSQL10_50.SQL08R2\MSSQL\DATA\HumanRscsLof.ldf')
View Code
复制代码

2.3、定义支持文件流存储的列

要使一张表包含一个文件流列,它必须也要包含一个ROWGUIDCOL关键字,且此关键字需要配制为非空和唯一约束。这个文件流列对于支持Win32文件流访问来说是必须的。此文件流列本身必须配制为varbinary(max)类型,并包含FILESTREAM关键字,如下边的建表语句:
复制代码
USE HumanResources
GO
IF OBJECT_ID ( N'Candidate', N'U') IS NOT NULL
DROP TABLE dbo.Candidate
GO
CREATE TABLE Candidate(
CandidateId INT IDENTITY PRIMARY KEY,
CandidateGuid UNIQUEIDENTIFIER ROWGUIDCOL
NOT NULL UNIQUE DEFAULT NEWID(),
CandidateResume VARBINARY(MAX) FILESTREAM NULL
)
View Code
复制代码

3、禁用FILESTREAM功能

复制代码
USE master
GO
EXEC sp_configure filestream_access_level, 0
GO
RECONFIGURE
GO
View Code
复制代码


SQL Server配制管理器->服务属性->文件流->去掉[针对Transact-SQL访问启用文件流]
禁用FILESTREAM功能,必须重启数据库服务才能生效!

复制代码
--Clear
--AdventureWorks2008
USE [AdventureWorks2008]
GO
ALTER DATABASE [AdventureWorks2008]  REMOVE FILE [AdventureWorks2008_Fs]
GO
ALTER DATABASE [AdventureWorks2008] REMOVE FILEGROUP [FileStreamGrp]
GO
--HumanResources
DROP DATABASE HumanResources
--AdventureWorks2008New
DROP DATABASE [AdventureWorks2008New]
View Code
复制代码

提醒:如果在FILESTREAM功能启用后,执行上面的语句会删除对应的文件流文件夹。如果在FILESTREAM功能禁用,且重启数据库服务生效后,删除HumanResources库,则不会删除对应的文件流文件夹。在下次使用相关的文件夹时会报错

4、参考文档

解决FILESTREAM 功能被禁用:http://www.cnblogs.com/samsonhuang/articles/2342598.html
文件流知识介绍:http://database.51cto.com/art/201109/288736.htm

posted @   Uest  阅读(1013)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示