svn全量和增量备份详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了svn全量和增量备份详解相关的知识,希望对你有一定的参考价值。
1.svn的安装:
yum安装:
yum install -y subversion
mkdir /data/svn
svnadmin create project-1
svnadmin create project-2
用统一配置方法:
cp authz passwd /data/svn
cp svnserve.conf /data/svn
vim svnserve.conf
修改:
anon-access = read #匿名用户可读
auth-access = write #授权用户可写
password-db = /data/svn/passwd #使用哪个文件作为账号文件
authz-db = /data/svn/authz #使用哪个文件作为权限文件
realm = My First Repository # 认证空间名,版本库所在目录
vim authz
修改:
[groups]
group_admin = admin
[/]
@group_admin = rw
[project-1:/]
yan = rw
[project-2:/]
peng = rw
vim passwd
[users]
peng = 123456
yan = 123456
admin = 123456
启动:
svnserve -d -r /data/svn --config-file=/root/svnserve.conf
svn备份方式对比分析
一般采用三种方式:
1、svnadmin dump
2、svnadmin hotcopy
3、svnsync
注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如copy、rsync命令。
曾经用rsync命令来做增量和全量备份,在季度备份检查审计中,发现备份出来的库大部分都不可用,因此最好是用svn本身提供的功能来进行备份。
优缺点分析:
第一种 svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
个人建议在版本数比较小的情况下使用这种备份方式。
第二种 svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。
第三种 svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。
优点是:当制作成2个镜像库的时候起到双机实时备份的作用;
缺点是:当作为2个镜像库使用时,没办法做到“想完全抛弃今天的修改恢复到昨晚的样子”;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。
全量备份脚本:
[[email protected] ~]# vim svn-backup-full.sh
#!/bin/bash
#Date: 2017-08-18
#Author: brook
#Mail: @qq.com
#Function: svn的全量备份
. /etc/init.d/functions
#配置库目录
SVN_REPOROOT=/data/svn
#全量备份文件存放路径
date=$(date '+%Y-%m-%d')
RAR_STORE=/svn_backup/full/$date
if [ ! -d "$RAR_STORE" ];then
mkdir -p $RAR_STORE
fi
#日志存放目录
LOG_PATH=/svn_backup/log
if [ ! -d "$LOG_PATH" ];then
mkdir -p $LOG_PATH
fi
#项目库列表
cd $SVN_REPOROOT
TOTLE=`ls | wc -l`
for name in $(ls)
do
if [ -d "$name" ];then
echo "开始备份项目库$name"
mkdir -p $LOG_PATH/$name
echo `/usr/bin/svnlook youngest $SVN_REPOROOT/$name` > ${LOG_PATH}/${name}/last_revision
.txt
/usr/bin/svnadmin hotcopya $SVN_REPOROOT/$name $RAR_STORE/${name}
if [ $? -eq 0 ]
then
action "项目库$name备份成功" /bin/true
#echo "项目库$name全备成功" | mail -s "svn全备" [email protected]
else
action "项目库$name备份失败" /bin/false
echo "项目库$name全备失败" | mail -s "svn全备" [email protected]
fi
else
echo "开始备份配置文件$name"
cp $name $RAR_STORE/$name
fi
done
增量备份脚本:
[[email protected] ~]# vim svn-backup-increment.sh
#!/bin/bash
#Date: 2018-5-17
#Author: brook
#Mail: [email protected]
#Function: svn的增量备份
#配置库目录
SVN_REPOROOT=/data/svn
#全量备份文件存放路径
date=$(date '+%Y-%m-%d')
RAR_STORE=/svn_backup/increment/$date
if [ ! -d "$RAR_STORE" ];then
mkdir -p $RAR_STORE
fi
#日志存放目录
LOG_PATH=/svn_backup/log
if [ ! -d "$LOG_PATH" ];then
mkdir -p $LOG_PATH
fi
#读取项目库列表
cd $SVN_REPOROOT
for name in $(ls)
do
if [ -d "$name" ];then
if [ ! -d "$RAR_STORE/$name" ];then
mkdir $RAR_STORE/$name
fi
if [ ! -d "$LOG_PATH/$name" ];then
mkdir $LOG_PATH/$name
fi
echo ******Starting backup from $date****** >> $LOG_PATH/$name/$name.log
echo ******svn repository $name startting to backup****** >> $LOG_PATH/$name/$name.log
/usr/bin/svnlook youngest $SVN_REPOROOT/$name > $LOG_PATH/A.TMP
UPPER=`head -1 $LOG_PATH/A.TMP`
if [ -f "$LOG_PATH/$name/last_revision.txt" ];then
NUM_LOWER=`head -1 $LOG_PATH/$name/last_revision.txt`
if [ $UPPER -eq $NUM_LOWER ];then
echo "unchanged" >> $LOG_PATH/$name/$name.log
rm -f $LOG_PATH/A.TMP
break
else
let LOWER="$NUM_LOWER+1"
/usr/bin/svnadmin dump $SVN_REPOROOT/$name -r $LOWER:$UPPER --incremental > $RAR
_STORE/$name/$LOWER-$UPPER.dump
if [ $? -ne 0 ];then
echo "项目库$name增备失败" | mail -s "svn增备" [email protected]
fi
rm -f $LOG_PATH/A.TMP
echo $UPPER > $LOG_PATH/$name/last_revision.txt
echo ******This time we bakcup from $LOWER to $UPPER****** >> $LOG_PATH/$name/$n
ame.log
echo ******Back up ended****** >> $LOG_PATH/$name/$name.log
fi
#else
# echo "0" > $LOG_PATH/$name/last_revision.txt
# LOWER=`head -1 $LOG_PATH/$name/last_revision.txt`
# /usr/bin/svnadmin dump $SVN_REPOROOT/$name -r $LOWER:$UPPER --incremental > $RAR_ST
ORE/$name/$LOWER-$UPPER.dump
# rm -f $LOG_PATH/A.TMP
# echo $UPPER > $LOG_PATH/$name/last_revision.txt
# echo ******This time we bakcup from $LOWER to $UPPER****** >> $LOG_PATH/$name/$name
.log
# echo ******Back up ended****** >> $LOG_PATH/$name/$name.log
fi
else
continue
fi
done
mail命令安装:
yum install -y mailx
vim /etc/mail.rc
文件尾增加以下内容
set from=xxxxx@qq.com
smtp="smtp.qq.com"
set smtp-auth-user="xxxxx@qq.com"
smtp-auth-password="123456"
set smtp-auth=login
说明:
from: 对方收到邮件时显示的发件人
smtp: 指定第三方发送邮件的smtp服务器地址
smtp-auth: SMTP的认证方式。默认是LOGIN,也可改为CRAM-MD5或PLAIN方式
smtp-auth-user: 第三方发邮件的用户名
smtp-auth-password: 用户名对应密码
nfs安装:
/etc/init.d/rpcbind start
/etc/init.d/rpcbind status
chkconfig rpcbind on
chkconfig --list rpcbind
showmount -e 10.0.0.36
mount -t nfs 10.0.0.36:/svn/backup /svn_backup
echo "mount -t nfs 10.0.0.36:/svn/backup /svn_backup" >> /etc/rc.local
svn备份服务器配置:
nfs安装:
yum install nfs-utils rpcbind -y
查看:
rpm -qa nfs-utils rpcbind
开启rpc:
/etc/init.d/rpcbind start
netstat -lntup | grep rpc
rpcinfo -p localhost
开启nfs:
/etc/init.d/nfs start
rpcinfo -p localhost
开机自启动:
chkconfig nfs on
chkconfig rpcbind on
创建共享目录:
mkdir -p /svn/backup
chown -R nfsnobody.nfsnobody /svn/backup/
vim /etc/exports
#
/svn/backup 10.0.0.0/24(rw,sync)
/etc/init.d/nfs reload
svn恢复:
svnadmin hotcopy project-1 /svndata/project-1
svnadmin load project-1 < /svn/backup/increment/2018-05-23/project-1/3-3.dump
以上是关于svn全量和增量备份详解的主要内容,如果未能解决你的问题,请参考以下文章
window环境定时全量和增量备份mongo集群文件(下面介绍的是增量备份的操作说明)
Mysql使用innobackupex在线备份方案(全量+增量)操作记录