美文网首页
一则SQLServer报错处理

一则SQLServer报错处理

作者: 这货不是王马勺 | 来源:发表于2022-08-10 09:29 被阅读0次

CHECKDB结果如下:

Msg 8905, Level 16, State 1, Line 1
Extent (1:3887112) in database ID 7 is marked allocated in the GAM, but no SGAM or IAM has allocated it.
Msg 8905, Level 16, State 1, Line 1
Extent (1:3887152) in database ID 7 is marked allocated in the GAM, but no SGAM or IAM has allocated it.
CHECKDB found 2 allocation errors and 0 consistency errors not associated with any single object.
Msg 8910, Level 16, State 1, Line 1
Page (1:2822888) in database ID 7 is allocated to both object ID 674101442, index ID 11, partition ID 72057594067288064, alloc unit ID 72057594073186304 (type In-row data), and object ID 802817922, index ID 1, partition ID 72057594305642496, alloc unit ID 72057594314358784 (type In-row data).
Msg 8906, Level 16, State 1, Line 1
Page (1:3684833) in database ID 7 is allocated in the SGAM (1:3578625) and PFS (1:3680040), but was not allocated in any IAM. PFS flags 'MIXED_EXT ALLOCATED   0_PCT_FULL'.
CHECKDB found 2 allocation errors and 0 consistency errors in table 'REPOSITORY.CHANGE_EVENT' (object ID 674101442).
CHECKDB found 4 allocation errors and 0 consistency errors in database 'ccm'.
repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (ccm).
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.

其中GAM和SGAM解释如下:

  • 全局分配映射表 (GAM) :统一盘区,GAM 页记录已分配的区。每个 GAM 包含 64,000 个区,相当于近 4 GB 的数据。GAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区可用;如果位为 0,则区已分配。
  • 共享全局分配映射表 (SGAM) :由多个对象共同拥有该盘区,SGAM 页记录当前用作混合区且至少有一个未使用的页的区。每个 SGAM 包含 64,000 个区,相当于近 4 GB 的数据。SGAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区正用作混合区且有可用页。如果位为 0,则区未用作混合区,或者虽然用作混合区但其所有页均在使用中。
  • 索引分配映射 (IAM)页:将映射分配单元使用的数据库文件中 4 GB 部分中的区。主要用来标示 Sql Server 对象使用了哪些区。比如A表的非聚集索引B占用了 7895 4个区。这样,在再对此对象做更改的时候,能够快速的找到这4个区,更改文件。

由于提示说明:repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (ccm).
因此尝试使用dbcc进行修复,这种方式会有数据丢失但已经是最小修复级别。

将数据库状态改为紧急模式

ALTER DATABASE test SETEMERGENCY

GO

将数据库改为单用户访问

ALTER DATABASE test SET SINGLE_USER

GO

运行repair_allow_data_loss修复

DBCC CHECKDB(test,repair_allow_data_loss)

Go

修复完成后运行DBCC CHECKDB确定没有问题

DBCC CHECKDB with NO_INFOMSGS

Go

将数据库更改为多用户访问

ALTER DATABASE test SET MULTI_USER

相关文章

网友评论

      本文标题:一则SQLServer报错处理

      本文链接:https://www.haomeiwen.com/subject/soauirtx.html