91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sql server 系統表sysobjects、sysindexes、syscolumns損壞的修復方法

發布時間:2021-12-30 09:41:36 來源:億速云 閱讀:1036 作者:柒染 欄目:大數據

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

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) 步。

看完上述內容,你們對sql server 系統表sysobjects、sysindexes、syscolumns損壞的修復方法有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

即墨市| 嘉善县| 白山市| 陆川县| 波密县| 固原市| 额敏县| 兴宁市| 松阳县| 武威市| 龙山县| 化德县| 鹿邑县| 桦川县| 祥云县| 满城县| 锦屏县| 赤峰市| 襄城县| 田东县| 陕西省| 迭部县| 肥乡县| 日照市| 平南县| 灵山县| 万安县| 炎陵县| 富阳市| 万年县| 浦东新区| 逊克县| 二连浩特市| 革吉县| 思茅市| 那曲县| 德庆县| 正蓝旗| 铜梁县| 满洲里市| 嘉峪关市|