SQLSERVER数据库置疑的修复,用SQL语句修复置疑数据库
SQLSERVER数据库,在断电或文件损伤等原因,容易置疑,这是国内管理软件商比较头疼的问题。
我在ERP管理系统的开发与服务客户的这十多年中,处理过的数据库置疑的情况,应该有几十次之多。
至于原因嘛,一是因为服务的客户量大;二是各地代理商遇到数据库置疑搞不定,也提交到我这里,让我来处理;三是因为时间跨度长。
SQL SERVER 2005或之前的版本(特别是SQL SERVER 2000),导致置疑的情况比较多,SQL SERVER 2008以后遇到少一些,但时不时也偶然会遇到。

当发生数据库置疑后,最简单的修复办法,就是重建数据库的日志文件,把置疑问的数据库修复为不置疑。
这是我在ERP软件给客户服务时,常使用的数据库置疑修复用的方法,分享给大家,希望对大家有用。
(注意:下面的SQL语名中的“ZPT_HOTEL”,表示是我要修复的数据库的名称,实际应用中,要替换为实际置疑的数据库名)
第一步:修复数据库置疑
--首先、打开master库
use master
GO
--第一、打开修改系统表的开关
exec sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE
GO

--第二、设置数据库状态
update sysdatabases set status=32768 where name='ZPT_HOTEL'
GO

--第三、重建LDF文件
DBCC REBUILD_LOG ('ZPT_HOTEL','c:\ZPT_HOTEL_NewLog_log.ldf')
GO

注意:c:\ZPT_HOTEL_NewLog_log.ldf是新日志文件的存放路径和文件名,可以根据实际情况,自行设置。新建的日志文件的存放路径,建议和原数据库存放在同一个文件夹。文件名不要和原日志文件的名称相同,否则会报错。如在此实际中,原日志文件的名是ZPT_HOTEL_Log_log.ldf,我新建的日志文件名是:ZPT_HOTEL_NewLog_log.ldf
本例中,新建立日志文件存于C盘,语句运行后,会在C盘新增加一个文件名。

--第四、重置数据库状态
update sysdatabases set status=0 where name='ZPT_HOTEL'
GO
--第五、恢复数据库
restore database ZPT_HOTEL WITH RECOVERY
GO
--第六、关闭打开修改系统表的开关
exec sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE
GO

至此,数据库修复置疑完成。数据库此时,已显示为正常状态。

第二步:数据库的检测和修复
数据库不再置疑后,并不等于就万事大喜。还要进行数据库的检测和修复。
数据库的检测和修复SQL如下:
(注意:下面的SQL语名中的“ZPT_HOTEL”,表示是我要修复的数据库的名称,实际应用中,要替换为实际置疑的数据库名)。
use ZPT_HOTEL
go
DBCC CHECKDB('ZPT_HOTEL')---检查数据库错误并修复
go
数据库的检测和修复SQL,建立运行两次或三次,看检测结果,没有问题就可以了(如修复结果,没有红字,就基本表示OK了)
至此,数据库置疑的修复完工。

附录:
如连续进行3次的数据库的检测和修复,还有错误(错误显示为红色的字),看一下是哪个表导致的,就针对此表进行修复。则进入下面的第三步。
第三步:表结构损坏的修复
假设在上面的数据库的检测中,显示有某个表损坏,还要再对此表进行修复,否则即使管理系统能登录和进行某些操作,但在用到此表的功能时,也会有问题,或容易导致数据库再次置疑。
例如,显示kf_Rep782 损坏了,则运行下面的SQL语名,对kf_Rep782进行修复。
下面是修复kf_Rep782表的SQL:
use ZPT_HOTEL
go
--修复SQLSERVER数据库的系统表
dbcc checktable('sysobjects',repair_allow_data_loss)
go
------- 开始修复业务表kf_Rep782 -----
dbcc checktable('kf_Rep782',repair_allow_data_loss)--修复业务表kf_Rep782
------- 开始修复业务表 -----
go
--恢复原样启用多用户
Use master
go
exec sp_dboption 'ZPT_HOTEL','single user','false'--启用多用户
go
USE MASTER;
go
ALTER DATABASE ZPT_HOTEL_JYB SET MULTI_USER
go
修复后,再对数据库进行一次数据库的检测和修复就可以了。
数据库的检测和修复SQL和上次相同(修设数据库名是:ZPT_HOTEL)。
useZPT_HOTEL
go
DBCCCHECKDB('ZPT_HOTEL')---检查数据库错误并修复
go
阅读原文:原文链接