笔者的一个大小为2 TB的SQL Server的database的LDF文件在玩存储盘映射的过程当中莫名其妙的丢失了. 好在MDF文件还在. 笔者慌了, Bruce Ye告诉笔者, 不用着急, 光用MDF也能够把数据库弄回来的. 笔者就问Bruce, 假设我能够容忍LDF中信息的丢失的话, 那么该如何恢复这个数据库呢?php
咱们执行了下面的步骤:sql
1. 在SQL Server Management Studio中删除状态为Recovery Pending的(即丢失了LDF的)问题数据库.数据库
2. 重命名老的MDF文件.session
3. 重建一个新的数据库, 名字跟刚刚删除的数据库彻底同样. 注意, 新的MDF的位置跟咱们老的MDF的文件的位置相同. 这里的LDF文件的位置选在你想要存放的最终位置上(这个就是你所要的被恢复的LDF文件了).wordpress
4. 停掉SQL Server服务, 将新的MDF重命名掉, 老的MDF命名回原来的名字.ui
5. 启动SQL Server服务, 这时这个数据库的状态会变为Recovery Pending. 咱们开始执行下面的脚本.code
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. 这时数据库的状态就应该恢复正常了.orm
问题解决.server
笔者在运行上面的脚本的时候, 遇到了一个报错. 在运行了命令alter database contentdb1 set single_user with rollback immediate以后, 运行alter database contentdb1 rebuild log on 的时候说数据库在single user mode, 个人当前用户没法执行命令.ci
我使用了命令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
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