SQL Server 中的 FILESTREAM 功能可以将二进制大型对象 (BLOB) 存储到文件系统上,而不是将它们存储在数据库中。但是,默认情况下不启用此功能。用户需要使用 SQL Server Management Studio (SSMS) 和 SQL Server Configuration Manager 来启用它。启用此功能后,这些文件将存储在 FILESTREAM 文件组中。此时,可以使用 T-SQL 事务访问这些文件。
有时,修改或删除 FILESTREAM 文件夹中的文件或将文件保存到 SQL Server 数据库可能会导致 SQL Server 数据库不一致或损坏。如果 FILESTREAM 文件组已损坏,则数据库将进入“等待恢复”状态。本文将讨论可能导致 SQL Server FILESTREAM 数据库损坏的原因,并了解如何解决损坏和恢复数据库。
SQL Server 中启用 FILESTREAM 数据库损坏的原因
启用 FILESTREAM 的数据库可能会因各种原因而损坏。一些常见原因是:
- FILESTREAM 将文件引用和元数据存储在数据库中。如果 SQL 数据库本身由于硬件故障、磁盘问题等原因而损坏,则将文件链接到数据库的引用也会变得不一致。
- FILESTREAM 中的实际数据存储在文件系统上。这些数据可能会因坏扇区、磁盘故障和其他问题而损坏。
- 如果直接删除或修改数据容器内文件系统文件夹中的文件,则可能会导致文件系统与 SQL Server 不一致,从而导致 FILESTREAM 数据损坏。
如何检测 SQL Server 中启用 FILESTREAM 的数据库的损坏?
可以使用 DBCC CHECKDB 命令检测启用了 FILESTREAM 的 SQL 数据库中的损坏或物理和逻辑一致性问题。它还可以验证表的元数据与 FILESTREAM 文件系统的文件和目录之间的链接级一致性。以下是使用 DBCC CHECKDB 命令检查启用了 filestream 的数据库中的损坏的方法:
DBCC CHECKDB 'database_name';
DBCC CHECKDB 命令可以报告错误,如 7903、7904、7905、7907 等。此类错误表示由于篡改 SQL Server FILESTREAM 文件夹而发生的损坏、不一致或完整性问题。
修复启用 FILESTREAM 的 SQL Server 数据库中损坏的方法
如果启用了 FILESTREAM 的 SQL 数据库已损坏、损坏或无法访问,可以按照以下方法操作。
方法 1:从文件组备份还原
Filestream 数据存储在 FILESTREAM 文件组中。它包含称为数据容器的文件系统目录。如果在 SQL Server 中有文件和文件组备份,则可以轻松地从备份中还原数据库。在此之前,请使用 RESTORE FILELISTONLY 命令确保备份文件包含 FILESTREAM 数据。此命令显示备份中的所有文件。
以下是从 SQL Server 备份还原数据库的步骤:
- 打开 SSMS,然后在对象管理器中连接到 SQL Server 数据库引擎的相应实例。
- 单击服务器名称展开服务器树。
- 接下来,展开‘Databases’选项卡。选择一个用户数据库或展开‘System Database’。
- 单击‘System Database’,右键单击数据库,单击任务>还原>文件和文件组。
- 接下来,选择 'From database' 或 'From device' 选项来指定备份集的来源和位置。
- 在“选择要恢复的备份集”区域,选择要恢复的备份。该部分显示所选位置的所有可用备份。
- 单击“恢复文件和文件组”对话框中“选择页面”下方的“选项”页面以选择高级选项。
- 在 Restore options 面板中,选择以下选项之一:
- 还原为文件组
- 覆盖现有数据库
- 在还原每个备份之前提示
- 限制对已还原数据库的访问
- 单击 OK。
这些操作将还原数据库。可以使用以下命令找到 FILESTREAM 组的物理文件夹:
SQL
SELECT name, physical_name, state_desc, type_desc FROM sys.database_filesWHERE type_desc = 'FILESTREAM'
或者,也可以使用 Transact-SQL 命令还原文件和文件组备份。
方法 2:使用 DBCC CHECKDB 命令
如果备份已过时或不可用,则可以使用 DBCC CHECKDB 命令修复数据库带有REPAIR_ALLOW_DATA_LOSS修复选项。
- 首先,使用以下命令将数据库设置为 SINGLE_USER 模式:
ALTER DATABASE Dbtesting SET SINGLE_USER
- 接下来,使用 DBCC CHECKDB 命令修复数据库,如下所示:
DBCC CHECKDB (N ’Dbtesting’, REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS, NO_INFOMSGS;
GO
- 现在,通过执行以下命令将数据库设置为 MULTI_USER 模式:
ALTER DATABASE Dbtesting SET MULTI_USER
尽管上述 DBCC CHECKDB 命令可以修复启用了 FILESTREAM 的数据库中与损坏相关的问题,但它具有某些限制。它可能会使数据库处于逻辑不一致的状态。在修复复杂错误时,需要多次使用该命令,这是一个耗时的过程。此外,它还可能在修复数据库时解除分配行或页,从而导致数据丢失。
方法 3:使用专业的 SQL 修复工具
要精确和完整地修复数据库文件,用户可以使用专门的 SQL 修复工具,以便可以快速修复 MDF 文件。使用专业的SQL数据修复工具有助于解决 DBCC CHECKDB 命令报告的 SQL 数据库中所有与损坏相关的错误。这类软件工具拥有直观的用户界面,用户可以轻松执行修复过程。
优秀的 SQL 数据修复工具拥有的主要特点:
- 修复 MDF 和 NDF 数据库文件,而不会丢失任何数据
- 恢复所有数据库组件,包括已删除的表、键、索引、触发器和存储过程
- 支持 SQL Server FILESTREAM 数据类型、XML 数据类型、SQL Server 稀疏列、XML 索引和 SQL Server 列集属性
- 使用 PAGE 和 ROW 压缩恢复 SQL 表
- 在保存之前提供可恢复数据库对象的预览
- 支持数据库对象的选择性恢复
- 将修复后的数据库保存到新的或实时数据库以及 CSV、HTML 和 XLS 等格式
- 广泛支持各种 SQL Server 数据库版本
- 与 Windows 和 Linux 操作系统兼容
方法 4:寻求专业的数据恢复服务
专业的数据恢复服务可以快速可靠地帮助用户恢复受损的数据,同时避免数据状况进一步恶化。遇到数据危机时,第一时间寻求专业的救援,避免自行尝试,是防范人为误操作的明智选择。
总结
启用 FILESTREAM 的数据库损坏可能由于多种原因而发生。我们在上面讨论了如何在 SQL Server 中修复损坏的启用 FILESTREAM 的数据库。您可以轻松地从备份中恢复数据库。但是,如果您的备份无法访问,则可以使用 DBCC CHECKDB 命令修复数据库。但是,此方法需要您的时间和精力,并且不能保证完整的数据库恢复。因此,为了实现无缝恢复过程,请使用专业人员SQL 修复工具,例如 MS SQL 的 Stellar Repair。