备份检测到损坏,但是CHECKDB没有


12

我有一个数据库,在其中运行备份命令

BACKUP DATABASE [MyDatabase] TO     
DISK =  'G:\Backup\MyDatabase_01_01_2018.bak'   
WITH    NOFORMAT, NOSKIP, COMPRESSION, INIT, BUFFERCOUNT = 100

我收到错误消息

消息3043,级别16,状态1,第8行
BACKUP'MyDatabase'在文件'F:\ Data \ MyDatabase_1.ndf'中的页面(1:745345)中检测到错误。
消息3013,级别16,状态1,第8行
BACKUP DATABASE异常终止。

我运行了一个完整的CHECKDB,但恢复正常。我确实注意到页面验证选项已设置为NONE(不是我的工作),所以我将其更改为CHECKSUM并重建了数据库中的所有索引,使其可以写入所有页面并生成校验和。此后,备份仍然失败,并且checkdb仍显示为干净(因此无更改)。

DBCC CHECKDB('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS,
DATA_PURITY, EXTENDED_LOGICAL_CHECKS;

从SQL日志中:

由xxx执行的具有all_errormsgs,no_infomsgs和data_purity的DBCC CHECKDB(MyDatabase)发现0个错误,并修复了0个错误。经过时间:0小时21分46秒。内部数据库快照的拆分点LSN = 000ab776:0000112f:0001和第一个LSN = 000ab776:0000112d:0001。

我运行了DBCC PAGE,但是它出错了(起初似乎都没有返回正确的页面)。我可以使用打印选项2运行它,但它会返回,但说实话我不知道我在那儿寻找什么。

DBCC PAGE ('MyDatabase',1,745345,3)
页面:(3:513793)

缓冲:


BUF @ 0x00000003811F8280

bpage = 0x00000000F2D70000 bhash = 0x0000000000000000 bpageno =(1:745345)
bdbid = 5 breferences = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 44283 bstat = 0x809
博客= 0​​x5adb215a bnext = 0x0000000000000000          

页面标题:


页面@ 0x00000000F2D70000

m_pageId =(3:513793)m_headerVersion = 1 m_type = 2
m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x0
m_objId(AllocUnitId.idObj)= 1075937538 m_indexId(AllocUnitId.idInd)= 2
元数据:AllocUnitId = 633462595911680元数据:PartitionId = 0
元数据:IndexId = -1元数据:ObjectId = 0 m_prevPage =(3:513795)
m_nextPage =(3:513820)pminlen = 17 m_slotCnt = 426
m_freeCnt = 2 m_freeData = 7338 m_reservedCnt = 0
m_lsn =(608841:643611:411)m_xactReserved = 0 m_xdesId =(0:0)
m_ghostRecCnt = 0 m_tornBits = 0 DB Frag ID = 1

分配状态

GAM(1:511232)=已分配SGAM(1:511233)=未分配     
PFS(1:744096)= 0x40分配的0_PCT_FULL DIFF(1:511238)=不变
ML(1:511239)= NOT MIN_LOGGED      

消息2514,级别16,状态8,第20行
发生DBCC PAGE错误:无效的页面元数据-不可能转储样式3。

有什么想法我接下来可以尝试吗?服务器版本为

select @@version
Microsoft SQL Server 2014(SP2-CU11)(KB4077063)-12.0.5579.0(X64) 
    2018年2月21日12:19:47 
    版权所有(c)Microsoft Corporation
    Windows NT 6.3(内部版本9600:)(管理程序)上的Developer Edition(64位)

数据库的兼容级别为100(SQL 2008)。


有关此问题的评论已转移至聊天室
保罗·怀特9

Answers:


9

此答案摘自Paul Randal撰写的SQLskills.com时事通讯,主题是“数据库将失败并出现页面校验和错误,但传递了一个数据库DBCC CHECKDB”。

唯一可能的情况是扩展区是混合扩展区(扩展区中的8个页面可以分配给潜在的8个不同的分配单位–参见此处),并且某些页面被错误地标记为由相关的PFS页面分配。

发生这种情况时,DBCC CHECKDB将不会尝试读取那些页面,因为它会从分配单元的IAM页面(要从混合范围分配的页面中列出)中得出要读取的页面。这种情况是DBCC CHECKDB腐败检测逻辑中的空白。

[因为] DBCC CHECKDB无法检测到损坏,因此无法进行修复所需的修复。因此,使用DBCC WRITEPAGE,我可以直接在PFS页面中计算出错误分配页面的分配状态所需的更改,并且可以正常工作!

这是一种极为罕见的情况– DBCC CHECKDB 失败会更常见,但备份会成功。

我认为,Paul的解决方案超出了像您那样导出和导入数据的范围,所以我认为您做对了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.