如何使 FILESTREAM 文件丢失/损坏的数据库联机?

Ars*_*nko 6 sql-server-2008 sql-server corruption filestream

我损坏了数据库中与 FILESTREAM 相关的文件。

.mdf.ldf文件仍然完好,但是当我尝试上网的数据库,它抱怨,说有关FILESTREAM的文件是不正确的。

我不关心存储在 FILESTREAM 中的数据,但我关心其他数据。我可以从.mdf.ldf文件中取回它吗?如何?

当我执行:

sp_attach_db @dbname = 'Demo',
             @filename1 = N'<File path>.mdf',
             @filename2 = N'<File path>.ldf'
Run Code Online (Sandbox Code Playgroud)

答复是:

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
Run Code Online (Sandbox Code Playgroud)

Ars*_*nko 6

我终于找到了怎么做。我发现了一些非常旧的备份。与此同时,数据发生了变化,拥有这些数据的最新版本很重要,这意味着不可能只恢复旧的备份。相反,我做了以下工作,感谢 Michael Eklöf 在 ServerFault 上

  1. 复制当前.mdf.ldf文件。

  2. 列出旧备份的文件组:

    use [master]
    go
    
    restore filelistonly
    from disk = 'E:\Database backups\Hello_backup_2012_03_10_202359_9203520.bak'
    go
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从旧备份恢复数据库,使用先前结果中的文件组名称:

    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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将新版本数据库中缺少的文件组(在我的例子中是 FILESTREAM)设置为离线:

    alter database [Hello]
    modify file (name = 'Hello_files', offline)
    go
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使数据库脱机。

  6. 将服务器在步骤 3 中创建的.mdf.ldf文件替换为在步骤 1 中复制的文件。

  7. 使数据库联机。

丢失文件组的后果仍然存在。有些操作需要数据库完成;这些关键操作之一是备份。换句话说,通过上述六个步骤恢复的数据库是不可能进行完整备份的。

为了恢复备份能力,我复制了数据库的结构(通过任务?生成脚本...),不包括依赖于文件流然后复制数据本身的表。