Sql server 如何完成删除filestream和所有附加文件
我在本地数据库上尝试了MSSQL(2008R2数据中心)的FILESTREAM功能,以进行试验。真正的数据库运行在服务器上。我已使用以下查询设置了整个FILESTREAM:Sql server 如何完成删除filestream和所有附加文件,sql-server,filestream,Sql Server,Filestream,我在本地数据库上尝试了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 FI
/* 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
我正在尝试添加一些文件,然后删除它们
既然这只是一个实验,我也想摆脱它。我使用我的本地服务器来开发将在真实服务器上使用的数据库,因此我在本地服务器上创建备份,然后在真实服务器上还原它,这样它就会得到更新(软件正在开发中,因此数据库结构和数据都发生了很大的变化,我需要对真正的服务器进行完整的恢复,在那里软件正在进行测试)
经过几个小时的搜索,我找不到任何关于我的问题
我明白我需要:
/* DROP FILESTREAM TABLE AND FILEGROUP */
USE SenONew
DROP TABLE Filestore
GO
ALTER DATABASE SenONew
REMOVE FILE fsSenONew
ALTER DATABASE SenONew
REMOVE FILEGROUP [FileStream]
GO
因此,我做了我应该做的一切,它也没有错误地完成。因此,当我输入我的文件组、文件和文件位置时,我看到它们都被完全删除:
但是,当我备份本地数据库(包括已删除的文件流、文件路径和文件组)并尝试用它还原服务器时,会出现错误
要创建备份,请执行以下操作:
/* 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,16级,状态2,第7行
“C:\Program Files\Microsoft SQL Server\MSSQL10\u 50.SQLEXPRESS\MSSQL\DATA\SenONew.ndf”指定的路径不在有效目录中
Msg 3156,第16级,状态3,第7行文件“fsSenONew”无法还原为“C:\Program Files\Microsoft SQL Server\MSSQL10\u 50.SQLEXPRESS\MSSQL\DATA\SenONew.ndf”。与MOVE一起使用可标识文件的有效位置
在计划RESTORE语句时,发现了Msg 3119,级别16,状态1,第7行问题。以前的消息提供了详细信息
Msg 3013,16级,状态1,第7行还原数据库异常终止。)*
我删除了.ndf FILESTREAM位置,为什么它是一个指定的路径?另外,为什么fsSenONew尝试还原?我无法理解它。是否有内部路径需要删除?您可以检查:
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
如中所述。但您所执行的步骤也应执行相同的操作
您的问题当然很奇怪,但我建议您尝试使用以下方法
USE SenONew
EXEC Sp_help
EXEC Sp_helpfile
EXEC Sp_helpfilegroup
您可能会发现一些可疑的东西,比如使用该文件组的另一个表
我已经完成了您描述的所有步骤,无法重现您的问题。请检查还原数据库屏幕的外观
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.FileData', 'FileStreamData', 'COLUMN'
GO
2.从文件流中删除文件并删除文件和文件组
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
这是为我工作的脚本。缺少用于清空文件的命令:
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
我是否可以建议备份和恢复不是开发数据库的最佳方式?目前它可能还可以,但一旦数据库用于生产,它就不再是一种可行的方法(除非可以擦除生产数据)。在这种假设下,为什么不开发您以后需要的替代方法呢?备份和恢复目前似乎工作得很好。正如我前面提到的,由于处于开发阶段,数据库结构发生了很大的变化。在项目的最后,完成的数据库结构将填充真实的当前数据所有数据。只有在这之后,新软件才会在生产中使用,任何更改都只会在真正的服务器上进行。哦,这真是太奇怪了。我再次尝试进行恢复,它突然起了作用,我的和你的查询都起了作用。在我发布这篇文章的那天,我已经重新启动了所有SQL服务,检查并取消了FILESTREAM选项,wh然后我给了我一个配置错误,我已经尝试解决了相当长的一段时间-计算机重新启动已经解决了这个问题-但即使这样,我也无法恢复。今天,由于某种原因,我可以。我感谢你的复制,因此接受了它,确实,这很奇怪。是的,这也是我的印象,这不是一个标准rd和易于复制的情况。很高兴您已经解决了这个问题。为什么要更改数据库并将恢复设置为“简单”,然后再次设置为“完全”?