对于sql 数据库丢失日志文件(ldf)只有数据文件(mdf)的时候使用此方法修复。

我们执行了下面的步骤:


1. 在SQL Server Management Studio中删除状态为Recovery Pending的(即丢失了LDF的)问题数据库.


2. 重命名老的MDF文件.


3. 重建一个新的数据库, 名字跟刚刚删除的数据库完全一样. 注意, 新的MDF的位置跟我们老的MDF的文件的位置相同. 这里的LDF文件的位置选在你想要存放的最终位置上(这个就是你所要的被恢复的LDF文件了).


4. 停掉SQL Server服务, 将新的MDF重命名掉, 老的MDF命名回原来的名字.


5. 启动SQL Server服务, 这时这个数据库的状态会变为Recovery Pending. 我们开始执行下面的脚本.

alter database contentdb1 set emergency
alter database contentdb1 set single_user with rollback immediate
alter database contentdb1 rebuild log on (name=ContentDB1_log,filename='E:\CDBLOG\contentdb1log.ldf')
ALTER DATABASE contentdb1 SET MULTI_USER with rollback immediate

这时数据库的状态就应该恢复正常了.


6.运行: 

use Survey go
ALTER DATABASE Survey SET SINGLE_USER DBCC CHECKDB (Survey, repair_allow_data_loss) with NO_INFOMSGS go
ALTER DATABASE Survey SET MULTI_USER go

进行完整性检查,不然程序查询时会报错。 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 1:126647,但实际为 0:0)。在文件 'D:\DataBase\Survey.mdf' 中、偏移量为 0x0000003dd6e000 的位置对数据库 ID 7 中的页 (1:126647) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,问题解决.(此过程时间有点长,本次修复一个170多M的MDF文件,大概耗时2个半小时左右).


笔者在运行上面的脚本的时候, 遇到了一个报错. 在运行了命令alter database contentdb1 set single_user with rollback immediate之后, 运行alter database contentdb1 rebuild log on 的时候说数据库在single user mode, 我的当前用户无法执行命令.


我使用了命令exec sp_who2, 发现我的contentdb1上有个suspend的session, 执行命令kill XY 杀掉这个死掉的session之后, 问题解决.