Sql-Server

如何使 FILESTREAM 文件失去/損壞的數據庫聯機?

  • February 12, 2014

我已經損壞了數據庫中與 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 ,我做了以下事情:

  1. 複製目前.mdf.ldf文件。
  2. 列出舊備份的文件組:
use [master]
go

restore filelistonly
from disk = 'E:\Database backups\Hello_backup_2012_03_10_202359_9203520.bak'
go
  1. 從舊備份恢復數據庫,使用上一個結果中的文件組名稱:
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
  1. 將新版本數據庫中缺少的文件組(在我的情況下為 FILESTREAM)設置為離線:
alter database [Hello]
modify file (name = 'Hello_files', offline)
go
  1. 使數據庫離線。
  2. .mdf將步驟 3 中伺服器創建的和.ldf文件替換為步驟 1 中複製的文件。
  3. 將數據庫聯機。

失去文件組仍然有後果。有些操作需要數據庫完整;這些關鍵操作中的一項是備份。換句話說,通過上述六個步驟恢復的數據庫是不可能進行全備份的。

為了恢復備份能力,我複制了數據庫的結構(通過任務→生成腳本…),不包括依賴文件流的表,然後複製數據本身。

引用自:https://dba.stackexchange.com/questions/18551