sql server系统表损坏处理方法sysobjects、sysindexes、syscolumns损坏的修复方法
广告:
sql server 系统表损坏处理方法ysobjects、sysindexes、syscolumns损坏的修复方法
sql server数据库中三张重要的系统表:
sysobjects:在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。
sysindexes:数据库中的每个索引和表在表中各占一行。
syscolumns:每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。
这三张表用ID(表ID)字段关联。这三张系统表一旦损坏,与之对应数据库对象将无法访问,其作用相当于DOS中的“文件分配表” 。
系统表损坏的症状
1 用 DBCC CHECKDB 携带任何参数都无法修复数据库,也就是说:DBCC CHECKDB对这个帐套根本不起作用;
2 无法执行如下操作:
select * from sysobjects
select * from sysindexes
select * from syscolumns ;
3 无法用SQL server DTS或其他SQL 脚本导库工具进行导库,导库的中途失败,报告:连接中断;未能读取并闩锁页;在企业管理器或查询分析器中,部分用户数据表无法访问。
未能读取并闩锁页 (1:29262)(用闩锁类型 SH)。SYSOBJECTS 失败。
处理方法:
第一步:处理可以访问的数据表
用SQL server DTS把能够访问的用户数据表导入一个新的DataBase
第二步:处理不可访问的数据表:
删除sysobjects、sysindexes、syscolumns 表错误的记录;根据“错误记录的ID” ,重建系统表记录;
找出哪些表不可访问:
use datatest
DECLARE @TbName VARCHAR(80)
DECLARE FindErrTable SCROLL CURSOR FOR
select name from 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 FindErrTable
DEALLOCATE FindErrTable
在声明游标的记录集中屏蔽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中那些表不能访问。
找出系统表中错误记录的ID
SELECT id FROM datatest.dbo.sysobjects WHERE name=‘ t_voucher’
( 说明:通常即使sysobjects表损坏,不能做 select * from sysobjects 查询,但是可以做 select ID,name from sysobjects 查询。如果select ID,name from sysobjects 查询也不能执行,可以对照AisNew和datatest两个数据库中的同名表: syscolumns。根据AisNew.dbo.syscolumns表中T_voucher所占字段的个数以及各个字段的名称,在datatest.dbo.syscolumns中找出T_voucher所对应的记录,由此获得T_voucher在datatest数据库的系统表中所分配的ID。)
DELETE datatest.dbo.sysobjects WHERE id=123
DELETE datatest.dbo.sysindexes WHERE id=123
DELETE datatest.dbo.syscolumns WHERE id=123
重建系统表:
–重建datatest.dbo.sysobjects表中T_voucher表对应的记录:
INSERT INTO datatest.dbo.sysobjects
(name,id,xtype,uid,info,status,base_schema_ver,replinfo,parent_obj,crdate,ftcatid)
SELECT
‘t_voucher_b’,123,xtype,uid,info,status,base_schema_ver,replinfo,parent_obj,crdate,ftcatid
FROM AisNew.dbo. sysobjects WHERE id=456
–重建datatest.dbo.sysindexes表中t_voucher表对应的记录:
INSERT INTO datatest.dbo.sysindexes
(id,status,first,indid,root,minlen,keycnt,groupid,dpages,reserved,used,rowcnt,rowmodctr,reserved3,reserved4,xmaxlen,maxirow,OrigFillFactor,StatVersion,reserved2,FirstIAM,impid,lockflags,pgmodctr,keys,name,statblob)
SELECT
123,status,first,indid,root,minlen,keycnt,groupid,dpages,reserved,used,rowcnt,rowmodctr,reserved3,reserved4,xmaxlen,maxirow,OrigFillFactor,StatVersion,reserved2,FirstIAM,impid,lockflags,pgmodctr,keys,name,statblob
FROM AisNew.dbo.sysindexes WHERE id=456
–重建datatest.dbo.syscolumns表中t_voucher表对应的记录:
INSERT INTO datatest.dbo.syscolumns
(name,id,xtype,typestat,xusertype,length,xprec,xscale,colid,xoffset,bitpos,reserved,colstat,cdefault,domain,number,colorderby,autoval,offset,collationid,language)
SELECT
name,123,xtype,typestat,xusertype,length,xprec,xscale,colid,xoffset,bitpos,reserved,colstat,cdefault,domain,number,colORDERBY,autoval,offset,collationid,language
FROM AisNew.dbo.syscolumns WHERE id=456
语句请根据实际情况调整。
广告: