【SQLSERVER 2000】由于数据移动,未能继续以 NOLOCK 方式扫描

场景:

数据库为SQLSERVER2000,从生产库脱机备份了整个库的MDF文件和LDF文件,在另外一台机器相同配置环境下恢复,结果部分表查询时报“由于数据移动,未能继续以 NOLOCK 方式扫描”的异常。

分析:

出现该问题的表有一个定时导数据的脚本在后台执行,导数据过程中脱机备份导致以上问题。

解决方案:

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

5 seconds

DBCC CHECKDB on snapshot database

5 seconds

DBCC CHECKTABLE Batch

8-12 minutes

DBCC CHECKTABLE Batch with TABLOCK

18 seconds

DBCC CHECKTABLE Batch on Snapshot database

20 seconds

你可能感兴趣的:(sqlserver,NOLOCK,DBCC)