svn备份
1.1 svn备份
环境请参考svn安装与使用
两边配置保持一样比较好,避免出错
1.1.1 svn主安装版本库
我这里还是写一下
- 安装版本库
[root@svn ~]# yum install subversion -y
- 创建存储目录
[root@svn ~]# mkdir /svn
[root@svn ~]# svnadmin create /svn/test
- 修改配置文件
[root@svn ~]# cd /svn/test
[root@svn test]# cat svnserve.conf
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
realm = This is My First Test Repository ##这个是提示信息
[root@svn test]# cat passwd
[users]
test = 123456
[root@svn test]# cat authz
[test:/]
test = rw
* = r
- 启动svn
$ svnserve -d -r /svn
svnbackup安装svn版本库
[root@svn_backup ~]# yum -y install subversion
[root@svn_backup ~]# svnadmin create /svn/test #创建恢复库,配置文件和主保持一致。复制即可
[root@svn_backup ~]# svnserve -d -r /svn/ #启动svn
1.2 svn三种备份方式
svn备份一般采用三种方式:
1)svnadmin dump
2)svnadmin hotcopy
3)svnsync
注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如copy命令、rsync命令。
笔者曾经用 rsync命令来做增量和全量备份,在季度备份检查审计中,发现备份出来的库大部分都不可用,因此最好是用svn本身提供的功能来进行备份
1.2.1 svnadmin dump
优缺点解析
第一种svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
备份版本库
[root@svn ~]# svnadmin dump /svn/test/ >/tmp/test.dump #备份
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
[root@svn ~]# scp /tmp/test.dump 10.0.0.11:/tmp #将备份传到svnbackup服务器
恢复版本库并重启svn
[root@svn_backup ~]# svnadmin load /svn/backup </tmp/test.dump
使用客户端就可以拉取备份机器上面的代码了
1.2.2 svnadmin hotcopy
第二种svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
缺点是:比较耗费硬盘,需要有较大的硬盘支持
备份版本库
[root@svn ~]# svnadmin hotcopy --clean-logs /svn/test /tmp/test.hotcopy.dump
如果添加 –clean-logs 选项,则 svnadmin 会先执行热拷贝,然后删除不用的Berkeley DB日志文件
还原版本库并重启svn
[root@svn_backup ~]# svnadmin hotcopy /tmp/test.hotcopy.dump/ /svn/backup
1.2.3 svnsync 双机热备
本人就是使用个这种方式,原因是,主的svn宕机之后了,将从的svn的服务器的ip改为主的ip直接接着使用,反正开发就是要这么干,下面说说部署方式及流程
- 首先两台机器,一台主,一台备
- 两边配置要保持一样
- 配置pre-revprop-change hook( 钩子)
- svnsync init初始化
- 测试数据同步
- 在来源SVN配置post-commit hook,启用实时备份
**修改备份SVN库里的钩子脚本pre-revprop-change **
[root@svn_backup ~]# cd /svn/test/hooks/
[root@svn_backup hooks]# cp pre-revprop-change.tmpl pre-revprop-change
[root@svn_backup hooks]# vim pre-revprop-change 将最后一行改为exit 0,或者直接把该文件清空
[root@svn_backup hooks]# chmod +x pre-revprop-change
初始化同步设定
[root@svn_backup hooks]# svnsync init file:///svn/test svn://10.0.0.10/test
Copied properties for revision 0. #表示成功
语法是:svnsync init {你刚创建的库url} {源库url}
注意本地url是三个斜杠的:///
开始同步
[root@svn_backup hooks]# svnsync sync file:///svn/test
Transmitting file data .................................................................................................................................................................................
Committed revision 1.
Copied properties for revision 1.
Transmitting file data .
Committed revision 2.
Copied properties for revision 2.
Transmitting file data .
Committed revision 3.
Copied properties for revision 3.
##代表同步成功了
**在来源SVN配置post-commit hook,启用实时备份 **
[root@svn hooks]# cd
[root@svn ~]# cd /svn/test/hooks/
[root@svn hooks]# cp post-commit.tmpl post-commit
[root@svn hooks]# chmod +x post-commit
[root@svn hooks]# vim post-commit #最后面加上
svnsync synchronize --non-interactive svn://10.0.0.11/test --username test --password 123456
测试是否同步,在客户端svn主的工作目录中新建一个文件,查看svn从的工作目录中是否存在就可以了
- 在数据同步完成之后将从的svn test工作目录checkout下来
- 首先要checkout svn主的test,把目录checkout下来
- 配置post-commit
- 配置完成svn主工作目录创建文件并提交,svn从目录只需要update更新一下就能看到是否有文件了