由于突然断电等原因,数据库会被损坏,提示莫名奇妙的错误,比如连接失败,或某个系统表出现错误等。这样的数据库分为两类,一类是可以用查询分析器连接进去,这种是可以进行修复的;第二类是查询分析器连不上的,据我所知这种还没有什么修复办法。

    但凡修复一词,无论数据库还是实物,都不会像修复前那样完整,可能会造成数据丢失,或多或少的问题。下面是我工作当中修复数据库的一点经验,分为几个步骤,如果前面的步骤就可以解决,不必往下进行。

   第一步,只是某个表损坏。修复语句为: 

  ==================================================

  --修复数据库的某个表
  --用下面的语句进行修复  
   

exec sp_dboption   '数据库名',   'single user',   'true'   

    Go       

    DBCC CHECKTABLE('表名',repair_allow_data_loss)   

    go       

    sp_dboption   '数据库名',   'single user',   'false'   

    Go

  ==================================================

  根据我的经验,一般用户表修复的几率比较大,系统表修复的几率比较小;

 

  第二步,错误不确定是那个或哪几个表,或任何其他错误,按照数据库损坏来修复。修复语句为:

  ==================================================

  --修复整个数据库
  --用下面的语句进行修复  
   

ALTER DATABASE [数据库名] SET SINGLE_USER

  GO

  DBCC CHECKDB('数据库名',repair_allow_data_loss) WITH TABLOCK

  GO

  ALTER DATABASE [数据库名] SET MULTI_USER

  G

O

  ==================================================

 

  第三步,以上两种都试过不行,可以用导入导出功能。

  方法是新建一个空表数据库,从损坏的数据库中把表结构和数据导过来,也可以先在原数据库中生成sql脚本,在空数据库中执行先建立数据库结构然后只导数据,这样的成功率高一些。导入的时候可能会遇到错误提示,比如提示某个表有错误,可以暂时不导这个,单独处理。这部分可以灵活处理。

  第四步,导出导入功能也不行,就是老提示错误,怎么都导不了,那就这样做:

  1、建立一个空白数据库,我们叫库1,在原数据库中执行这个数据转移语句:select * into [库1].[dbo].[表名] from 表名,这个语句只会将表的字段和表中的数据转移过去,不会复制约束索引,所以一般都可以复制过去;

  2、建立第二个空白数据库,我们叫库2,用原数据库的sql脚本建立结构,然后用导入导出功能将库1的数据到入到库2.

  这个方法一般数据库都可以解决。

  第五步,能保留多少算多少。以上皆行不通,那就看能留下什么算什么吧。