总结步骤如下:
1、检测数据库, 使用命令(Dbcc checkdb) 拿到数据库后附加到本地 SQLserver 使其运行,打开企业管理器,查看它。 同时打开查询分析器,在里面输入Dbcc checkdb 检测数据库命令然后回车 即可以看到数据库的分析资料看到问题, 评注:拿到问题先不要盲目的卸载 SQLServer,本次因为新手,上手后就把 数据库卸载,这样就耗费了一天的时间,过没有任何作用,测试服务器的完整性 可以拿一个好的数据库做对比,自己可以建一个“test”,如果测试数据库运行 正常,则不需要对服务器做任何改动。千万不要改动系统,麻烦会更大。 提示:错误会以红色显示。
2、简单修复:命令:dbcc checkdb 输入以下两句尝试修复。
DBCC CHECKDB("数据库名",repair_allow_data_loss)
DBCC CHECKDB("数据库名",repair_rebuild)
不管他究竟哪里错了, 先用这两句试试一般的索引系统文件丢失, SQLserver 都可以解决这个问题,基本就差不多了。但是对于主键索引损坏,这个命令基本 修不好,所以对一个满身是伤的数据库,他可以修复 70%。
注:修复时系统提示必须要在单用户模式下才可以生效,用户可以去企业管 理器,对要修理的数据库:右击属性-选项-限制访问-单用户。也可以使用以下语句实现:
ALTER DATABASE 数据库名 SET single_USER
GO
---改为单用户
ALTER DATABASE 数据库名 SET MULTI_USER
GO
---改为多用户
继续使用 dbcc checkdb 检测,如果继续报错。 再次运行: DBCC CHECKDB("DataBasename") with NO_INFOMSGS,PHYSICAL_ONLY 然后再运行: DBCC CHECKDB(" DataBasename ",repair_allow_data_loss) WITH TABLOCK
再次运行:DBCC CHECKDB("DB name")
系统显示修复成功,说明本次问题主 要由索引等数据库系统本身问题引起,这样的修复可能会导致数据丢失,但是绝 对不会是大批丢失,基本没有影响。
3、检测表:命令:dbcc checktable(‘tablename’) 接上述检测提示:我们可以看到一个 id 号,这个基本就是这个错误的表在 系统表“sysobjects”里面的注册信息。
输入如下语句即可以看见: select * from sysobjects where id=1205579333(错误提示号码)
接下来检测这张表究竟是什么问题。 输入:
dbcc checktable(‘tablename’)
接下来将会得到一些错误提示,基本上就是检测表的时候那些,提示什么 B 树错误, 父节点, 子节点错误, 这些都别管, 因为这个可能就是索引引起的错误:
尝试用下列语句修复: DBCC CHECKtable("Tablename",repair_rebuild)
执行完后查看提示:如果出现下面的提示 CREATE UNIQUE INDEX 终止,因为发现了索引 ID 1 的重复键。最重要的主 键为 "3"。这里基本上就可以确定就是索引出的问题,而且数据表没有被修复的 可能很可能就是内容产生的问题。根据提示,我们得出的结论就是主键重复。 这是我们使用 select 查询语句是看不到的甚至表里面打开也没有反映。此时, 关闭查询分析器, 打开企业管理器, 找到那个数据表, 然后右击选择设计表, 选择主键,右击,取消主键,回到查询分析器,找到该表,右击选择索引,这时 候表以前所有的索引都能看见了,但是上面的唯一性选项很明显没有了,然后给 表里面添加一个新的字段,字段名 id 需要生成编号:
语句如下: alter table t_item add id integer identity 该字段用完后删除,语句如下:
alter table t_item drop column id
在查询分析器这里右击索引,选择唯一性选项,然后点击确定,系统会提示 重复键,和最重要的主键 ID,根据 id 数字,进行查询 如提示最重要的键值是 3 则, select * from t_item where fitemid=3 有时候查询的结果,是合法的,比如这个 3 可能只有一条,这个时候,就右 击索引,点击编辑勾选唯一性,在列上面去掉一个,从上往下第一个开始,但是 必须记住他的名字,最好写下来,这时候,你会发现错误信息里面的 ID 换成了 另外一个数字, 继续用 select 语句查询该数字, 字段仍然是该表的第一个字段, 你会发现他有两条, 仔细对比这两条, 什么都是一样的, 每一个字段的值都一样, 这显然不符合逻辑,用刚才添加的 id 记录删除一条,
语句如下: Delete tablename where id=两着任何一个,删除完后, 右击恢复刚才被点掉的那一条列名,勾选上唯一性,点击确定,则正常,回 到企业管理器,打开表设计,设置主键。完成。 回到查询分析器,输入 dbcc checktable
显示正常,再次检测数据库,显 示正常。删除刚才增加的列,修复完成。 结论:修复这类数据表,别急着导出数据,新建库文件,这个应该还不到那 一步,最好就是能这样修复,少动干戈,如果是主键重复,你导出数据,在把这 个错误的数据倒进来(这里假设能正常导入) ,表的错误会依然存在。