今天突然数据库中有几张表查询不了,一查询出现错误。
提示错误:
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' 有重复的键,所以 CREATE UNIQUE INDEX 语句终止。重复的键值为 (796121)。
根据提示说明索引损坏了,主键出现重复值,
解决方法就是删除重复主键记录。
此时发现执行查询命令不会出错了,于是我利用sql语句查询
重复记录。
select [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数据库出现的一致性错误恢复了。