一个大小为 5.2 GB 的 Subversion 存储库,包含 339 个修订版本。
当我使用 Perl 脚本运行备份时,最终文件大小为 28 GB。
我能知道这是怎么可能的吗?我很困惑。
下面的备份脚本。
#!/usr/bin/perl
my $svn_repo = "/subversion/REPONAME";
my $bkup_dir = "/mnt/Subversion/SVN-Backups/REPO_DIR/";
my $bkup_file = "REPONAME_backup-";
my $bkup_svr = "my.backup.com";
my $bkup_svr_login = "backup";
$bkup_file = $bkup_file . `date +%Y%m%d-%H%M`;
chomp $bkup_file;
my $youngest = `svnlook youngest $svn_repo`;
chomp $youngest;
my $dump_command = "svnadmin -q dump $svn_repo > $bkup_dir/$bkup_file";
print "\nDumping Subversion repo $svn_repo to $bkup_file...\n";
print `$dump_command`;
print "Backing up through revision $youngest... \n";
print "\nCompressing dump file...\n";
print `gzip -9 $bkup_dir/$bkup_file\n`;
chomp $bkup_file;
my $zipped_file = $bkup_dir . "/" . $bkup_file . ".gz";
print "\nCreated $zipped_file\n";
答案1
Subversion 使用复杂的压缩。但是,您使用最大压缩率对备份进行了 gzip 压缩,并且备份文件仍然比存储库大得多。如果您的存储库包含许多相同的文件,这可以通过表示共享来解释:
“虽然分层存储从一开始就是 Subversion 设计的一部分,但多年来它一直在不断改进。使用 Subversion 1.4 或更高版本创建的 Subversion 存储库受益于文件内容全文表示的压缩。使用 Subversion 1.6 或更高版本创建的存储库进一步享受表示共享带来的磁盘空间节省,该功能允许具有相同文件内容的多个文件或文件修订引用该数据的单个共享实例,而不是每个文件都有自己的独特副本。”来源和更多细节
要进一步缩小备份文件,您可以切换算法。bzip2 或 LZMA 的压缩率更高,但比 gzip 慢。
您可以使用svn export
将存储库的一个版本导出到测试目录来测试这一点。如果您以与备份脚本中相同的方式压缩该导出,则生成的文件大小应该大致相同。
答案2
这就是我使用 svadmin hotcopy 而不是 svnadmin dump 进行备份的原因。hotcopy 的缺点是直到 1.8 版你都无法进行增量备份。但是 hotcopy 至少可以为你提供与 subversion 存储库相同的压缩。