我的应用程序有一个数据库,我以这种方式从备份文件创建:
-- 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派对工具)来实现我的需求?
答案 0 :(得分:2)
将其移至其他数据库
如果是我,我会考虑将blob数据分解到另一个数据库中。但我不确定你目前的结构,或者说它有多实用。但是,您仍然可以在原始数据库中拥有一个视图,该视图从新数据库中的表中进行选择,和/或重新组合每个表中的多个表。
编写数据库脚本
另一个不太完美的选择是编写数据库脚本。 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
文件组A和C的在线恢复 由于它们的数据没有损坏,因此不必从备份中恢复这些文件组,但必须恢复这些文件组才能使它们联机。 数据库管理员立即恢复A和C.
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包,然后可以重新导入。