首页 > 解决方案 > 使用 FILESTREAM 时删除数据库有时会失败

问题描述

我正在使用 Microsoft SQL Server 2012 (SP3) 并拥有使用 FILESTREAM 功能的数据库,该功能会将数据存储到某些列的单独文件中。数据库看起来像:

CREATE DATABASE [MyDatabase]
GO

ALTER DATABASE [MyDatabase] 
    ADD FILEGROUP [FileStreamDataFileGroup] CONTAINS FILESTREAM 
GO

ALTER DATABASE [MyDatabase] 
    ADD FILE ( NAME = N'MyDatabase_FileStreamData', 
               FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11\MSSQL\DATA\MyDatabase-FileStreamData'
             ) TO FILEGROUP [FileStreamDataFileGroup]
GO

CREATE TABLE [MyDatabase].[dbo].[MyTable] 
(
    [Id]      BIGINT           NOT NULL,
    [DataId]  UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL,
    [Content] VARBINARY (MAX)  FILESTREAM NULL,

    CONSTRAINT [PK__PredictionModel] PRIMARY KEY CLUSTERED ([Id] ASC),
    UNIQUE NONCLUSTERED ([DataId] ASC)
) FILESTREAM_ON [FileStreamDataFileGroup];
GO

我运行不断创建新数据库的测试,然后运行测试并删除它们。SQL 服务器负载很重,因为测试在多个数据库上并行运行。在极少数情况下 (<1%) 数据库删除失败并出现错误:

无法删除文件“C:\Program Files\Microsoft SQL Server\MSSQL11\MSSQL\DATA\MyDatabase-FileStreamData”。有关详细信息,请参阅 SQL Server 错误日志。

SQL Server 日志显示以下日志:

操作系统在“stmfilemgr.cpp”的“C:\Program Files\Microsoft SQL Server\MSSQL11\MSSQL\DATA\MyDatabase-FileStreamData”上尝试“StreamFileMgr::DoDeleteFsFile”时返回错误“5(拒绝访问)” (5314)。

操作系统在“C:\Program Files\Microsoft SQL Server\MSSQL11\MSSQL\DATA\MyDatabase-FileStreamData\8a803ce2-3e97-4d60-8aa1-e704d858aae9 上尝试“RemoveDirectory”时返回错误“5(拒绝访问)” \c802f11a-9c13-4040-9e53-bcd3c67b7960' 在“storage.cpp”(851)。

操作系统在“C:\Program Files\Microsoft SQL Server\MSSQL11\MSSQL\DATA\MyDatabase-FileStreamData\8a803ce2-3e97-4d60-8aa1-e704d858aae9 上尝试“RemoveDirectory”时返回错误“5(拒绝访问)” \c802f11a-9c13-4040-9e53-bcd3c67b7960' 在“storage.cpp”(851)。

操作系统在“C:\Program Files\Microsoft SQL Server\MSSQL11\MSSQL\DATA\MyDatabase-FileStreamData\8a803ce2-3e97-4d60-8aa1-e704d858aae9 上尝试“RemoveDirectory”时返回错误“5(拒绝访问)” \c802f11a-9c13-4040-9e53-bcd3c67b7960' 在“storage.cpp”(851)。

操作系统在“C:\Program Files\Microsoft SQL Server\MSSQL11\MSSQL\DATA\MyDatabase-FileStreamData\8a803ce2-3e97-4d60-8aa1-e704d858aae9 上尝试“RemoveDirectory”时返回错误“5(拒绝访问)” \c802f11a-9c13-4040-9e53-bcd3c67b7960' 在“storage.cpp”(851)。

数据库本身真的消失了(文件.mdf.ldf被删除了),但文件夹C:\Program Files\Microsoft SQL Server\MSSQL11\MSSQL\DATA\MyDatabase-FileStreamData仍然存在。

这是一种不一致的状态并且很难解决,因为只有 SQL Server 服务用户才能访问和删除它。

有没有人有一些提示出了什么问题以及我该如何解决这个问题?

标签: sqlsql-server

解决方案


推荐阅读