錯誤原始信息(例子):
An attempt was made to fetch logical page '%ld' in
database '%.*s' from cache '%.*s'. Page belongs to
object with id '%ld', not to object '%.*s'.
-------------------------------------------------------------------------------------------------
使用dbcc tablealloc 去檢查出現錯誤的表
命令格式:
dbcc tablealloc('錯誤信息中第二個表對象')
最好將錯誤結果使用 isql 的 -o 參數輸出到文件中便於察看
注意:
這個dbcc 操作可能會鎖住接受檢查的表,這將影響到其他進程的訪問和操作。
-------------------------------------------------------------------------------------------------
DBCC 結果(例子為正常結果):
The default report option of OPTIMIZED is used for this run.
The default fix option of NOFIX is used for this run.
***************************************************************
TABLE: Tablename OBJID = id_number
INDID=1 FIRST=257 ROOT=264 SORT=0
Data level: 1. 1 Data pages allocated and 1 Extents allocated.
Indid : 1. 1 Index pages allocated and 1 Extents allocated.
INDID=2 FIRST=272 ROOT=272 SORT=0
Indid : 2. 1 Index pages allocated and 1 Extents allocated.
TOTAL # of extents = 3
Alloc page 256 (# of extent=1 used pages=2 ref pages=2)
Alloc page 256 (# of extent=1 used pages=3 ref pages=3)
Alloc page 256 (# of extent=1 used pages=2 ref pages=2)
Total (# of extent=3 used pages=7 ref pages=7) in this database
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
-------------------------------------------------------------------------------------------------
一.
如果有一些錯誤(例如2583或者其他)出現在 INDID為0之後,表示表本身數據損壞。
解決辦法:
1. 使用 "select into" 或者 "insert into ... select " 將壞表中能夠正常訪問的數據取出裝入一個臨時表中。同時可以使用
" where"加上一些可以縮小選擇范圍的條件盡量多的將正常的數據取出
2. 或者使用bcp去導出正常的數據
3. 對於實在無法取出的數據,只能通過應用系統中的冗余或者相關信息進行恢復
4. 刪除或者重命名壞表,並重新創建新表
5. 將導出的正常數據重新導入新表中
注意: 可能會有一些數據的丟失
-----------------------------------------------------------------------------------------------
--
二.
如果有一些錯誤(例如2583或者其他)出現在 INDID為1之後,說明表上的聚簇索引損壞,解決方法同一,也可能出現數據丟失。
如果有一些錯誤(例如2583或者其他)出現在 INDID為2,3,4.....之後,說明為表上的非聚簇索引損壞,解決方法比較簡單,刪除此索引然後重新創建即可。
步驟如下:
1. use databasename
go
2. 獲知索引名稱
select name from sysindexes where id = table_object_id and indid = index_number
go
3. 創建一個跟壞索引不同名稱但具有相同列的索引
create index
你可以使用 sp_help table_name 去察看索引上的列信息
4. 將已損壞索引刪除
drop index
---------------------------------------------------------------------------------
您正在看的Sybase教程是:解決 Error 605 錯誤的方案。----------------
當這些故障排除完畢後,有時間及業務系統允許的情況下,最好再做一次全庫的dbcc檢查
DBCC checkdb(db_name)
DBCC checkalloc(db_name)
DBCC checkcatalog(db_name)