溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

sql server 系統(tǒng)表sysobjects、sysindexes、syscolumns損壞的修復(fù)方法

發(fā)布時(shí)間:2021-12-30 09:41:36 來(lái)源:億速云 閱讀:1017 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)sql server 系統(tǒng)表sysobjects、sysindexes、syscolumns損壞的修復(fù)方法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

sql server數(shù)據(jù)庫(kù)中三張重要的系統(tǒng)表

  • sysobjects:在數(shù)據(jù)庫(kù)內(nèi)創(chuàng)建的每個(gè)對(duì)象(約束、默認(rèn)值、日志、規(guī)則、存儲(chǔ)過(guò)程等)在表中占一行。

  • sysindexes:數(shù)據(jù)庫(kù)中的每個(gè)索引和表在表中各占一行。

  • syscolumns:每個(gè)表和視圖中的每列在表中占一行,存儲(chǔ)過(guò)程中的每個(gè)參數(shù)在表中也占一行。

這三張表用ID(表ID)字段關(guān)聯(lián)。這三張系統(tǒng)表一旦損壞,與之對(duì)應(yīng)數(shù)據(jù)庫(kù)對(duì)象將無(wú)法訪(fǎng)問(wèn),其作用相當(dāng)于DOS中的“文件分配表” 。

系統(tǒng)表?yè)p壞的癥狀
用 DBCC CHECKDB 攜帶任何參數(shù)都無(wú)法修復(fù)數(shù)據(jù)庫(kù),也就是說(shuō):DBCC CHECKDB對(duì)這個(gè)帳套根本不起作用;
無(wú)法執(zhí)行如下操作:

select * from sysobjects 或select * from sysindexes 或select * from syscolumns ;

無(wú)法用SQL server DTS或其他SQL 腳本導(dǎo)庫(kù)工具進(jìn)行導(dǎo)庫(kù),導(dǎo)庫(kù)的中途失敗,報(bào)告:連接中斷;未能讀取并閂鎖頁(yè);在企業(yè)管理器或查詢(xún)分析器中,部分用戶(hù)數(shù)據(jù)表無(wú)法訪(fǎng)問(wèn)。

處理方法
處理這種數(shù)據(jù)庫(kù),分為兩個(gè)大的步驟:

第一步:處理可以訪(fǎng)問(wèn)的數(shù)據(jù)表
1)找出哪些表不可訪(fǎng)問(wèn),即:系統(tǒng)表中哪些記錄損壞;
2)用SQL server DTS把能夠訪(fǎng)問(wèn)的用戶(hù)數(shù)據(jù)表導(dǎo)入一個(gè)新的DataBase 。
在導(dǎo)庫(kù)時(shí),不能選折(1)中不能訪(fǎng)問(wèn)的數(shù)據(jù)表。
第二步:處理不可訪(fǎng)問(wèn)的數(shù)據(jù)表:
1) 找出系統(tǒng)表中錯(cuò)誤記錄的ID;
2) 根據(jù)“錯(cuò)誤記錄的ID”,刪除sysobjects、sysindexes、syscolumns 表錯(cuò)誤的記錄;
3) 根據(jù)“錯(cuò)誤記錄的ID” ,重建系統(tǒng)表記錄;
4) 重建完畢,如果該表可以訪(fǎng)問(wèn),那么用DTS單獨(dú)將此表導(dǎo)入新的DataBase。
說(shuō)明:重建系統(tǒng)表方式不一定會(huì)成功,比如由于DISK I/O錯(cuò)誤,如果僅僅是保存系統(tǒng)表的磁盤(pán)扇區(qū)出錯(cuò),那么重建系統(tǒng)表方式可以挽回?cái)?shù)據(jù)。 如果保存用戶(hù)數(shù)據(jù)表的磁盤(pán)扇區(qū)出錯(cuò),那么即使重建系統(tǒng)表也不能解決問(wèn)題。如果重要的用戶(hù)數(shù)據(jù)表無(wú)法導(dǎo)庫(kù),如:t_Voucher、IcStockbill、ICSale等,那么可以用用“第二步”中的方法一試。

例子

一sql svr數(shù)據(jù)庫(kù),實(shí)體名為:AIS20030529181217
用DBCC CHECKDB檢測(cè),報(bào)告(用DBCC CHECKDB 帶任何參數(shù)都是以下提示):
服務(wù)器: 消息 8966,級(jí)別 16,狀態(tài) 1,行 1
未能讀取并閂鎖頁(yè) (1:29262)(用閂鎖類(lèi)型 SH)。SYSOBJECTS 失敗。
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。

執(zhí)行select * from sysobjects,報(bào)告如下:
服務(wù)器: 消息 644,級(jí)別 21,狀態(tài) 3,行 1
未能在索引頁(yè) (1:29262) 中找到 RID ‘16243a6d19100′ 的索引條目(索引 ID 0,數(shù)據(jù)庫(kù) ‘AIS20030529181217′)。
連接中斷
但是執(zhí)行select * from sysindexes 和select * from syscolumns 正常。
這說(shuō)明只有sysobjects表?yè)p壞,而 sysindexes 和 syscolumns 沒(méi)有問(wèn)題。

處理步驟:
第一步: 處理可以訪(fǎng)問(wèn)的數(shù)據(jù)表
(1.1) 找出哪些表不可訪(fǎng)問(wèn);
新建立一個(gè)sql svr數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)實(shí)體名為AisNew。進(jìn)入查詢(xún)分析器,執(zhí)行如下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
–****************************************************
執(zhí)行此SQL給出的報(bào)告的最后幾行為:

T_voucher
服務(wù)器: 消息 644,級(jí)別 21,狀態(tài) 3,行 1
未能在索引頁(yè) (1:29262) 中找到 RID ‘161dd201a100′ 的索引條目(索引 ID 0,數(shù)據(jù)庫(kù) ‘AIS20030529181217′)。
連接中斷

根據(jù)以上報(bào)告可以知道 T_voucher 表在sysobjects表中的對(duì)應(yīng)記錄出錯(cuò),造成T_voucher不能訪(fǎng)問(wèn)。修改上面的SQL:在聲明游標(biāo)的記錄集中屏蔽T_voucher 表。即:

DECLARE FindErrTable SCROLL CURSOR FOR
select name from AisNew.dbo. sysobjects where xtype=‘u’ and name != ‘t_voucher’
order by name

修改完畢,繼續(xù)執(zhí)行此SQL。如此反復(fù),就能夠不斷報(bào)告出sysobjects中那些表不能訪(fǎng)問(wèn)。
(1.2) 導(dǎo) 庫(kù)
用SQL DTS工具將AIS20030529181217中可以訪(fǎng)問(wèn)的數(shù)據(jù)表導(dǎo)入AisNew。
第二步:處理不可訪(fǎng)問(wèn)的數(shù)據(jù)表:
(2.1) 找出系統(tǒng)表中錯(cuò)誤記錄的ID
–獲得AIS20030529181217中T_voucher表在sysobjects中的ID :
SELECT id FROM AIS20030529181217.dbo.sysobjects WHERE name=‘ t_voucher’
==》123
( 說(shuō)明:通常即使sysobjects表?yè)p壞,不能做 select * from sysobjects 查詢(xún),但是可以做 select ID,name from sysobjects 查詢(xún)。如果select ID,name from sysobjects 查詢(xún)也不能執(zhí)行,可以對(duì)照AisNew和AIS20030529181217兩個(gè)數(shù)據(jù)庫(kù)中的同名表: syscolumns。根據(jù)AisNew.dbo.syscolumns表中T_voucher所占字段的個(gè)數(shù)以及各個(gè)字段的名稱(chēng),在AIS20030529181217.dbo.syscolumns中找出T_voucher所對(duì)應(yīng)的記錄,由此獲得T_voucher在AIS20030529181217數(shù)據(jù)庫(kù)的系統(tǒng)表中所分配的ID。)

–獲得AisNew中T_voucher表在sysobjects中的ID :
SELECT id FROM AisNew.dbo.sysobjects WHERE name=‘ t_voucher’
==》456

(2.2) 刪除AIS20030529181217中系統(tǒng)表中錯(cuò)誤記錄:
DELETE AIS20030529181217.dbo.sysobjects WHERE id=123
DELETE AIS20030529181217.dbo.sysindexes WHERE id=123
DELETE AIS20030529181217.dbo.syscolumns WHERE id=123

(2.3) 重建系統(tǒng)表記錄
–重建AIS20030529181217.dbo.sysobjects表中T_voucher表對(duì)應(yīng)的記錄:
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表對(duì)應(yīng)的記錄:
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表對(duì)應(yīng)的記錄:
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單獨(dú)將t_voucher_b表導(dǎo)入新的DataBase
經(jīng)過(guò)以上操作,AIS20030529181217中t_voucher_b 表與原t_voucher表共用同一ID。
試試看可否執(zhí)行SELECT * FROM t_voucher_b 查詢(xún) -
如果可以,那么t_voucher_b就一定繼承原t_voucher表中的全部數(shù)據(jù)。再用INSERT INTO AisNew.dbo.T_voucher FROM AIS20030529181217.dbo.t_voucher_b
或DTS 將t_voucher_b中的數(shù)據(jù)導(dǎo)入AisNew。
如果執(zhí)行SELECT * FROM t_voucher_b 查詢(xún)?nèi)匀粓?bào)錯(cuò),這張表徹底沒(méi)戲了。
(2.5) 其他”不可訪(fǎng)問(wèn)的數(shù)據(jù)表”處理方式同上,重復(fù)(2.1)~(2.4) 步。

看完上述內(nèi)容,你們對(duì)sql server 系統(tǒng)表sysobjects、sysindexes、syscolumns損壞的修復(fù)方法有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI