如何完成删除文件流和所有附加文件

时间:2014-11-07 13:25:04

标签: 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 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然后在真实服务器上恢复它,所以它得到更新(软件正在开发中,因此数据库结构和数据的变化很大,我需要对正在测试软件的真实服务器进行完全恢复。)

经过几个小时的搜索,我无法找到解决问题的方法。

我明白我需要:

  1. 删除存储FILESTREAM信息的数据库表
  2. 我需要删除FILESTREAM的文件
  3. 删除文件组
  4. 所以我使用此查询来摆脱我首先设置的所有内容:

    /* DROP FILESTREAM TABLE AND FILEGROUP */
    USE SenONew
    DROP TABLE Filestore
    GO
    
    ALTER DATABASE SenONew
    REMOVE FILE fsSenONew
    
    ALTER DATABASE SenONew
    REMOVE FILEGROUP [FileStream]
    GO
    

    所以我按照自己的意愿行事,并且完成时也没有错误。因此,当我输入文件组,文件和文件位置时,我发现它们都被完全删除了:

    enter image description here enter image description here enter image description here

    但是当我对我的本地数据库(包括已删除的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
    

    enter image description here

    然后在服务器上执行还原:

    /* 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;
    

    我收到以下错误:

    enter image description here

    *(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试图恢复?我无法理解它。我需要在内部删除路径吗?

3 个答案:

答案 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的另一张表。

我完成了您描述的步骤,无法重现您的问题。检查还原数据库屏幕的外观。

enter image description here

答案 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