sql - 使用 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 服务用户才能访问和删除它。
有没有人有一些提示出了什么问题以及我该如何解决这个问题?
解决方案
推荐阅读
- reactjs - 如何将简单的 CSS 转换为 React 的 makeStyles?
- java - SpringData 查找最后插入的所有条目
- javascript - TypeScript:如何使用动态键和动态深度键入对象
- python - Autoplotter Python 库与 Django Python Web 框架的集成
- google-cloud-platform - 通过 terraform 将 oidc 提供程序部署到 gcp 时,如何配置“授权域”?
- javascript - 如何从 DomPurify 中的 iframe 中删除滚动条?
- java - 当数据库中的数据使用 apache lucene 发生变化时更新索引
- laravel - Laravel 中的 IP 地址不匹配
- aws-lambda - AWS SAM - 为有条件创建的资源应用策略模板
- android - Android 平板电脑中的底部导航重叠 TextView