症状
请考虑以下情形:
- 在 Microsoft SQL Server 2014 中有两个分区表,第一个表的分区使用相同的分区方案和函数映射到不同的文件和文件组。
- 将其中一个分区切换到第二个表,然后截断第二个表。
- 删除映射到已切换分区的文件和文件组。
- 在第二个表上运行 SELECT 语句。
在这种情况下,您会收到以下错误消息:
注意
消息 606,级别 21,状态 1
元数据不一致。 为表<表名>指定的文件组 ID< 文件组 ID > 不存在。 运行 DBCC、CHECKDB 或 CHECKCATALOG。
运行 DBCC CHECKDB/CHECKTABLE 时,收到以下错误消息:
注意
无法处理表 <TableName> 的索引 <IndexName>,因为文件组 (文件组 ID <FileGroupNumber>) 无效。
解决方法
此问题已首先在 SQL Server 的以下累积更新中修复:
建议:安装 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 中的查询返回结果,则元数据损坏的分区会阻止你查看 (从表中) 任何行中选择 *。 要解决此问题,请删除该错误分区。
注意 错误分区应为空。 否则,不可能删除或删除其所在的文件和文件组。
为此,请将此分区移动到使用相同分区方案的另一个表中。 此表可以只是一个虚拟表。 使用步骤 1 中查询的container_id,并将其与 sys.partitions 中的partition_id匹配。 (请务必记下 partition_number。) 使用 partition_number 从无法查看到虚拟表的表执行 ALTER TABLE SWITCH PARTITION。 虚拟表应具有相同的列集并使用相同的分区方案。 用于查找不一致分区的查询可能类似于以下内容:
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;将数据从以前无法查看的表复制到新数据库中。
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。