4

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

-- 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 Filestream 数据的二进制数据。

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

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

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

CHCEKPOINT

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

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

所以我希望能够做的,但我没有在所有网络上找到解决方案是:

  1. 仅复制.mdf+ .ldf(包含数据)

  2. 以某种方式创建“假文件流数据”(SQL Server 将在附加时接受的数据)

  3. 附加.mdf.ldf伪造文件流数据以创建测试数据库

当然,我不希望对 blob 的查询起作用,但对其他表的所有查询,是的。

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

4

1 回答 1

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 包,然后可以重新导入这些数据。

于 2017-09-26T14:56:44.427 回答