Sql-Server
如何使 FILESTREAM 文件失去/損壞的數據庫聯機?
我已經損壞了數據庫中與 FILESTREAM 相關的文件。
和文件仍然完好無損
.mdf
,.ldf
但是當我嘗試使數據庫聯機時,它會抱怨,說與 FILESTREAM 相關的文件不正確。我不關心儲存在 FILESTREAM 中的數據,但我關心其他數據。我可以從文件
.mdf
中取回它嗎?.ldf
如何?當我執行時:
sp_attach_db @dbname = 'Demo', @filename1 = N'<File path>.mdf', @filename2 = N'<File path>.ldf'
回應是:
Msg 5120, Level 16, State 105, Line 1 Unable to open the physical file "<Location>". Operating system error 2: "2(The system cannot find the file specified.)". Msg 5105, Level 16, State 14, Line 1 A file activation error occurred. The physical file name '<Location>' may be incorrect. Diagnose and correct additional errors, and retry the operation. Msg 1813, Level 16, State 2, Line 1
我終於找到了方法。我發現了一些非常古老的備份。數據同時發生了變化,擁有該數據的最新版本非常重要,這意味著無法僅恢復舊備份。相反,感謝 ServerFault 上的 Michael Eklöf ,我做了以下事情:
- 複製目前
.mdf
和.ldf
文件。- 列出舊備份的文件組:
use [master] go restore filelistonly from disk = 'E:\Database backups\Hello_backup_2012_03_10_202359_9203520.bak' go
- 從舊備份恢復數據庫,使用上一個結果中的文件組名稱:
restore database [Hello] from disk = 'E:\Database backups\Hello_backup_2012_03_10_202359_9203520.bak' with move 'Hello' to 'D:\Database\Hello.mdf', move 'Hello_log' to 'D:\Database\Hello_log.ldf', move 'Hello_files' to 'D:\Database\Hello_files' go
- 將新版本數據庫中缺少的文件組(在我的情況下為 FILESTREAM)設置為離線:
alter database [Hello] modify file (name = 'Hello_files', offline) go
- 使數據庫離線。
.mdf
將步驟 3 中伺服器創建的和.ldf
文件替換為步驟 1 中複製的文件。- 將數據庫聯機。
失去文件組仍然有後果。有些操作需要數據庫完整;這些關鍵操作中的一項是備份。換句話說,通過上述六個步驟恢復的數據庫是不可能進行全備份的。
為了恢復備份能力,我複制了數據庫的結構(通過任務→生成腳本…),不包括依賴文件流的表,然後複製數據本身。