筆者的一個大小爲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