sqlserver数据库系统表损坏的语句修复的处理方法
一, 系统表损坏一般出现以下几种情况: (1) 用 DBCC CHECKDB 携带任何参数都无法修复数据库,也就是说:DBCC CHECKDB对这个帐套根本不起作用; 无法执行如下操作: select * from sysobjects 或select * from sysindexes 或select * from syscolumns ; 无法用SQL server DTS或其他SQL 脚本导库工具进行导库,导库的中途失败,报告:连接中断 在企业管理器或查询分析器中,部分用户数据表无法访问。 修复的方法: 例:一sql svr数据库,实体名为:AIS20030529181217 用DBCC CHECKDB检测,报告(用DBCC CHECKDB 带任何参数都是以下提示): 服务器: 消息 8966,级别 16,状态 1,行 1 未能读取并闩锁页 (1:29262)(用闩锁类型 SH)。SYSOBJECTS 失败。 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 执行select * from sysobjects,报告如下: 服务器: 消息 644,级别 21,状态 3,行 1 未能在索引页 (1:29262) 中找到 RID ‘16243a6d19100’的索引条目(索引 ID 0,数据库‘AIS20030529181217’)。 连接中断 但是执行select * from sysindexes 和select * from syscolumns 正常。 这说明只有sysobjects表损坏,而 sysindexes 和 syscolumns 没有问题。 处理步骤: 第一步: 处理可以访问的数据表 (1.1) 找出哪些表不可访问; 新建立一个sql svr数据库,数据库实体名为AisNew。进入查询分析器,执行如下SQL: --**************************************************** useAIS20030529181217 DECLARE @TbName VARCHAR(80) DECLARE FindErrTable SCROLL CURSOR FOR selectnamefrom AisNew.dbo.sysobjectswhere xtype=‘u’order byname OPEN FindErrTable FETCH FindErrTable INTO @TbName WHILE@@FETCH_STATUS<>-1 BEGIN print @TbName exec( ‘select top 1 * from’+ @TbName) FETCH FindErrTable INTO @TbName END PRINT ‘Scan Complate…’ CLOSE FindErrTable DEALLOCATE FindErrTable --**************************************************** 执行此SQL给出的报告的最后几行为: … T_voucher 服务器: 消息 644,级别 21,状态 3,行 1 未能在索引页 (1:29262) 中找到 RID ‘161dd201a100’的索引条目(索引 ID 0,数据库‘AIS20030529181217’)。 连接中断 根据以上报告可以知道 T_voucher 表在sysobjects表中的对应记录出错,造成T_voucher不能访问。修改上面的SQL:在声明游标的记录集中屏蔽T_voucher 表。即: … DECLARE FindErrTable SCROLL CURSOR FOR select name from AisNew.dbo. sysobjects where xtype=‘u’ and name != ’t_voucher’ order by name … 修改完毕,继续执行此SQL。如此反复,就能够不断报告出sysobjects中那些表不能访问。 (1.2) 导 库 用SQL DTS工具将AIS20030529181217中可以访问的数据表导入AisNew。 青岛四通数据恢复中心在数据库系统表损坏方面已成功解决,本中心花巨资(数千美元)引进国外的sql server数据库修复软件,修复后的数据库可以在企业管理里正常附加。数据库里的表可以100%恢复。 青岛数据库修复 www.raidst.com 联系人:王鹏 电话: 15063041430 |