#5
也可能是数据库有问题,参考以下:
1.1 SQL SERVER数据库的检测
SQL SERVER提供了数据库检测的命令,可用DBCC CHECKDB对数据库中各个对象的分配及结构的正确性进行检测,并可通过一参数控制,将所有的错误信息显示出来。其语法如下:
DBCC CHECKDB
('database_name' [,NOINDEX | { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD }]
) [WITH {ALL_ERRORMSGS | NO_INFOMSGS}]
参数说明:
'database_name'代表被检测的数据库实体名;
NOINDEX指非系统表的非聚族索引不检测;
REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST| REPAIR_REBUILD 指直接修复发现的错误,其中REPAIR_ALLOW_DATA_LOSS代表,若此错误不能修复时,系统将直接删除相关数据。带此三个参数的任一个时,数据库必须处于单用户模式,可在Enterprise Manager中的数据库属性中设置;
ALL_ERRORMSGS代表将检测到的错误信息全部显示出来,否则,对于每张表最多只显示200条错误信息;
NO_INFOMSGS代表隐藏所有的信息及占用空间的报告。
经过检测,对于错误的对象,将以OBJECT ID的形式报告具体出错的信息,可根据OBJECT ID到系统表sysobjects中查找到相关的表,即NAME。
1.2 SQL SERVER问题数据库的修复
经过数据库检测后,可针对出现的问题采取相应的措施进行处理。
如通过检测后,发现对象的物理存放存在问题,可用DBCC CHECKALLOC来进行修复:
DBCC CHECKALLOC ('database_name' | REPAIR_REBUILD }] ) [WITH {ALL_ERRORMSGS | NO_INFOMSGS}]
若是非系统对象的索引出错,则可用DBCC DBREINDEX进行修复:
DBCC DBREINDEX ( [ 'database.owner.table_name' [, index_name [, fillfactor ] ] ] ) [WITH NO_INFOMSGS]
以上两种情况,也可直接使用DBCC CHECKDB(‘db_name’,repair_rebuild)来修复。
另外一种情况是在进行检测时,提示无法建立数据连接,此时表明,数据库已损坏。
对于这种情况,我们可采取如下措施来尝试修复。
(1)在SQL Enterprise中新建一数据库(如数据库名为test)
(2)停止SQL Server Service Manager,并将客户数据库的MDF文件更名为test _data.mdf(即新建数据库的主文件名)
(3)用更名后的文件覆盖新建数据库同名文件,接着,启动SQL Server Service Manager
(4)对Master数据库将系统表设置为可更改状态
Use Master
go
sp_configure 'allow updates', 1
go
reconfigure with override
go
--将数据库设为紧急状态:
update sysdatabases set status = 32768 where name = ' database '
--停止并重新启动SQL Server Service Manager,并重建Log文件:
dbcc traceon (3604)
go
dbcc rebuild_log ('test','test_log.ldf')
go
--将数据库设置为单用户模式,然后进行检测:
sp_dboption 'test', 'single user', 'true'
go
dbcc checkdb('test')
go
此数据库执行CHECKDB的过程中发现一些表的索引被破坏,于是针对具体的表进行重建索引的操作:
dbcc dbreindex(tablename)
go
如执行以上操作仍然不能解决,若索引破坏的表是临时表或不是关键表,则可从新建账套中引入,若是主表,则可能通过近期的备份来(部份)恢复。若没有一个备份,则无法修复。