Sql server 如何完成删除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

我在本地数据库上尝试了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
我正在尝试添加一些文件,然后删除它们

既然这只是一个实验,我也想摆脱它。我使用我的本地服务器来开发将在真实服务器上使用的数据库,因此我在本地服务器上创建备份,然后在真实服务器上还原它,这样它就会得到更新(软件正在开发中,因此数据库结构和数据都发生了很大的变化,我需要对真正的服务器进行完整的恢复,在那里软件正在进行测试)

经过几个小时的搜索,我找不到任何关于我的问题

我明白我需要:

  • 删除存储FILESTREAM信息的数据库表
  • 我需要删除文件流的文件
  • 删除文件组
  • 因此,我使用此查询来清除我首先设置的所有内容:

    /* 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和易于复制的情况。很高兴您已经解决了这个问题。为什么要更改数据库并将恢复设置为“简单”,然后再次设置为“完全”?