sqlserver系统表损坏处理方法.doc
文本预览下载声明
梦回唐朝
2003/6/30
SQL Serve系统表损坏的处理方法
一、SQL SVR数据库中三张重要的系统表
sysobjects:在数据库内创建的每个对象(约束、默认值、日志、规则、存
储过程等)在表中占一行。
sysindexes:数据库中的每个索引和表在表中各占一行。
syscolumns:每个表和视图中的每列在表中占一行,存储过程中的每个参数
在表中也占一行。
这三张表用ID(表ID)字段关联。这三张系统表一旦损坏,与之对应数据库对象将无法访问,其作用相当于DOS中的“文件分配表” 。
二、系统表损坏的症状
用 DBCC CHECKDB 携带任何参数都无法修复数据库,也就是说:DBCC CHECKDB对这个帐套根本不起作用;
无法执行如下操作:
select * from sysobjects 或select * from sysindexes
或select * from syscolumns ;
无法用SQL server DTS或其他SQL 脚本导库工具进行导库,导库的中途失败,报告:连接中断;
在企业管理器或查询分析器中,部分用户数据表无法访问。
三、处理方法
处理这种数据库,分为两个大的步骤:
第一步:处理可以访问的数据表
1)找出哪些表不可访问,即:系统表中哪些记录损坏;
2)用SQL server DTS把能够访问的用户数据表导入一个新的DataBase 。
在导库时,不能选折(1)中不能访问的数据表。
第二步:处理不可访问的数据表:
找出系统表中错误记录的ID;
根据“错误记录的ID”,删除sysobjects、sysindexes、syscolumns 表错误的记录;
根据“错误记录的ID” ,重建系统表记录;
重建完毕,如果该表可以访问,那么用DTS单独将此表导入新的DataBase。
说明:重建系统表方式不一定会成功,比如由于DISK I/O错误,如果仅仅是保
存系统表的磁盘扇区出错,那么重建系统表方式可以挽回数据。 如果保存用户数据表的磁盘扇区出错,那么即使重建系统表也不能解决问题。
如果重要的用户数据表无法导库,如:t_Voucher、IcStockbill、ICSale等,那么可以用用“第二步”中的方法一试。
四、例
例:一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:
--****************************************************
use AIS20030529181217
DECLARE @TbName VARCHAR(80)
DECLARE FindErrTable SCROLL CURSOR FOR
select name from AisNew.dbo. sysobjects where xtype=‘u’ order by name
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
显示全部