dbcc checkdb试过了,不好用
DBCC DBREINDEX( 'sysobjects', UPKCL_auidind, 80)  重建索引也不能对系统表操作
请高手帮忙啊,错误如下:服务器: 消息 8951,级别 16,状态 1,行 1
表错误: 表 'sysobjects'(ID 1)。索引 'ncsysobjects2'(ID 3)中下列行的键缺少或无效:
服务器: 消息 8955,级别 16,状态 1,行 1
数据行(1:8:25)(由 RID = (1:8:25) id = 15339119 标识)的索引值为 parent_obj = 2146822710 and id = 15339119。
服务器: 消息 8952,级别 16,状态 1,行 1
表错误: 数据库 'RJJJ_VipDB',索引 'sysobjects.ncsysobjects2'(ID 1)(索引 ID 3)。下列键的键多余或无效:
服务器: 消息 8956,级别 16,状态 1,行 1
索引行(1:923:146)(其值为 parent_obj = 0 and id = 1858821684)指向由  标识的数据行。
服务器: 消息 8952,级别 16,状态 1,行 1
表错误: 数据库 'RJJJ_VipDB',索引 'sysobjects.ncsysobjects2'(ID 1)(索引 ID 3)。下列键的键多余或无效:
服务器: 消息 8956,级别 16,状态 1,行 1
索引行(1:924:161)(其值为 parent_obj = 1858821684 and id = 1874821741)指向由  标识的数据行。
服务器: 消息 8929,级别 16,状态 1,行 1
对象 ID 2: 在文本 ID 47074574336 中发现错误,该文本的所有者是由 RID = (1:594:6) id = 1858821684 and indid = 1 标识的数据记录。
服务器: 消息 8965,级别 16,状态 1,行 1
表错误: 对象 ID 2。text、ntext 或 image 节点(位于页 (1:79),槽 49,文本 ID 47074574336)被页 (1:594),槽 6 引用,但在扫描中未曾发现该节点。
服务器: 消息 8964,级别 16,状态 1,行 1
表错误: 对象 ID 2。text、ntext 或 image 节点(位于页 (1:574),槽 7,文本 ID 47140175872)未被引用。
服务器: 消息 8964,级别 16,状态 1,行 1
表错误: 对象 ID 2。text、ntext 或 image 节点(位于页 (1:574),槽 9,文本 ID 47140241408)未被引用。
服务器: 消息 8964,级别 16,状态 1,行 1
表错误: 对象 ID 2。text、ntext 或 image 节点(位于页 (1:574),槽 11,文本 ID 47140306944)未被引用。
服务器: 消息 8964,级别 16,状态 1,行 1
表错误: 对象 ID 2。text、ntext 或 image 节点(位于页 (1:574),槽 12,文本 ID 47140372480)未被引用。

解决方案 »

  1.   

    sql server 系统表sysobjects、sysindexes、syscolumns损坏修复方法SQL Server数据库
    sql server数据库中三张重要的系统表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)中不能访问的数据表。
    第二步:处理不可访问的数据表:
    1) 找出系统表中错误记录的ID;
    2) 根据“错误记录的ID”,删除sysobjects、sysindexes、syscolumns 表错误的记录;
    3) 根据“错误记录的ID” ,重建系统表记录;
    4) 重建完毕,如果该表可以访问,那么用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 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。
    第二步:处理不可访问的数据表:
    (2.1) 找出系统表中错误记录的ID
    –获得AIS20030529181217中T_voucher表在sysobjects中的ID :
    SELECT id FROM AIS20030529181217.dbo.sysobjects WHERE name=‘ t_voucher’
    ==》123
    ( 说明:通常即使sysobjects表损坏,不能做 select * from sysobjects 查询,但是可以做 select ID,name from sysobjects 查询。如果select ID,name from sysobjects 查询也不能执行,可以对照AisNew和AIS20030529181217两个数据库中的同名表: syscolumns。根据AisNew.dbo.syscolumns表中T_voucher所占字段的个数以及各个字段的名称,在AIS20030529181217.dbo.syscolumns中找出T_voucher所对应的记录,由此获得T_voucher在AIS20030529181217数据库的系统表中所分配的ID。)–获得AisNew中T_voucher表在sysobjects中的ID :
    SELECT id FROM AisNew.dbo.sysobjects WHERE name=‘ t_voucher’
    ==》456(2.2) 删除AIS20030529181217中系统表中错误记录:
    DELETE AIS20030529181217.dbo.sysobjects WHERE id=123
    DELETE AIS20030529181217.dbo.sysindexes WHERE id=123
    DELETE AIS20030529181217.dbo.syscolumns WHERE id=123(2.3) 重建系统表记录
    –重建AIS20030529181217.dbo.sysobjects表中T_voucher表对应的记录:
    INSERT INTO AIS20030529181217.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–重建AIS20030529181217.dbo.sysindexes表中t_voucher表对应的记录:
    INSERT INTO AIS20030529181217.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–重建AIS20030529181217.dbo.syscolumns表中t_voucher表对应的记录:
    INSERT INTO AIS20030529181217.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(2.4)用DTS单独将t_voucher_b表导入新的DataBase
    经过以上操作,AIS20030529181217中t_voucher_b 表与原t_voucher表共用同一ID。
    试试看可否执行SELECT * FROM t_voucher_b 查询 -
    如果可以,那么t_voucher_b就一定继承原t_voucher表中的全部数据。再用INSERT INTO AisNew.dbo.T_voucher FROM AIS20030529181217.dbo.t_voucher_b
    或DTS 将t_voucher_b中的数据导入AisNew。
    如果执行SELECT * FROM t_voucher_b 查询仍然报错,这张表彻底没戏了。
    (2.5) 其他”不可访问的数据表”处理方式同上,重复(2.1)~(2.4) 步