数据库文件损坏修复实战笔记

news/2024/11/25 18:27:27/

 今天终于碰到数据库文件头pfs损坏的案例。

环境:win server 2008+sql 2008 R2 SP2

问题描述:db某些page损坏

问题定位

 1、执行DBCC CHECKDB(DB, 'REPAIR_ALLOW_DATA_LOSS') With No_InfoMsgs, All_ErrorMsgs, TableResults;

 Note: 需要关注的是RefFile和RefPage这两个列,而不是File和Pge列。Level,stauts

 2 、备份永远是DBA第一条天规

Note: backup也报”SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 1:1256,但实际为 0:0)“ ,44码的手瞬间小抖了下,压力指数暴增。

 3、

复制代码
SELECT DB_NAME(database_id),[file_id],page_id,
CASE event_type
WHEN 1 THEN '823 or 824 or Torn Page'
WHEN 2 THEN 'Bad Checksum'
WHEN 3 THEN 'Torn Page'
WHEN 4 THEN 'Restored'
WHEN 5 THEN 'Repaired (DBCC)'
WHEN 7 THEN 'Deallocated (DBCC)'
END,
error_count,
last_update_date
FROM msdb..suspect_pages
复制代码

 

  Note: 执行结果10+条记录

PS: SQL 2008 Enterprise及更高版本支持 Mirroring和AlwaysOn 页面自动修复功能.但是仅限于Event ID in (823,824,829)错误。AlwaysOn动态管理视图sys.dm_hadr_auto_page_repair中会记录该自动修复操作

  4.  DBCC PAGE(dbid,filenum, pagenum,3) WITH TABLERESULTS

Note: 瞬间报一致性错误。观察执行结果:  PFS (1:1) 参数对应的value值为 ”NOT ALLOCATED“,可以断定PFS文件头损坏。正常情况下,dbcc page 可以显示详细 KeyHashValue,进而根据sys.partitions定位具体的object

 

解决方案

使用REPAIR_ALLOW_DATA_LOSS级别都不能修复data

1、  有全备bak,用restore page 方式:

      1) backup log db  to disk =''                    ---- 备份尾部日志

      2)  RESTORE DATABASE <database> PAGE='1:57, 1:202, 1:916, 1:1016' FROM disk WITH NORECOVERY;         --全备还原损坏的页

      3) RESTORE DATABASE <database>  from disk='第一步的log备份'                     ---还原到当前时间点

2.  没有全备,将数据导入到一个新建的空数据库里:

  · 通过vs 2010的schema compare, data compare

  · SSMS 右键--导入导出数据

  ·  BCP 个人推荐

3.  有全备,但是bak文件也受损

     RESTORE DATABASE dbname FROM DISK='‘   WITH CONTINUE_AFTER_ERROR

补充:

      DBCC CHECK在REPAIR_ALLOW_DATA_LOSS过程中发现页内数据有问题,是把整个页面的数据删除,以维护数据的一致性,所以会丢数据。

      DBCC CHECK需要多长时间跟DB的大小,io错误量有关。进度查询可以查看sys.dm_exec_requests中percent_complete字段信息

 2014-4-30补充:

什么是管理区分配页
管理区分配页是数据文件中特殊的页,用来跟踪和管理区分配,本篇将关注三种:

全局分配映射表 (GAM):记录已分配的区,对于一个数据文件,每4GB会有一个GAM页,它的ID总是为2,之后每511,232页出现一次。
        Page ID = 2 or Page ID % 511232

共享全局分配映射表 (SGAM) :记录当前用作混合区且至少有一个未使用的页的区,每4GB会有一个SGAM页,它的ID总是为3,之后每511,232页出现一次。
       Page ID = 3 or (Page ID – 1) % 511232

页可用空间 (PFS):记录每页的分配状态,是否已分配单个页以及每页的可用空间量,每64MB会有一个PFS页,它的ID总是为1,之后每8,088页出现一次。
       Page ID = 1 or Page ID % 8088

如果PAGE id是1/2/3,那么很明显会知道他们是什么管理区分配页,如果PAGE ID很大,那么我们有两个办法来区分它们:

一个办法是采用SQL脚本计算:

复制代码
Declare @PageID int;-- Enter page number
-- e.g., 8088 = PFS page
Set @PageID = 8088;Select CaseWhen @PageID = 1 Or @PageID % 8088 = 0 Then 'Is PFS Page'When @PageID = 2 Or @PageID % 511232 = 0 Then 'Is GAM Page'When @PageID = 3 Or (@PageID - 1) % 511232 = 0 Then 'Is SGAM Page'Else 'Is Not PFS, GAM, or SGAM page'End
复制代码

另一个办法是采用DBCC PAGE来看它的m_type值:

 

转载于:https://www.cnblogs.com/renyb/p/3688381.html


http://www.ppmy.cn/news/715001.html

相关文章

windows7系统损坏修复_UEFI?安装纯净的 Windows 7/10 系统

UEFI 支持 GPT分区表&#xff0c;至少可以分出128个分区&#xff0c;没有扩展分区和逻辑分区&#xff0c;最大支持18EB硬盘&#xff0c;相当于对硬盘容量没有限制。 本篇介绍 UEFI 加 GPT分区表安装原版 Windows 的方法。传统BIOS 加 MBR分区表安装系统还是需要UltraISO、Rufus…

关于【Windows 资源保护找到了损坏文件,但其中有一些文件无法修复】的解决方法

参考 问题描述 PS C:\Users\Qwer-laptop> sfc /scannow开始系统扫描。此过程将需要一些时间。开始系统扫描的验证阶段。 验证 100% 已完成。Windows 资源保护找到了损坏文件&#xff0c;但其中有一些文件无法修复。 对于联机修复&#xff0c;位于 windir\Logs\CBS\CBS.log…

电脑蓝屏重启后,js文件损坏或断电重启后文件损坏

问题来源:电脑蓝屏,重新用编译软件打开(我用的是优化过的eclipse,自称是内部工具/滑稽),发现js文件变成了空白,再次打开文件所在位置,打开文件,还是一样,重启电脑,重启编译工具没用。文件显示39.5kb,打开全是空白。 1.查找浏览器缓存 我用的是谷歌和IE, 在谷歌浏览…

VMware故障:配置文件(.vmx)损坏修复

问题来源 虚拟机清单中主机丢失,缺少了所需主机。 问题分析 软件稳定性差,虚拟机对应的vmx文件未加载成功。对应的vmx文件出现故障。问题处理 问题1 通过存储位置找到对应虚拟机的vmx文件进行添加即可。

excel文件修复工具_psd文件修复工具下载|Recovery Toolbox for ps 最新版v2.3.1.0 下载

Recovery Toolbox for ps能够帮助用户快速修复受损的psd文件&#xff0c;将其恢复成原始可使用的格式&#xff0c;并且在ps软件中能够顺利打开&#xff0c;并且完全找回图层、文字及特效属性等内容&#xff0c;对于2g以上的文件也能完美兼容使用&#xff0c;对于经常利用ps进行…

hadoop edits 文件损坏修复办法

前段时间公司hadoop集群宕机&#xff0c;发现是namenode 磁盘满了。。清理出部分空间后&#xff0c;重启集群时&#xff0c;重启失败。 又发现集群Secondary namenode 服务也恰恰坏掉&#xff0c;导致所有的操作log持续写入edits.new 文件&#xff0c;等集群宕机的时候文件大小…

Linux下的文件系统修复

Linux下的文件系统修复 一、进行磁盘分区二、格式成xfs文件系统1.查看分区2.格式化分区三、挂载分区1.查看分区的uuid2.将挂载信息写入/etc/fstab3.挂载分区四、破坏文件1.向/mnt/vdn3目录中写入文件2.卸载/mnt/vdb3/文件夹报错处理3.卸载分区,破坏分区4.挂载分区报错五、修复…

python安装文件或目录损坏_文件或目录损坏且无法读取的解决办法

方法很简单,用chsdsk命令即可 详解如下: 开始--运行--输入cmd--输入chkdsk 盘符: /f ,例如:“chkdsk d: /f”。 等命令运行完即可。这里要注意的是,那个冒号后面要空一格,别跟着就写"/f" 故障现象 不管是移动硬盘还是U盘,包括本地电脑上的硬盘分区,双击打开时,提…