我的应用程序有一个我以这种方式从备份文件创建的数据库:
-- 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
仅(包含数据).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/