我的任务是尝试恢复遭受损坏的数据库(由于I / O故障,此问题已修复)。我不熟悉数据库或其包含的内容。
我得到了旧的(约3周)完整备份和一系列事务日志...但是缺少事务日志,因此我只能恢复到某个日期。大约有2.5周的数据丢失(并且不断有大量数据添加到该数据库中)。
我还收到了损坏的数据库的副本(可以访问,但是有很多页面损坏/丢失)。
我已经尝试了典型的DBCC CHECKDB
命令(仍然没有repair_allow_data_loss
,如果没有其他方法,那将是我的最后选择)。
在许多数据库进入数据库之后(数据库是一个1.5 TB的小怪物,我所做的一切都很缓慢并且需要一段时间),我尝试从上次已知的损坏页面备份中恢复联机页面。
为此,我已经完成了一个脚本,该脚本RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
从DBCC CHECKDB
输出中创建了许多命令(基本上是一个正则表达式和一个单独的命令)...到目前为止,效果很好,可以说达到了1000页的限制每个还原命令每个文件(此db上有8个文件)。
因此,它要求我“完成在线还原”,但是我对如何做到这一点感到茫然。我基本上不知道如何完成还原以继续尝试其余页面。
我尝试了一个,RESTORE DATABASE <foo> WITH RECOVERY
但是也没有用,它要求我提供我没有的日志。
有人对我如何从此处恢复任何内容有任何提示吗?还是如何“完成”在线还原,以便我可以继续尝试恢复更多页面?如果我尝试脱机还原(基本上添加WITH NORECOVERY
到所有内容,然后尝试将其恢复到最后,是否会遇到相同的问题?)
手工计算数据库基本上是不可能的……有数百个表和数百万行,并且没有明确的含义。数SELECT
百万行后,损坏的数据库将对查询失败,但是我不确定我可以算出哪里。我试过重建所有非聚集索引,但是有行数据损坏的页面,所以也行不通。
某些数据丢失是可以接受的,但至少应尝试实现数据库的一致性。
损坏的数据库仍处于联机状态,并且客户正在使用它(因此它将不断获取新数据),因此,我在实验室工作台上执行的任何过程都应可在生产数据库上重现(停机将非常困难)。
这是SQL Server 2014 Enterprise
PS:我不是DBA ...我是一名程序员,但是客户端尝试了一些“专家” sql灾难恢复服务,但他们已经放弃了,所以我被要求研究一下,看看是否可以做任何事情。
更新:经过多次测试,逐页还原是不可行的,因此我们放弃了这个想法。我们将进行手动恢复(手动从损坏的表中选择丢失的记录,并将其插入到最后一个已知的良好备份中),为此做一些自动化的工具(同样,有成百上千的表)。