sql2005/2008数据库一致性错误恢复

今天一个客户网站忽然打不开了,数据库查询出现错误。共有约1.8G大小,头大了!
提示错误:
1 当前命令发生了严重错误。应放弃任何可能产生的结果
2 SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 1:21802,但实际为 34049:134765344)。在文件 'F:\Program Files (x86)\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test.MDF' 中、偏移量为 0x0000000aa54000 的位置对数据库 ID 7 中的页 (1:21802) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。

提示:一般情况下,引起分配错误的原因是磁盘损坏或突然停电;一致性错误可能是数据库中的表或索引坏,一般都可修复。

按照修复提示执行DBCC CHECKDB,步骤如下:
1  设置成单用户模式  EXEC sp_dboption '数据库名称', 'single user', 'TRUE'
2   修复数据库   dbcc checkdb('数据库名称',repair_allow_data_loss)
执行完命令2提示如下:(红色字部分)因为发现对象名称 'dbo.table' 和索引名称 'PK_table' 有重复的键,所以 C-R-E-A-T-E UNIQUE INDEX 语句终止。重复的键值为 (796121)。
根据提示说明索引损坏了,主键出现重复值,解决方法就是删除重复主键记录。
此时发现执行查询命令不会出错了,于是我利用sql语句查询重复记录。
s-e-l-e-c-t [id] from tablename group by [id] having COUNT(1)>1

可是查询结果显示为空,纳闷了?于是打算先取消id的索引,不要设置成主键试试看,在执行相同命令重复id记录出现了。于是执行delete命令,重复记录被删除干净了。
3   在次执行   dbcc checkdb('数据库名称',repair_allow_data_loss)
执行完命令3提示如下:CHECKDB 在数据库 'test' 中发现 0 个分配错误和 0 个一致性错误。问题解决了高兴啊!!!
4  恢复成多用户模式  EXEC sp_dboption '数据库名称', 'single user', 'false'
5   回复索引,再次把id设置成主键,由于记录达到百万条,保存时出错,提示创建索引超时。于是百度,找到解决方法:
在更改数据量大的表格数据结构时,不要点“保存”按钮,而是在表结构编辑框左侧点右键===》选择“生成更改脚本”,这时出来了文本对话框,把里面的内容全选并复制,并关闭这个表,选择不保存,右击该表所属的数据库,选“新建查询”,之后Ctrl+V把刚复制的脚本粘进来,并运行。这样就再也不会弹出超时的提示了,如果数据量相当大,我们只需要耐心等待即可了!  
sql2008数据库一致性错误恢复

至此sql2008数据库出现的一致性错误恢复了。


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: 323
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭