管理杂谈OA答疑ERP答疑教程搜索

SQL Server数据库已损坏表的查找和修复


    表结构损坏,表现方式是软件突然发生“莫名其妙”的问题:

    如:如酒店系统的突然不能开房,或不能结账,或不能夜审,或不能查看某一个报表。反正用到某个表的某个功能,就不能操作。

    但其他功能一切正常,而且数据库也没有置疑。

    过去在ERP管理系统开发的这些年中,处理过几次这种情况。这种问题,单从软件上,很难找到原因。后面几经折腾,才找到原因:

    原来是Sqlserver数据库中某一个或几个表损坏。

    一般是因为断电、或前台人员强行关机、强行关闭软件(特别是当管理软件正在进行夜审、结算等大量的数据运算时)。

    现把处理此情况的方法总结如下,希望对大家有用。

    注意:下文中,ZPT_HOTEL_JYB是我所用的数据库名称,应用中,记得替换为实际的数据库名称

第一步:检查并修复数据库,并找出哪个表损坏。

use master

go

---检查数据库错误并修复

DBCC CHECKDB ('ZPT_HOTEL_JYB')

go

    运行结果如上图。如有表结构损坏,损坏的表名会在“消息”页以红色的方式显示出来。

第二步:修复损坏的表。

    根据第一步检查得知损坏的表名(有可能是一个或多个),使用DBCC CHECKTABLE检查和修复表,SQL语句如下(注意:损坏的表名1,损坏的表名2是一个代名称,请替换为实际损坏的表名):

Use master

go

exec sp_dboption 'ZPT_HOTEL_JYB', 'single user', 'true' --启用单用户

go

use ZPT_HOTEL_JYB

go

--修复SQLSERVER数据库的系统表

dbcc checktable('sysobjects',repair_allow_data_loss)

go

-------开始 修复业务表   -----

dbcc checktable('损坏的表名1',repair_allow_data_loss)

dbcc checktable('损坏的表名2',repair_allow_data_loss)

-------开始 修复业务表  -----

go

--恢复原样启用多用户

Use master

go

exec sp_dboption 'ZPT_HOTEL_JYB', 'single user', 'false' --启用多用户

go

第三步:再次测试和修复数据库

    使用DBCC CHECKDB来进行修复数据库。SQL语名如下:

use master

go

---检查数据库错误并修复

DBCC CHECKDB ('ZPT_HOTEL_JYB')

go

    至此,损坏的表修复成功。

附:特殊情况处理

    如果损伤太严重,无法用SQL语名修复。

处理方法一:

    把原来的表改名,然后,建立一个同名且表结构完全相同的表,然后从改名后的原表,把数据导入到新建的空表中。

处理方法二:

    把原来的表改名,然后,建立一个同名且表结构完全相同的表,然后从最近备份的数据库中,把数据导入到新建的空表中(如此表是业务表,这样有可能会损失一部份最近的数据)。


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn