7

我面临上述主题的问题。是否可以仅从 Filestream 数据库中进行数据备份并恢复该备份?

场景:我们将产品图像存储到数据库中,数据库大小现在超过 70 GB。因此,很难每天进行同样的备份,而且也很耗时。我们提供了 BCP 备份工具,但我们不会继续使用相同的工具,因为有时我们在恢复 BCP 备份时注意到表中缺少一些行。同样是客户端,或者我们不关心图像数据,如果发生了什么,那么如果我们只是在启用新文件流的情况下恢复数据备份,我们将再次上传图像文件。

我做过的研发:

1)方法1:

我已经使用以下查询进行了备份,我认为它只会给我数据。

BACKUP DATABASE [DBName] 
        FILEGROUP = N'PRIMARY' TO  DISK = N'E:\SendReceiveData\Test.bak' 
        WITH NOFORMAT, NOINIT,  
        NAME = N'DBName-Full Filegroup Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

现在,我想使用以下查询在其他位置恢复相同的备份。(使用 Management Studio 我无法恢复数据库)

RESTORE DATABASE [RestoreDBName] 
  FILE = N'DBName'
  FROM  DISK = N'E:\SendReceiveData\Test.bak' 
  WITH  FILE = 1,  
  MOVE N'DBName' TO N'D:\MyDatabases\RestoreDBName.mdf',  
  MOVE N'DBName_log' TO N'D:\MyDatabases\RestoreDBName_0.ldf',  
  NOUNLOAD,  REPLACE,  STATS = 10

但是当我检查文件组时 FileStream 组已经创建,即使我在恢复查询时没有提到。此外,如果我想删除文件流表,它不允许删除并给我错误。如果我直接尝试删除 FilestreamGroup,那么也会给我错误。我想如果能够删除文件流表和文件组,那么我可以新创建它们并将使用新的文件流,但我不能这样做。

2)方法2:

我如上所示备份数据库。但是在恢复时,我首先使用 Filestream 创建空白数据库并尝试恢复数据库,但这也给了我错误。

3)方法3:

我认为 Filestream 表属于 Primary FileGroup,这就是它包含文件流组的原因。所以我创建了一个临时数据库,其中一个表是我用主文件组创建的,图像表是我用 ImageData 文件组创建的。然后只备份主文件组,并假设如果我恢复数据库,图像表将不会出现。但仍然图像表显示在恢复数据库中。如果我看到文件组,则所有 4 个文件组(Primary、ImageData、Log 和 Filestream)都可用。

那么你能指导我哪里错了或者不可能吗?我正在使用 SQL Server 2008。

4

2 回答 2

0

我用来备份数据库简单查询:

  Backup Database NameDatabase to Disk='database.bak'

并恢复数据库简单查询:

ALTER DATABASE NameDatabase SET OFFLINE WITH ROLLBACK IMMEDIATE; RESTORE DATABASE NameDatabase From Disk ='Pathefile' WITH REPLACE

在像这样查询标志以掌握之前需要一些时间来做:

use master  Backup Database NameDatabase to Disk='database.bak'
  • 注意:您可以直接使用:“With replace”来避免一些错误
于 2020-10-11T22:35:52.563 回答
0

显然这是不可能的,如果您在备份期间跳过与文件流相关的逻辑文件,还原操作会将数据库置于恢复挂起模式。

原因是因为 Filestream 文件默认由数据分区中的表支持。因此,如果我们将表还原为备份的一部分而不是实际文件,那么您最终将得到一个引用文件但没有文件的表。我尝试了许多不同的方法,但我只见证了数据和元数据的完整性将会丢失。唯一的方法是拥有两个独立的数据库,一个用于数据,另一个用于文件流。

于 2020-10-24T11:14:20.857 回答