我在本地数据库上尝试了MSSQL(2008R2数据中心)的FILESTREAM功能进行实验。真正的数据库正在服务器上运行。我使用此查询设置了整个FILESTREAM:
/* CREATE FILESTREAM AND FILESTREAM TABLE */
USE [master]
GO
ALTER DATABASE SenONew
ADD FILEGROUP [FileStream]
CONTAINS FILESTREAM
GO
ALTER DATABASE SenONew
ADD FILE
(
NAME = 'fsSenONew',
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\SenONew.ndf'
)
TO FILEGROUP [FileStream]
GO
USE [SenONew]
GO
CREATE TABLE Filestore(
FileID int PRIMARY KEY,
RowID uniqueidentifier ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWSEQUENTIALID(),
FileDescr nvarchar(max),
FileIndex varbinary(max) FILESTREAM NULL)
GO
我正在尝试添加一些文件然后删除它们。
既然这只是一个实验,我也想摆脱它。我使用本地服务器开发将在真实服务器上使用的数据库,因此我在本地服务器上创建BackUp然后在真实服务器上恢复它,所以它得到更新(软件正在开发中,因此数据库结构和数据的变化很大,我需要对正在测试软件的真实服务器进行完全恢复。)
经过几个小时的搜索,我无法找到解决问题的方法。
我明白我需要:
所以我使用此查询来摆脱我首先设置的所有内容:
/* DROP FILESTREAM TABLE AND FILEGROUP */
USE SenONew
DROP TABLE Filestore
GO
ALTER DATABASE SenONew
REMOVE FILE fsSenONew
ALTER DATABASE SenONew
REMOVE FILEGROUP [FileStream]
GO
所以我按照自己的意愿行事,并且完成时也没有错误。因此,当我输入文件组,文件和文件位置时,我发现它们都被完全删除了:
但是当我对我的本地数据库(包括已删除的FILESTREAM,文件路径和文件组)进行备份并尝试使用它恢复服务器时,我会收到错误。
创建BACKUP的SQL:
/* CREATE BACKUP OF DATABASE WITHIN CURRECT CONNECTION */
DECLARE @FileName2 nvarchar(250)
SELECT @FileName2 = (SELECT 'C:\SenO BackUp\' + convert(nvarchar(200),GetDate(),112) + ' SenONew.BAK')
BACKUP DATABASE SenONew TO DISK=@FileName2
GO
然后在服务器上执行还原:
/* CREATE RESTORE OF DATABASE WITHIN REAL SERVER CONNECTION */
use master
alter database SenONew set offline with rollback immediate;
DECLARE @FileName2 nvarchar(250)
SELECT @FileName2 = (SELECT '' + convert(nvarchar(200),GetDate(),112) + ' SenONew.BAK')
RESTORE DATABASE SenONew
FROM DISK = @FileName2
alter database SenONew set online with rollback immediate;
我收到以下错误:
*(Msg 5121,Level 16,State 2,Line 7 由" C:\ Program Files \ Microsoft SQL Server \ MSSQL10_50.SQLEXPRESS \ MSSQL \ DATA \ SenONew.ndf"指定的路径不在有效目录中。
Msg 3156,Level 16,State 3,Line 7 File' fsSenONew'无法还原到' C:\ Program Files \ Microsoft SQL Server \ MSSQL10_50.SQLEXPRESS \ MSSQL \ DATA \ SenONew.ndf'。使用WITH MOVE标识文件的有效位置。
Msg 3119,Level 16,State 1,Line 7在规划RESTORE语句时发现了问题。以前的消息提供详情。
Msg 3013,Level 16,State 1,Line 7 RESTORE DATABASE正在异常终止。 )*
我删除了.ndf FILESTREAM位置,为什么它是指定的路径?另外,为什么fsSenONew试图恢复?我无法理解它。我需要在内部删除路径吗?
答案 0 :(得分:6)
您可以查看:
SELECT * FROM SenONew.sys.data_spaces WHERE name = 'FileStream'
它应该返回0行。
有一个从SQL Server 2008数据库中删除FILESTREAM功能的过程:
ALTER TABLE Filestore DROP column FileIndex
GO
ALTER TABLE Filestore SET (FILESTREAM_ON="NULL")
GO
ALTER Database SenONew REMOVE FILE fsSenONew
GO
ALTER Database SenONew REMOVE FILEGROUP [FileStream]
GO
如this article中所述。但你所做的步骤应该做同样的事情。
您的问题确实很奇怪,但我建议您尝试使用以下
USE SenONew
EXEC Sp_help
EXEC Sp_helpfile
EXEC Sp_helpfilegroup
你可能会发现一些可疑的东西,比如使用该FILEGROUP的另一张表。
我完成了您描述的步骤,无法重现您的问题。检查还原数据库屏幕的外观。
答案 1 :(得分:0)
1。从列和表中删除FILESTREAM属性。您需要将数据移到新列。
ALTER TABLE MyTable
ADD FileData varbinary(max) NULL;
GO
update MyTable
set FileData = FileStreamData
GO
ALTER TABLE MyTable
DROP column FileStreamData
GO
ALTER TABLE MyTable SET (FILESTREAM_ON="NULL")
GO
EXEC sp_RENAME 'MyTable', 'FileStreamData', 'COLUMN'
GO
2。从FILESTREAM中删除文件,并放下FILE和FILESTEAM。
ALTER DATABASE [MyDatabase] SET RECOVERY Simple
GO
EXEC SP_FILESTREAM_FORCE_GARBAGE_COLLECTION
ALTER DATABASE [MyDatabase] REMOVE FILE [MyFile]
GO
ALTER DATABASE [MyDatabase] REMOVE FILEGROUP [MyFileGroup]
GO
ALTER DATABASE [MyDatabase] SET RECOVERY FULL
GO
答案 2 :(得分:0)
这是对我有用的脚本。清空文件是一条命令:
ALTER TABLE FilesTable DROP column FileContent
GO
ALTER TABLE FilesTable SET (FILESTREAM_ON="NULL")
GO
USE mydbname
GO
DBCC SHRINKFILE (N'filestreamfile', EMPTYFILE)
GO
EXEC sp_filestream_force_garbage_collection @dbname = N'mydbname'
ALTER Database mydbname REMOVE FILE filestreamfile
GO
ALTER Database mydbname REMOVE FILEGROUP FILESTREAMGROUP
GO
IF COL_LENGTH('FilesTable','FileContent') IS NULL
BEGIN
ALTER TABLE FilesTable ADD FileContent [varbinary](max) NULL
END
GO