2013-07-01 16:42 from—http://www.cnblogs.com/awpatp/archive/2013/07/01/3165134.html

笔者的一个大小为2 TB的SQL Server的database的LDF文件在玩存储盘映射的过程中莫名其妙的丢失了. 好在MDF文件还在. 笔者慌了, Bruce Ye告诉笔者, 不用着急, 光用MDF也可以把数据库弄回来的. 笔者就问Bruce, 假设我可以容忍LDF中信息的丢失的话, 那么该如何恢复这个数据库呢?

 

我们执行了下面的步骤:

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

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

 

问题解决.

 

笔者在运行上面的脚本的时候, 遇到了一个报错. 在运行了命令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之后, 问题解决.

 

参考资料

=====================

SQL – Get Exclusive Lock – Fix for The database could not be exclusively locked to perform the operation error

http://robbamforth.wordpress.com/2009/11/13/sql-get-exclusive-lock-fix-for-the-database-could-not-be-exclusively-locked-to-perform-the-operation-error/

Rebuilding Transaction Log in SQL Server 2000, 2005, 2008

http://database-wiki.com/2011/03/06/rebuilding-transaction-log-in-sql-server-2000-2005-2008/

CHecking SQL Acitivity

http://networking.ringofsaturn.com/SQL/sql-activity.php

How to recover database from MDF in SQL Server 2005?

http://stackoverflow.com/questions/773059/how-to-recover-database-from-mdf-in-sql-server-2005