【问题标题】:SQL Server 2008: Unable to remove a FileStream File and FilegroupSQL Server 2008:无法删除 FileStream 文件和文件组
【发布时间】:2010-02-15 23:11:28
【问题描述】:

在 SQL Server 2008 SP1 中,我删除了唯一一个具有与之关联的 Filestream 的表,但每次我尝试执行以下操作时:

更改数据库 ConsumerMarketingStore 删除文件 CMS_JobInstanceFiles

更改数据库 ConsumerMarketingStore 删除文件组 JobInstanceFiles

我得到以下异常:

消息 5042,第 16 级,状态 10,第 2 行 无法删除文件“CMS_JobInstanceFiles”,因为它不为空。 消息 5042,第 16 级,状态 11,第 3 行 无法删除文件组“JobInstanceFiles”,因为它不为空。

究竟如何摆脱 Filestream 文件和文件组?谢谢!

【问题讨论】:

  • 这不应该在 ServerFault.com 上吗?

标签: sql-server-2008 filestream


【解决方案1】:

确保您删除的表实际上是唯一使用该文件流文件的表:

select * 
from ConsumerMarketingStore.sys.tables t 
join ConsumerMarketingStore.sys.data_spaces ds 
 on t.filestream_data_space_id = ds.data_space_id 
 and ds.name = 'JobInstanceFiles'

上述查询的结果应该是空的。如果您有其他包含 Filestream 列的表并说您删除了这些列,则该表仍将使用 Filestream 文件。摆脱这种用法的方法是将表的 Filestream 文件组设置为 NULL:

alter table t1 set (filestream_on = "NULL")

【讨论】:

  • 你是个了不起的人。经过几天的 MS 论坛,与 MS 的人们交谈,以及 SO,您是第一个提供有用信息和答案的人。我有一张表,它曾经有一个文件列,但我删除了它。这就是我遇到问题的原因。非常感谢。
  • FWIW,我用它从所有表中删除文件流。它会抛出一个错误,列出仍然具有文件流字段的所有表,这对于清除已弃用的文件流字段很有用。
  • 这在我上面的评论中被忽略了:EXEC sp_msforeachtable "Alter Table ? Set (FILESTREAM_ON='NULL')"
【解决方案2】:

你必须运行DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)

这会将文件标记为“空”并允许删除它。

当然,ALTER DATABASE 没有提到这一点,但 DBCC SHRINKFILE 确实……很明显,嗯?

【讨论】:

  • 我确实试过了,你得到了以下异常:不能为 FILESTREAM 数据文件 'CMS_JobInstanceFiles' 指定属性 SIZE、MAXSIZE 或 FILEGROWTH
  • @James Alexander:请问哪个命令? DBCC 还是 ALTER DATABASE?
  • 我相信 DBCC SHRINKFILE 不适用于 Filestream 文件。
【解决方案3】:

除了从表中删除FileStream列和FileStream属性外,我还需要将数据库恢复模式设置为Simple

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

【讨论】:

    【解决方案4】:

    删除表后,垃圾收集器需要一段时间来清理数据。这可能是发生这种情况的原因。您可以通过发出CHECKPOINT 来强制进行垃圾回收。

    您可以通过转到 Filestream 数据容器来验证是否已清理 FILESTREAM 数据。如果FILESTREAM 数据被删除,ALTER DATABASE dbname REMOVE FILE 通常会成功。完成后,您可以发出ALTER DATABASE dbname REMOVE FILEGROUP

    【讨论】:

    • Jacob,AFAIK 数据不需要被垃圾收集以删除文件流文件。必要的是任何表都没有使用该文件(请参阅我的回复)。另外请注意,CHECKPOINT 只会在简单的恢复模式下强制 GC,它仍然只会强制执行一次 GC,这可能不会收集所有符合条件的文件。
    【解决方案5】:

    @inam - 我的情况有点不同;我创建了第二个文件组并将聚集索引移至其中。此后,我删除了辅助文件组中的聚集索引。之后我试图删除文件组,但我一直收到错误,文件组不是空的。

    我看到其他一些帖子表明将数据移动到同一文件组中的另一个文件。这里的问题是我的文件组中只有一个文件,我想删除文件组和其中的文件。

    我想出的解决方法如下。 我将table1中的所有记录复制到table2中(select * into table2 from table1)

    然后我删除了table1;此后,我能够删除 filegroup2 和 数据文件。

    最后我将table2重命名为table1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多