【SQLSERVER 2000】因爲數據移動,未能繼續以 NOLOCK 方式掃描

場景:

數據庫爲SQLSERVER2000,從生產庫脫機備份了整個庫的MDF文件和LDF文件,在另一臺機器相同配置環境下恢復,結果部分表查詢時報「因爲數據移動,未能繼續以 NOLOCK 方式掃描」的異常。 sql

分析:

出現該問題的表有一個定時導數據的腳本在後臺執行,導數據過程當中脫機備份致使以上問題。 數據庫

解決方案:

ALTER DATABASE [databasename] SET SINGLE_USER

DBCC CHECKDB('[databasename]', REPAIR_ALLOW_DATA_LOSS) -- data will lost

--or DBCC CHECKDB('[databasename]', REPAIR_REBUILD) -- data won't lost

ALTER DATABASE [databasename] SET MULTI_USER

執行結果:
服務器: 消息 8909,級別 16,狀態 1,行 2
表錯誤: 對象 ID -2131190133,索引 ID 1,頁 ID (1:1384)。頁首結構中的 PageId = (17180:275243556)。
服務器: 消息 8909,級別 16,狀態 1,行 2
表錯誤: 對象 ID -1842666868,索引 ID 47782,頁 ID (1:4408)。頁首結構中的 PageId = (63829:1870280938)。
服務器: 消息 8909,級別 16,狀態 1,行 2
表錯誤: 對象 ID -1840896588,索引 ID 57194,頁 ID (1:1373)。頁首結構中的 PageId = (32657:1452998133)。
服務器: 消息 8909,級別 16,狀態 1,行 2
表錯誤: 對象 ID -1710263166,索引 ID 3616,頁 ID (1:1379)。頁首結構中的 PageId = (59655:117407752)。

...

CHECKDB 發現了 0 個分配錯誤和 1 個一致性錯誤(在表 '(Object ID -2131190133)' 中,該表的對象 ID 爲 -2131190133)。
        DBCC 語句的修復級別致使迴避了此修復。
CHECKDB 發現了 0 個分配錯誤和 1 個一致性錯誤(在表 '(Object ID -1842666868)' 中,該表的對象 ID 爲 -1842666868)。
        DBCC 語句的修復級別致使迴避了此修復。
CHECKDB 發現了 0 個分配錯誤和 1 個一致性錯誤(在表 '(Object ID -1840896588)' 中,該表的對象 ID 爲 -1840896588)。
        DBCC 語句的修復級別致使迴避了此修復。
CHECKDB 發現了 0 個分配錯誤和 1 個一致性錯誤(在表 '(Object ID -1710263166)' 中,該表的對象 ID 爲 -1710263166)。
        DBCC 語句的修復級別致使迴避了此修復。

...

服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:1928)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:1936)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:1944)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2048)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2088)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2112)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2144)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2160)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2176)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2200)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2280)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2
擴展盤區 (1:2296)(屬於數據庫 ID 9)在 GAM 中標記爲已分配,但沒有 SGAM 或 IAM 分配過該盤區。
服務器: 消息 8905,級別 16,狀態 1,行 2

...

對象 ID 1077578877: 在文本 ID 2110390272 中發現錯誤,該文本的全部者是由 RID = (1:303:16) News_ID = 1240 標識的數據記錄。
服務器: 消息 8929,級別 16,狀態 1,行 2
對象 ID 1077578877: 在文本 ID 2123431936 中發現錯誤,該文本的全部者是由 RID = (1:303:20) News_ID = 1244 標識的數據記錄。
服務器: 消息 8929,級別 16,狀態 1,行 2
對象 ID 1077578877: 在文本 ID 2123628544 中發現錯誤,該文本的全部者是由 RID = (1:303:21) News_ID = 1245 標識的數據記錄。
服務器: 消息 8929,級別 16,狀態 1,行 2
對象 ID 1077578877: 在文本 ID 2124414976 中發現錯誤,該文本的全部者是由 RID = (1:303:22) News_ID = 1248 標識的數據記錄。

...
對象 'xxx' 有 13124 行,這些行位於 605 頁中。
CHECKDB 發現了 0 個分配錯誤和 54 個一致性錯誤(在表 'xxx' 中,該表的對象 ID 爲 2133582639)。
CHECKDB 發現了 240 個分配錯誤和 736 個一致性錯誤(在數據庫 'databasename' 中)。
DBCC 執行完畢。若是 DBCC 輸出了錯誤信息,請與系統管理員聯繫。
擴展:

  1. 若是咱們知道某個表有問題,可直接使用CHECKTABLE縮小檢查範圍。
  2. 一般CHECKDB命令會隨着記錄數的多少消耗很長時間,這裏咱們能夠經過一些技巧提升性能,見下表:

DBCC CHECKDB 服務器

40-50 seconds 性能

DBCC CHECKDB with TABLOCK spa

5 seconds code

DBCC CHECKDB on snapshot database 對象

5 seconds 索引

DBCC CHECKTABLE Batch ci

8-12 minutes it

DBCC CHECKTABLE Batch with TABLOCK

18 seconds

DBCC CHECKTABLE Batch on Snapshot database

20 seconds

相關文章
相關標籤/搜索