我一直在备份我的SQL Server 2014 Express数据库以导入到其他服务器,并且注意到.bacpac.bak之间的文件大小有所不同。

为什么.bacpac文件比.bak文件小?相同的数据库?

感谢您提供任何见解!

#1 楼

一个



.bacpac文件=架构+数据。请注意,数据是使用本机格式(人类不可读)进行BCP输出的。


您可以将.bacpac重命名为.zip以查看实际内容。
您可以使用...DAC\bin\sqlpackage.exe命令行以编程方式提取.bacpac内容。
这是一个快照,其中包含来自SQL Server或Azure SQL数据库的用户数据+架构。



-



备份(通常具有.bak扩展名)=完整数据库备份包含数据库的完整副本,并提供单个时间点数据库可以还原。完整备份包含一些事务日志记录,以便可以使还原的组件(数据库,文件或文件组)在事务上保持一致。

BACPAC不能代替完整备份。它只是一个快照,可用于将数据库从一台服务器移至另一台服务器(或移至云)并以开放格式归档现有数据库。

从我的测试中,下面是结果



评论


日志文件可能是造成大小差异的最大原因。

– Paul Spangle
17年2月17日在14:26

我假设.bacpac中也没有索引数据,这很可能是文件大小的BIG贡献者。

–罗里
17年3月13日在10:42

#2 楼

好吧,最大的不同是.bacpac文件的数据被压缩(使用zip),而普通.bak文件却不是这种情况。
只需压缩.bak文件,然后看它要小得多;)

#3 楼

通过BACKUP DATABASE命令(.bak)创建的备份是数据库的逐页副本。请注意,SQL Server数据库不仅包含数据页。也有索引可能很大的页面。使用“导出数据层应用程序”(.bacpac)操作创建的备份只是将来自数据库的XML格式的行导出到存档中。您可以手动查看BACPAC的内容,只需将此文件的扩展名更改为.zip。
.bacpac文件的大小与数据库中的记录数成正比(考虑到压缩率)。
.bak文件的大小不仅取决于数据,而且还取决于索引的大小。
有时这可能是个问题,例如,请查看此旧讨论
,因此, .bacpac文件通常较小。
我使用AdventureWorks数据库进行了最简单的测试,并得到了这些结果。
AdventureWorks.bacpac - 17 mb
AdventureWorks.bacpac.zip - 16 mb
AdventureWorks_with_compression.bak - 49 mb
AdventureWorks_with_compression.bak.zip - 47 mb 

我应该使用.bacpac来减小备份大小吗?
否。
导出\导入数据层应用程序具有几个重大缺点,这些缺点对于大型数据库至关重要:

这不是事务一致的操作。这些表按顺序导出。外键可能存在问题。
这是双重不利的,因为只有在尝试恢复时才发现它。因此,执行此操作时,您需要为数据库拍摄快照并导出快照。
导出和导入都需要更长的时间。当前
您紧急需要执行还原时,您将无法执行此操作
,因为从.bacpac进行的还原将需要几个小时才能完成

导出可以显着加载服务器,尤其是对于大型
表,这与以前的观点一起使定期的
备份成为一个可疑的决定。

使用BACKUP DATABASE命令创建的经典备份没有这些缺点,可以节省空间,使用时间点恢复
导出\导入数据层应用程序可以被认为是仅为小型数据库创建备份的一种方式。无法访问文件系统的情况。在这种情况下,在任何情况下都不要导出实时数据库,请确保创建快照以实现一致的导出。