sql-server-2008-r2 - 是否可以创建一个虚拟文件流文件组来仅研究 mdf 内容?

标签 sql-server-2008-r2 sqlfilestream

我的应用程序有一个我以这种方式从备份文件创建的数据库:

-- create empty db
CREATE DATABASE MyNewDB

-- restore on the empty db from file    
RESTORE DATABASE MyNewDB
FROM DISK = 'c:\Temp\MyNewDB.bak'
WITH REPLACE,
MOVE 'MyDB_Data' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.EXPRESS2008R2\MSSQL\DATA\MyNewDB.mdf',
MOVE 'MyDB_Log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.EXPRESS2008R2\MSSQL\DATA\MyNewDB_log.LDF',
MOVE 'MyDBFS' TO 'C:\FileStreamData\MyNewDBFS'

我使用文件流文件组只存储 blob,基本上我有一个表,我在那里存储文件,还有一个 blob 列,其中包含保存为 SQL Server 文件流数据的二进制数据。

随着客户继续使用该应用程序,文件流部分变得巨大,可能是 mdf 为 500MB,文件流为 60GB

通常为了在开发机器上调试问题,我需要传输“仅表”(“500MB”)和“不是 blob”(“60GB”)。

我所做的是复制数据库,并在复制的数据库上,将文件表中的 blob 列设置为 NULL,然后运行
CHCEKPOINT

然后我等待垃圾收集器完成它的工作,然后我可以进行备份并拥有一个小文件。

有时我没有空间来恢复备份的副本,或者我没有时间去做。

所以我很想能够做,但我没有在所有网络中找到解决方案是:
  • 复制 .mdf + .ldf仅(包含数据)
  • 以某种方式创建“假文件流数据”(SQL Server 将在附加时接受的数据)
  • 附上 .mdf , .ldf并伪造文件流数据以创建测试数据库

  • 当然,我不希望 blob 上的查询工作,但其他表上的所有查询,是的。

    有没有办法(甚至可能使用 3d 派对工具)来实现我所需要的?

    最佳答案

    将其移动到不同的数据库

    如果是我,我会考虑将 blob 数据分解到另一个数据库中。但我不确定你目前的结构,或者它有多实用。但是,您仍然可以在原始数据库中拥有一个 View ,该 View 从新数据库中的表中进行选择,和/或从每个表中重新组合多个表。

    编写数据库脚本

    另一个不完全漂亮的选择是编写数据库脚本。 Management Studio 可以创建一个脚本文件,运行时将创建表并插入值。例如,如果您需要将数据从 SQL 2014 数据库复制到 SQL 2008 等,这可能是必要的。通常,您可以对编写脚本的内容做出一些选择。 (右键单击数据库并选择“任务”->“生成脚本”以启动向导。)

    导出数据

    您可以导出数据并导入所述数据,而不是恢复备份。执行此操作时,您可以选择包含哪些数据。您可以跳过 blob 表或跳过 blob 列。

    零碎回收

    最后,您可能还想查看有关仅某些文件或仅某些文件组的零碎恢复的链接。 https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/example-piecemeal-restore-of-only-some-filegroups-full-recovery-model

    Online restore of filegroups A and C. Because their data is undamaged, these filegroups do not have to be restored from a backup, but they do have to be recovered to bring them online. The database administrator recovers A and C immediately.


    RESTORE DATABASE adb FILEGROUP='A', FILEGROUP='C' WITH RECOVERY  
    RESTORE DATABASE adb FILEGROUP='B' FROM backup2b WITH RECOVERY  
    

    从理论上讲,您可以在这里备份空白数据库的文件流文件组,然后在恢复时尝试单独使用它。但是,我不确定这条路线是否适合您。如果您的 blob 位于同一个表中,在同一个数据库中,那么 sql 可能会存储一些数据以将这些数据拼接在一起。在还原时,sql 可能会检查 blob 数据是否一致和/或兼容?

    结论

    我真的认为将你的 blob 分解到他们自己的表中,然后将它们移动到一个单独的数据库是我会在你的鞋子里做的。

    您可能无法直接连接到这些数据库,否则上面提到的脚本选项,或者 SQL 任务导入数据都可能是选项。

    但这就是说,仍然有 sql 导出数据选项。 您可以构建一个仅导出所需数据的 SSIS 包,然后可以重新导入这些数据。

    关于sql-server-2008-r2 - 是否可以创建一个虚拟文件流文件组来仅研究 mdf 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46324380/

    相关文章:

    c# - 异常 : User does not have permission to perform this action

    tsql - 如何更改包含方括号的 SQL Server 凭据?

    tsql - SQL删除具有重复值的行,同时保留一个

    每个分区的sql server唯一键

    带有 Unicode 字符串的 SQL Select 命令未检索预期数据

    c# - 将 SQL Server 文件流与 LINQ 结合使用

    sql-server - SQL Server : deleting FIELSTREAM files and num_unprocessed_items