修复 ︰ 元数据不一致错误后切换表分区并删除相应的文件和文件组

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 3095958
症状
请考虑以下情形:
  • 您有两个分区的表中 Microsoft SQL Server 2014 年,第一个目录的分区使用相同的分区方案和函数映射到不同的文件和文件组。
  • 这些分区之一切换到第二个表,然后您截断第二个表。
  • 不删除文件和文件组映射到交换分区。
  • 第二个表上运行 SELECT 语句。
在此方案中,您将收到以下错误消息:

消息 606,级别 21,状态 1
元数据不一致。文件组 id文件组 id> 为表指定表名> 不存在。运行 DBCC CHECKDB 或 CHECKCATALOG。

当您运行 DBCC CHECKDB/存在时,您会收到以下错误消息 ︰

无法处理索引IndexName> 的表表名> 因为文件 (文件组 ID 组FileGroupNumber>) 是无效的。
解决方案
在 SQL Server 中的以下累积更新首先修复问题 ︰ 建议 ︰ 设置 SQL Server 的累积更新
SQL Server 的每个新累积更新包含所有修补程序和所有安全修补程序,已包含在以前的累积更新。我们建议您下载并安装最新的累积更新 SQL Server:


注意:此修复程序只是防止将来发生此问题。如果您已经遇到此问题,请将数据导出到新的数据库,而无需任何现有的元数据损坏。若要执行此操作,请按照下列步骤操作:
  1. 要确定分区是否有无效的文件组,请运行下面的查询,以确定它是否返回结果 ︰
    SELECT * FROM sys.allocation_units AS au WHERE au.data_space_id NOT IN (SELECT data_space_id FROM sys.filegroups)
  2. 再次进行元数据损坏的表可查看。

    如果第 1 步中的查询返回一个结果,有损坏的元数据分区阻止您查看 (选择 * 从) 表中的所有行。若要变通解决此问题,请删除该错误的分区。

    不正确的分区应为空。否则为文件和文件组时,可以不放或删除了。

    来做到这一点,请将此分区移动到另一个表中使用相同的分区方案。此表可以只是一个虚拟表。使用查询从 container_id 中步骤 1,并将它从 sys.partitions partition_id 与匹配。(确保您注意 partition_number。)使用 partition_number 查看虚拟表的表中执行变更表交换机分区。Dummy 表应具有相同的列集,并使用相同的分区方案。您的查询,以查找不一致的分区可能会如下所示 ︰

    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;
  3. 将数据复制从以前查看的表到新的数据库。
状态
Microsoft 已经确认这是"适用于"一节中列出的 Microsoft 产品中的问题。

警告:本文已自动翻译

属性

文章 ID:3095958 - 上次审阅时间:04/12/2016 02:13:00 - 修订版本: 2.0

Microsoft SQL Server 2014 Service Pack 1

  • kbfix kbqfe kbexpertiseadvanced kbsurveynew kbmt KB3095958 KbMtzh
反馈