症状
请考虑以下情况:
-
Microsoft SQL Server 2014 中有两个分区表,第一个表的分区使用相同的分区方案和函数映射到不同的文件和文件组。
-
将其中一个分区切换到第二个表,然后截断第二个表。
-
删除映射到已切换分区的文件和文件组。
-
在第二个表上运行 SELECT 语句。
在这种情况下,您会收到以下错误消息:
消息606、级别21、状态1Metadata 不一致。 为 table <表> 名称指定的不存在<文件组 id> 的文件组 id。 运行 DBCC CHECKDB 或 CHECKCATALOG。
运行 DBCC CHECKDB/CHECKTABLE 时,收到以下错误消息:
无法处理索引 <IndexName> 表 <TableName>,因为文件组(文件组 ID <FileGroupNumber>)无效。
解决方案
此问题首先在 SQL Server 的以下累积更新中修复:
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 我们建议你下载并安装 SQL Server 的最新累积更新:
注意 此修补程序仅可防止将来出现此问题。 如果您已遇到此问题,请将数据导出到一个全新数据库中,但不存在任何现有元数据损坏。 为此,请按照下列步骤操作:
-
若要确定分区是否具有无效的文件组,请运行以下查询以查看它是否返回结果:
SELECT * FROM sys.allocation_units AS au WHERE au.data_space_id NOT IN (SELECT data_space_id FROM sys.filegroups)
-
使具有元数据损坏的表再次可见。如果步骤1中的查询返回结果,则已损坏的元数据的分区将阻止你在表中的任何行中查看(选择 "* from")。 要解决此问题,请删除该错误分区。注意 坏分区应为空。 否则,文件和其所在的文件组无法被删除或删除。 若要执行此操作,请将此分区移动到使用相同分区方案的另一个表中。 此表可以只是一个虚拟表。 在步骤1中使用查询中的 container_id,并将其与 sys. 分区中的 partition_id 相匹配。 (请确保注意 partition_number。) 使用 partition_number 从 unviewable 到虚拟表的表中执行 ALTER TABLE SWITCH 分区。 虚拟表应具有相同的列集,并使用相同的分区方案。 用于查找不一致分区的查询可能如下所示:
SELECT au.container_id, au.data_space_id, p.partition_number FROM sys.partitions AS p JOIN sys.allocation_units AS au ON p.partition_id = au.container_id LEFT JOIN sys.filegroups AS fgs ON fgs.data_space_id = au.data_space_id WHERE object_id = OBJECT_ID('MyTableName') AND fgs.data_space_id IS NULL;
-
将数据从以前的 unviewable 表复制到新数据库。
状态
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。