3

我昨晚使用 SQL Azure 导入/导出服务进行的 BACPAC 有点奇怪。

在我们的数据库中有 2 个相关的表。

dbo.Documents --All Documents in the database
  Id
  DocName
  Extension

dbo.ProcessDocuments --Doc's specific to a process
  Id
  DocumentId (FK -> dbo.Documents.Id with Check Constraint)
  ProcessId

基于该模式,ProcessDocuments表应该不可能包含在主表中没有伴随条目的行Documents

但是,在我在另一个环境中还原数据库之后,我最终得到了

7001 个条目ProcessDocuments。他们只有 7000 个等效条目Documents(缺少 1 个)。并且在尝试恢复时恢复ALTER TABLE CHECK CONSTRAINT失败ProcessDocuments

我唯一能想象的是,在进行备份时,它是按顺序(按字母顺序排列???)遍历表,并一次备份数据 1 个表,并且发生了类似以下的事情。

  • Documents得到备份。包含 7000 个条目
  • 有人向系统添加新的流程文档/插入到Documents&Process Documents
  • ProcessDocuements得到备份。包含 7001 个条目

如果是这种情况,那么就将 BACPAC 用作有效的灾难恢复资产而言,它会产生一个巨大的问题,因为如果在系统有数据移动时使用它们,那么您的 BACPAC 可能包含数据完整性问题。

是这样吗,或者任何人都可以阐明其他可能导致这种情况的原因吗?

4

2 回答 2

5

数据导出使用数据库上的批量操作,不保证是事务性的,所以像你描述的问题可能并且最终会发生。

“导出操作对数据库中每个表的数据执行单独的批量复制,因此不能保证数据的事务一致性。您可以使用 Windows Azure SQL 数据库复制数据库功能来制作数据库的一致副本,并且从副本执行导出。” http://msdn.microsoft.com/en-us/library/windowsazure/hh335292.aspx


如果要创建事务一致的备份,则必须先复制数据库(这可能会花费您很多,具体取决于数据库的大小),然后将复制的数据库导出为 BACPAC(如 ramiramilu 指出的那样)http://msdn。 microsoft.com/en-us/library/windowsazure/jj650016.aspx

你可以自己做,也可以使用RedGate SQL Azure Backup,但据我了解,他们遵循与上述完全相同的步骤,所以如果你选择他们一致的备份选项,它也会让你付出代价。

于 2014-01-16T13:46:14.303 回答
1

根据 Slav 的回答,bacpac 是非事务性的,如果在生成 bacpac 时将任何新行添加到任何表中,则会损坏。

为了避免这种情况:

1)复制目标数据库,直接返回,但是数据库复制需要一些时间。此操作将创建一个完整的事务副本:

CREATE DATABASE <name> AS COPY OF <original_name>

2)查找您的复制操作的状态:

SELECT * FROM sys.dm_database_copies

3) 在复制的数据库上生成一个没有被任何人使用的 bacpac 文件。

4) 删除复制的数据库,您将拥有一个工作的 bacpac 文件。

于 2014-01-22T17:40:55.870 回答