当SQL Server 2005数据库的日志文件损坏,而数据文件完好的时候,数据库出现质疑状态,怎么恢复呢?
下面就讲一下具体的过程:
1.首先停止服务器: NET STOP MSSQLSERVER
2.把日志文件挪走
3.开启服务器: NET START MSSQLSERVER
4.修改数据库为紧急模式,并修改数据库为单用户模式
alter database 数据库名 set emergency
go
alter database 数据库名 set single_user
go
5.开始修复
dbcc checkdb(数据库名,REPAIR_ALLOW_DATA_LOSS)
go
dbcc checkdb(数据库,REPAIR_REBUILD)
go
dbcc checkdb(数据库)
go
6.修改数据库为多用户模式
alter database 数据库名 set multi_user
至此数据库恢复正常状态。
下面对修复时设置和一些修复选项做一下介绍:
1.在使用:REPAIR_ALLOW_DATA_LOSS 、REPAIR_REBUILD选项是,数据库必须处于单用户模式,这就是进行上述第4点的原因。
2.REPAIR_ALLOW_DATA_LOS:尝试修复所有错误,但是有可能会有一些数据丢失。
3.REAPIR_REBUILD:执行次要的、快速修复(修复非聚集索引的额外键),耗时的修复(重建索引)。
4.具体的选项说明可以参考:http://msdn.microsoft.com/zh-cn/library/ms176064(v=SQL.90).aspx,写得很详细。
下面是一个具体的例子:
sql查询出问题?
http://bbs.csdn.net/topics/390658107?page=1#post-396242501
1.
数据库是sql2000,有张表数据60多个字段,数据有250万条左右,这几天已通过sql查询分析器来查询就出问题了。查数据少点好像是可以的。
报错是:
服务器: 消息 7987,级别 22,状态 3,行 1
在数据库 'A-bus' 中检测到一个可能的数据库一致性问题。应该对数据库 'A-bus' 运行 DBCC CHECKDB 和 DBCC CHECKCATALOG。
连接中断
我看到网上的方法做
alter database [A-bus] set single_user
dbcc checkdb('A-bus',repair_rebuild)
alter database [A-bus] set multi_user
但运行了30多分钟了还没有反应。
还有我把A-bus这个数据库里的一张表数据导出到时大概导到240万条时就不动了,一直是这个界面。那可怎么办啊?我把那张表里的某个字段的数据类型从nvarchar 32 改成varchar 10也不行,有提示:
- 无法修改表。
ODBC 错误: [Microsoft][ODBC SQL Server Driver][SQL Server]SqlDumpExceptionHandler: 进程 51 发生了严重的异常 c0000005 EXCEPTION_ACCESS_VIOLATION。SQL Server 将终止该进程。
[Microsoft][ODBC SQL Server Driver][SQL Server]
[Microsoft][ODBC SQL Server Driver][SQL Server]Location:logrec.cpp:501
Expression: FALSE
SPID: 51
Process ID: 2812
Description: Invalid switch value
2.
我用dts和bcp导数据都少了4万多条数据,初步分析少了最近一个多月的数据。
但在错误表里精确查询最近的数据是有的,现在怎么把这个4万多条数据导出来。
还有我用dbcc checkdb('A-bus') WITH PHYSICAL_ONLY执行后有报错如下:
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 2057058364,索引 ID 0: 未能处理页 (1:346127)。详细信息请参阅其它错误。
服务器: 消息 8944,级别 16,状态 1,行 1
表错误: 对象 ID 2057058364,索引 ID 0,页 (1:346127),行 0。
测试(columnOffsets->offTbl [varColumnNumber] <= (nextRec - pRec))失败。
值为 517 和 501。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 2057058364,索引 ID 0: 未能处理页 (1:346128)。详细信息请参阅其它错误。
服务器: 消息 8939,级别 16,状态 1,行 1
表错误: 对象 ID 2057058364,索引 ID 0,页 (1:346128)。测试(*(((int*) &m_reservedB) + i) == 0)失败。值为 1 和 108。
'A-bus' 的 DBCC 结果。
对象 'bus_info' 有 0 行,这些行位于 0 页中。
CHECKDB 发现了 0 个分配错误和 4 个一致性错误(在表 'bus_info' 中,该表的对象 ID 为 2057058364)。
CHECKDB 发现了 0 个分配错误和 4 个一致性错误(在数据库 'A-bus' 中)。
repair_allow_data_loss 是最低的修复级别(对于由 DBCC CHECKDB (A-bus ) 发现的错误而言)。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
3.通过repair_allow_data_loss选项修复
我修复好了。
你指的影响是什么?
修复好了这张表还能继续用吗?
要经常用用dbcc checkdb('数据库名')来检测吗?这样检测会对数据有影响吗?
数据的确有丢失。大概有20多条记录。
回复:
影响就是会有少量的数据都是,“修复允许数据丢失”,应该是可以继续用的,你select一下试试,
不过最好是重新导出一份数据。
还有你说的对,确实得经常的dbcc checkdb一下,来检测数据的,
不过这个操作最好是在晚上进行,否则会很慢,如果是晚上 可以加上 with tablock,
那么速度可以提升好几倍。
本文出自 “探索SQLServer” 博客,请务必保留此出处http://yupeigu.blog.51cto.com/3323001/1368147