使用DBCC CHECKTABLE 修复表错误!

DBCC CHECKTABLE ("MyTable");  
MyTable的 DBCC 结果。  
消息 8978,级别 16,状态 1,  
第 1 行表错误: 对象 ID 2105058535,  
索引 ID 1,分区 ID 72057594057129984,  
分配单元 ID 72057594061717504 (类型为 In-row data)。  
页 (1:4123189) 缺少上一页 (1:4124391) 对它的引用。  
可能是因为链链接有问题。消息 2533,级别 16,状态 1,  
第 1 行表错误: 看不到分配给对象 ID 2105058535,索引 ID 1,分区 ID 72057594057129984,  
分配单元 ID 72057594061717504 (类型为 In-row data)的页 (1:4124391)。  
该页可能无效,或者页头中可能包含错误的分配单元 ID。  
消息 8976,级别 16,状态 1,  
第 1 行表错误: 对象 ID 2105058535,  
索引 ID 1,分区 ID 72057594057129984,分配单元 ID 72057594061717504 (类型为 In-row data)。  
在扫描过程中未发现页 (1:4124391),但该页的父级 (1:5670805) 和上一页 (1:3416990) 都引用了它。  
请检查以前的错误消息。对象 'MyTable' 的 90654 页中有 4290601 行。  
CHECKTABLE 在表 'MyTable' (对象 ID 2105058535)中发现 0 个分配错误和 3 个一致性错误。  
对于由 DBCC CHECKTABLE (Test.dbo.MyTable)发现的错误,repair_allow_data_loss 是最低的修复级别。  
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。  
网上找的修复方法为: (但是这种方法会造成数据丢失)  
  
  
use master     
declare @databasename varchar(255)     
set @databasename='需要修复的数据库实体的名称'     
exec sp_dboption @databasename, N'single', N'true' --将目标数据库置为单用户状态     
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)     
dbcc checkdb(@databasename,REPAIR_REBUILD)     
exec sp_dboption @databasename, N'single', N'false'--将目标数据库置为多用户状态   
  
use 需要修复的数据库实体的名称    
declare @dbname varchar(255)    
set @dbname='需要修复的数据库的名称'    
exec sp_dboption @dbname,'single user','true'    
dbcc checktable('需要修复的数据表的名称',REPAIR_ALLOW_DATA_LOSS)    
dbcc checktable('需要修复的数据表的名称',REPAIR_REBUILD)    
------把’ 需要修复的数据表的名称’更改为执行DBCC CHECKDB时报错的数据表的名称    
exec sp_dboption @dbname,'single user','false'   
  
  
我的想法是 新建一张同样的表,然后把旧表中的数据导入。  
然后将新表改名为旧表名。这种方法目前测试失败.  
 现在的办法是 建立一个同名后缀为His的新库,下图中红色地方。保存原库中的历史数据,以减小原库大小。

不知道是否还有其他更好的方法 


你可能感兴趣的:(SQL,SERVER,维护)