svnadmin hotcopy是将整个库都“热”拷贝一份出来,包括库的钩子脚本、配置文件等;任何时候运行这个脚本都得到一个版本库的安全拷贝,不管是否有其他进程正在使用版本库。
因此这是俺青睐的备份方式。
1)定义备份策略
备份频度:每天进行一次全量备份,
备份地点:备份目录以日期命名,备份路径到 /home/backup/svn/${mmdd}
备份保留时期:保留10天到15天,超过15天的进行删除。
备份时间:每晚21点开始
备份检查:备份完毕后自动运行检查脚本、自动发送报告。
2)建立备份脚本
在自己home目录 ~/下创建一个文件,backup.sh:
#!/bin/bash
SRCPATH=/home/svn/repos/; #定义仓库parent路径
DISTPATH=/home/backup/svn/`date +%m%d`/ ; #定义存放路径;
if [ -d "$DISTPATH" ]
then
else
mkdir $DISTPATH
chmod g+s $DISTPATH
fi
echo $DISTPATH
svnadmin hotcopy $SRCPATH/Project1 $DISTPATH/Project1 >/home/backup/svn/cpreport.log 2>&1;
svnadmin hotcopy $SRCPATH/Project2 $DISTPATH/Project2
cp $SRCPATH/access
$DISTPATH; #备份access文件
cp $SRCPATH/passwd $DISTPATH; #备份passwd文件
perl /home/backup/svn/backup_check.pl #运行检查脚本
perl /home/backup/svn/deletDir.pl #运行删除脚本,对过期备份进行删除。
3)建立检查脚本
在上面指定的地方/home/backup/svn/下建立一个perl脚本:backup_check.pl
备份完整性检查的思路是:对备份的库运行 svnlook youngest,如果能正确打印出最新的版本号,则表明备份文件没有缺失;如果运行报错,则说明备份不完整。我试过如果备份中断,则运行svnlook youngest会出错。
perl脚本代码如下:
#! /usr/bin/perl
## Author:xuejiang
## 2007-11-10
## http://www.scmbbs.com
use strict;
use Carp;
use Net::SMTP;
#### defined the var #######
my $smtp =Net::SMTP->new('mail.scmbbs.com', Timeout => 30, Debug => 0)|| die "cann't connect to mail.scmbbs.comn";
my $bkrepos="/home/backup/svn/".&get_day;#定义备份路径
my $ssrepos="http://www.scmbbs.com/repos";#定义仓库url
my @repos = ("project1","project2");
my $title="echo "如下是昨晚备份结果与真实库对比的情况,如果给出备份版本数,则表示备份成功;如果给报错信息或没有备份版本数,则表示备份失败:" >./report";
system $title || die "exec failedn";
foreach my $myrepos(@repos)
{
my $bkrepos1=$bkrepos."/".$myrepos;
my $ssrepos1=$ssrepos."/".$myrepos;
my $svnlookbk1 = "echo "$myrepos 昨晚备份的版本是:">>./report;svnlook youngest ".$bkrepos1." >> ./report 2>&1";
my $svnlookss1 = "echo "$myrepos 真实库中的最新版本及最后修改时间是:">>./report;svn log -r'HEAD' ".$ssrepos1." >> ./report 2>&1";
system $svnlookbk1 || die "exec failedn";
system $svnlookss1 || die "exec failedn";
}
my $body ="echo "=========================================================================" >>./report";
my $bottom ="echo "备份位置:来自http://www.scmbbs.com的".$bkrepos."" >>./report";
system $body || die "exec failedn";
system $bottom || die "exec failedn";
###### report the result ####
open(SESAME,"./report")|| die "can not open ./report";
my @svnnews = ;
close(SESAME);
foreach my $line1 (@svnnews)
{
print $line1."n";
}
my @email_addresses =("scm@list.scmbbs.com","leader1@scmbbs.com","leader2@scmbbs.com");
my $to = join(', ', @email_addresses);
$smtp->mail("scm@scmbbs.com");
$smtp->recipient(@email_addresses);
$smtp->data();
$smtp->datasend("To:$to\n");
$smtp->datasend("From: svnReport@scmbbs.comn");
$smtp->datasend("Subject:svn备份检查报告".&get_today."n");
$smtp->datasend("Reply-to:scm@scmbbs.comn");
$smtp->datasend("@svnnews");
$smtp->dataend();
$smtp->quit;
#############
sub get_today
{
my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() );
$year += 1900;
$month++;
my $today = sprintf( "%04d%02d%02d", $year, $month, $day);
return $today;
}
sub get_day
{
my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() );
$year += 1900;
$month++;
my $today = sprintf( "%02d%02d", $month, $day);
return $today;
}
4)定义删除脚本
由于是全量备份,所以备份不宜保留太多,只需要保留最近10来天的即可,对于超过15天历史的备份基本可以删除了。
在/home/backup/svn/下建立一个perl脚本:deletDir.pl
(注意,删除svn备份库可不像删除普通文件那么简单)
脚本代码请参看我的另一个帖子:http://www.scmbbs.com/cn/systp/2007/12/systp6.php
5)修改/etc/crontab 文件
在该文件中指定每晚21点执行“backup.sh”脚本。
http://blog.chinaunix.net/uid-305417-id-2133668.html
=======================
因为有些svnadmin命令(例如svnadmin hotcopy --incremental ;svanadmin pack),只能用于FSFS格式库文件。需要知道当前库的文件格式是什么。
例如:Subversion(SVN)备份问题(用 svnadmin hotcopy 支持增量备份) https://www.cnblogs.com/johnphan/p/9282662.html
使用 svnadmin info 命令可以查看库文件的格式设置。
要注意的是,更新日志上说1.9.0版本才支持这个功能,
Version 1.9.0
(5 Aug 2015, from /branches/1.9.x)
http://svn.apache.org/repos/asf/subversion/tags/1.9.0
* svnadmin info: new subcommand to print info about a repository
使用例子:
E:\Repositories>svnadmin info aa
Path: aa
UUID: 7896e1b3-c25b-dc44-bc7b-5e1bd20f2010
Repository Format: 5
Compatible With Version: 1.8.0
Repository Capability: mergeinfo
Filesystem Type: fsfs
Filesystem Format: 6
FSFS Sharded: yes
FSFS Shard Size: 1000
FSFS Shards Packed: 0/0
FSFS Logical Addressing: no
Configuration File: aa\db\fsfs.conf
(上面最后一行,提示不使用这个命令,在相应的目录下,看到文件名: fsfs.conf,也可以做出判断出来当前SVN库的文件类型是fsfs。这也许是最原始的方法。)
=====================================================================
SVN备份方法:
- 直接备份SVN的Pepositories文件,应该是最不好的方法,需要停止Subversion服务。不然,可能出问题。
- 用命令svnadmin Dump&Load备份的方法,只能备份数据部分,无法备份SVN的权限设置、hook脚本等数据。但可以选择备份数据库的一部分数据,也实现可增量备份。
- 备份SVN 的最好方法,是用 svnadmin hotcopy 备份的方法,第一次要全部备份(耗时巨长);以后的每次备份,用 svnadmin hotcopy --incremental 选项,每次增量备份,速度飞快。
但是,svnadmin hotcopy 这种备份方法无法备份 SVN 或 VisualSVN 的配置数据,包括:用户信息、分组分组、用户权限分配、用户设置的密码,这几个文件还是手工备份一下吧!
注意:这个增量备份的选项,仅仅在库文件是 FSFS 格式才可用。当然,一般SVN都是用这种格式。
参考资料:
查看已经创建的svn库是 FSFS 还是 VDFS 的
网络(中文)上许多地方都说 svnadmin hotcopy 不能增量备份!
查看Subversion的升级日志,早在2013年 svnadmin hotcopy 就支持增量备份了。
日志摘录:
Version 1.8.0
(18 Jun 2013, from /branches/1.8.x)
* new 'svnadmin hotcopy --incremental' support for FSFS (issue #3815)
https://svn.apache.org/repos/asf/subversion/trunk/CHANGES
网络上有资料说,每次增量备份可以是这样:
svnadmin verify %repopath%
svnadmin pack %repopath%
svnadmin hotcopy %repopath% %backupdir% --incremental
网摘一段参考文字:http://subversion.apache.org/docs/release-notes/1.8.html#incremental-hotcopy
the svnadmin hotcopy command now supports incremental operation, triggered by the new --incremental option.
In prior releases of Subversion, svnadmin hotcopy refused to copy over an existing destination repository, and always copied the entire repository. For large repositories, performing a hotcopy could take several hours, preventing an efficient backup process.
In incremental hotcopy mode, revision data which has already been copied from the source to the destination repository will not be copied again. svnadmin hotcopy --incremental will only copy new revisions, and revisions which have changed in size or had their modification time stamp changed since the previous hotcopy operation.
Up to now, svnsync or svnadmin dump --incremental were the only alternatives for incremental repository backup. However, these commands need to perform additional processing while transforming revision data into an intermediate format before creating revision files in the destination repository. Performance of svnadmin hotcopy is only limited by disk I/O.
Incremental hotcopy is not supported for BDB repositories. See issue 4081 for more information.