1。故障描述成都某客户存储损坏,数据库崩溃。重新整理存储,恢复数据库文件,发现4个ndf文件大小变成了0KB。数据库大小约为80TB。数据库中有1223个文件,数据库每10天生成一个NDF文件,每个NDF约500GB,数据库包含两个LDF文件。2、故障分析存储损坏,NDF文件大小变为0KB。根据NDF文件,它可能存在于磁盘上。可以通过编写数据库扫描分片程序扫描数据库分片,拼接分片,恢复NDF文件,然后修复数据库。三、恢复过程1、扫描磁盘,扫描数据库碎片2、拼接碎片;根据NDF文件的页面特点,按照文件号和页码拼接碎片,重组生成这些0kb的NDF文件。3.检测数据库文件;使用北亚MSSQL文件检测工具检测所有数据文件,结果:4个拼接的NDF文件有少量空页,其他文件正常。4.进一步分析损坏的LUN,发现这些数据页在存储层面已经不存在了。这些数据页无法恢复,也就是这4个文件无法完全恢复。5、尝试附加数据库,报错“处理数据库的日志时发生错误。如果可能,请从备份中恢复。如果没有可用的备份,您可能需要重新生成日志。”6.添加无日志数据库;修改系统表,从系统表中删除***添加的LDF文件,计算并修改校验和。对数据库进行无日志追加。错误:数据库中存在一致性错误。图1:7、修改系统表中4个损坏的NDF文件的块数,使其与恢复文件的块数一致;修改系统表,将这4个块记录在系统表中。更改每个NDF的块数的值,使其与扫描的NDF文件的块数一致,同时更改四个NDF文件的首页,使数据库中记录的块数与拼接的NDF的块数一致,计算修改校验和。8、数据库没有附加日志,报错数据库有一致性错误,如图2。9、将系统表中4个损坏的NDF文件的块号一一修改,于是该值等于错误报告块的前一页;分析报错,由于空页都出现在四个NDF后面的十几块,截断的文件对数据完整性影响不大。重新修改系统表和NDF文件,将数据库中记录的NDF块数的值修改为之前报错的页面,计算并修改校验和。10.重新attach没有log的数据库,报错“因为数据库没有完全关闭,无法重新生成log”。图3:11、修改MDF文件中数据库的status值,使数据库认为完全关闭。12、重新附加数据库,附加成功图4:4、结果数据库文件附加成功后,客户通过数据库中的对象进行初步查询和验证。表中信息基本完整,数据恢复。数据校验完成后,客户对恢复结果表示满意。
