请叫邹大哥及各位前辈(系统掉电导致SQL2005数据库基于一致性的逻辑 I/O 错误)

Leshami
博客专家认证
2009-09-07 10:34:37
各位前辈:
因系统掉电导致数据库异常,
1.select * from bond_head
提示:
消息 824,级别 24,状态 2,第 1 行
SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 1:12775,但实际为 0:0)。在文件 'D:\QQ\Users\645746311\FileRecv\ECustom_Data.MDF' 中、偏移量为 0x000000063ce000 的位置对数据库 ID 10 中的页 (1:12775) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。

2.dbcc dbreindex('dec202_list','',80)
提示:
消息 601,级别 12,状态 3,第 1 行
由于数据移动,无法继续以 NOLOCK 方式扫描。

3.dbcc checkdb('ecustom_gjh',repair_allow_data_loss) with tablock,no_infomsgs;
消息 8909,级别 16,状态 1,第 1 行
表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID -9223352077839761408 (类型为 Unknown),页 ID (1:13243) 在其页头中包含错误的页 ID。页头中的 PageId = (39:304550400)。
修复此错误要求首先修正其他错误。
………………………

CHECKDB 在表 'BOND_HEAD' (对象 ID 1926349977)中发现 0 个分配错误和 94 个一致性错误。
CHECKDB 在数据库 'ecustom_gjh' 中发现 0 个分配错误和 2708 个一致性错误。

4.dbcc checktable ('bond_head',repair_allow_data_loss) with NO_INFOMSGS,TABLOCK
消息 8909,级别 16,状态 1,第 1 行
表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID -7517644673094582272 (类型为 Unknown),页 ID (1:13012) 在其页头中包含错误的页 ID。页头中的 PageId = (15:0)。
修复此错误要求首先修正其他错误。
………………………
CHECKTABLE 在表 'BOND_HEAD' (对象 ID 1926349977)中发现 0 个分配错误和 94 个一致性错误


请各位大侠给出招,谢谢了!


...全文
1087 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnnike 2009-11-21
  • 打赏
  • 举报
回复
我也遇到过这种错误,一般我是建一个结构完全相同的表,然后把问题表中能够查处的数据导出到这个新表中,然后drop掉这个问题表。当然我面的都是有备份且数据量不大的库。
lao_bulls 2009-09-08
  • 打赏
  • 举报
回复
顶。
pbsh 2009-09-08
  • 打赏
  • 举报
回复
如果文件损坏严重,这些通过检查进行自动修复的方法可能就不起作用了。
用备份直接恢复吧。
oflying907 2009-09-08
  • 打赏
  • 举报
回复
mark
FOT_SQLServer 2009-09-08
  • 打赏
  • 举报
回复
楼主数据库损坏是比较严重的,根据错误信息看,通过常规的修复似乎很难修复的。
数据库恢复模式是什么?是否有备份恢复策略?如果有,如果有从备份还原吧,
这样做最简单。如果没有,可以把数据库设置成紧急模式,再试试是否可以修复部分错误。
如果有重要资料无法读取出来,可以联系我,我可以帮你看看是否有可能把数据导出。

QQ:1209667578
soft_wsx 2009-09-07
  • 打赏
  • 举报
回复
SQL Server 2005数据库日志文件损坏的情况下如何恢复数据库
1)SQL Server 2005数据库删除日志文件

DUMP TRANSACTION DatabaseName WITH NO_LOG;declare @fileid int;select

@fileid=fileid from sysfiles where name like '%Log';dbcc shrinkfile(@fileid)



2)在某些偶然的情况下,会引起SQL Server 2005数据库日志文件的损坏,比如:硬件故障、计算机非正常重启或关机。
当SQL Server 2005数据库日志文件损坏时,可能会出现以下情况:
1、在SQL Server Management Studio中显示数据库处于置疑(suspect)状态。
2、事件日志可能会出现如下错误信息:
Could not redo log record (21737:686:9), for transaction ID (0:2334886), on page (1:37527), database 'Test' (database ID 15). Page: LSN = (21735:299:5), type = 2. Log: OpCode = 3, context 19, PrevPageLSN: (21737:615:1). Restore from a backup of the database, or repair the database.

During redoing of a logged operation in database 'Test', an error occurred at log record ID (76116:286:2). Typically, the specific failure is previously logged as an error in the Windows Event Log service. Restore the database from a full backup, or repair the database.
3、无法分离数据库
4、用CREATE DATABASE DBName ON ( FILENAME = N'DBFile' ) FOR ATTACH_REBUILD_LOG附加数据库时出现提示:The log cannot be rebuilt because the database was not cleanly shut down.

恢复方法:
1、停止数据库服务。
2、将需要恢复的数据库文件复制到另外的位置。
3、启动数据库服务。
4、确认要恢复的数据库文件已经成功复制到另外的位置,然后在SQL Server Management Studio中删除要恢复的数据库。
5、新建同名的数据库(数据库文件名也要相同)。
6、停止数据库服务。
7、用第2步中备份的.mdf文件覆盖新数据库的同名文件。
8、启动数据库服务。
9、运行alter database dbname set emergency,将数据库设置为emergency mode
10、运行下面的命令就可以恢复数据库:


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'--将目标数据库置为多用户状态

上面的方法是通过.mdf文件恢复数据库,即使log文件丢失也可以恢复。
soft_wsx 2009-09-07
  • 打赏
  • 举报
回复
当使用 NOLOCK 锁定提示或设置为 READ UNCOMMITTED 的事务隔离级别扫描时,可能会删除扫描当前位置处的页。当这种情况发生时,Microsoft® SQL Server™ 将无法继续扫描。

对策
该错误终止查询。重新提交查询或删除 NOLOCK 锁定提示,即不要用WITH (NOLOCK)。
soft_wsx 2009-09-07
  • 打赏
  • 举报
回复
如果有数据备份,删除当前数据库,并还原数据库

ks_reny 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
拷贝MDF,LDF文件后,然后删除这个库,重新进行附加数据库.
[/Quote]
同意大烏龜,先把這個MDF,LDF文件看能否附加到其他數據庫中?
lihan6415151528 2009-09-07
  • 打赏
  • 举报
回复
系统断电。。没有UPS么?
dawugui 2009-09-07
  • 打赏
  • 举报
回复
拷贝MDF,LDF文件后,然后删除这个库,重新进行附加数据库.
--小F-- 2009-09-07
  • 打赏
  • 举报
回复
USE MASTER
GO
sp_dboption ‘databaseName’, ’single user’, ‘true’
Go
DBCC CHECKDB(’databaseName’, REPAIR_REBUILD)
Go
USE databaseName
go
exec sp_msforeachtable ‘DBCC CHECKTABLE(''’?''’,REPAIR_REBUILD)’
go
sp_dboption ‘databaseName’, ’single user’, ‘false’
Go
如果还不行,可以采用允许丢失数据的方式修复,如下:
USE MASTER
GO
sp_dboption ‘databaseName’, ’single user’, ‘true’
Go
DBCC CHECKDB(’databaseName’, REPAIR_ALLOW_DATA_LOSS)
Go
USE databaseName
go
exec sp_msforeachtable ‘DBCC CHECKTABLE(''’?''’,REPAIR_REBUILD)’
go
sp_dboption ‘databaseName’, ’single user’, ‘false’
Go



复制如下命令,写入记事本,保存为:运行CHKDSK.bat 双击运行,完了重启电脑.一般能解决的.
@ECHO OFF
for %%1 in (c: d: e: f: G: h: i: j: k: l: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:) do (if exist %%1 ECHO Y|chkdsk %%1 /R /x)
@pause
guguda2008 2009-09-07
  • 打赏
  • 举报
回复
这个。。。帮顶。。。
you_tube 2009-09-07
  • 打赏
  • 举报
回复
用日志恢复损坏页试试....
soft_wsx 2009-09-07
  • 打赏
  • 举报
回复
同情,问下bill
Leshami 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 dlcyj 的回复:]
在文件 'D:\QQ\Users\645746311\FileRecv\ECustom_Data.MDF' 中、偏移量为 0x000000063ce000 的位置对数据库 ID 10 中的页 (1:12775) 执行 读取 期间,发生了该错误。

提示一个页发生读取错误,其实这只是第一个页,SQL的机制是遇到错误已经停止,只能报第一个错误,所以,你在SQL中用DBCC来修复的可能性非常小。
[/Quote]
那请问有什么别的办法没?
晕,没有备份.............
dlcyj 2009-09-07
  • 打赏
  • 举报
回复
在文件 'D:\QQ\Users\645746311\FileRecv\ECustom_Data.MDF' 中、偏移量为 0x000000063ce000 的位置对数据库 ID 10 中的页 (1:12775) 执行 读取 期间,发生了该错误。

提示一个页发生读取错误,其实这只是第一个页,SQL的机制是遇到错误已经停止,只能报第一个错误,所以,你在SQL中用DBCC来修复的可能性非常小。
xiequan2 2009-09-07
  • 打赏
  • 举报
回复
1:有备份最好,直接还原

2:用以上的方法先试试,多次修复

3:有些硬件损坏用dbcc是搞不定的,建议找这方面的专业公司
lihan6415151528 2009-09-07
  • 打赏
  • 举报
回复

SQL Server 2005数据库日志文件损坏的情况下如何恢复数据库
1)SQL Server 2005数据库删除日志文件

DUMP TRANSACTION DatabaseName WITH NO_LOG;declare @fileid int;select

@fileid=fileid from sysfiles where name like '%Log';dbcc shrinkfile(@fileid)


2)在某些偶然的情况下,会引起SQL Server 2005数据库日志文件的损坏,比如:硬件故障、计算机非正常重启或关机。
当SQL Server 2005数据库日志文件损坏时,可能会出现以下情况:
1、在SQL Server Management Studio中显示数据库处于置疑(suspect)状态。
2、事件日志可能会出现如下错误信息:
Could not redo log record (21737:686:9), for transaction ID (0:2334886), on page (1:37527), database 'Test' (database ID 15). Page: LSN = (21735:299:5), type = 2. Log: OpCode = 3, context 19, PrevPageLSN: (21737:615:1). Restore from a backup of the database, or repair the database.

During redoing of a logged operation in database 'Test', an error occurred at log record ID (76116:286:2). Typically, the specific failure is previously logged as an error in the Windows Event Log service. Restore the database from a full backup, or repair the database.
3、无法分离数据库
4、用CREATE DATABASE DBName ON ( FILENAME = N'DBFile' ) FOR ATTACH_REBUILD_LOG附加数据库时出现提示:The log cannot be rebuilt because the database was not cleanly shut down.

恢复方法:
1、停止数据库服务。
2、将需要恢复的数据库文件复制到另外的位置。
3、启动数据库服务。
4、确认要恢复的数据库文件已经成功复制到另外的位置,然后在SQL Server Management Studio中删除要恢复的数据库。
5、新建同名的数据库(数据库文件名也要相同)。
6、停止数据库服务。
7、用第2步中备份的.mdf文件覆盖新数据库的同名文件。
8、启动数据库服务。
9、运行alter database dbname set emergency,将数据库设置为emergency mode
10、运行下面的命令就可以恢复数据库:


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'--将目标数据库置为多用户状态

加载更多回复(10)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧