- SVN结构
- SVN主目录: /svn/repos
- SVN配置文件: /svn/etc
SVN数据与用户备份
hotcopy 与 dump
- Hotcopy直接复制存储库。 它速度很快,但它保留了底层文件系统等信息。 导入副本的服务器需要是相同的版本,具有相同的配置等
- Dump是版本独立的。 这意味着导出的副本可以被任何版本的svn使用
Gzip压缩与xz压缩
- Gzip压缩速度快,但是压缩比例没有xz高
- xz压缩速度慢,但是压缩比例高
在考虑磁盘空间紧张,内存和CPU资源使用充足,可以使用xz压缩,压缩速度慢
在内存和CPU资源使用紧张,不考虑磁盘容量大小,建议使用gzip压缩,压缩速度快
3. 解决方法3.1 备份策略每一个月进行全量备份,每隔8个小时进行增量备份
本地备份目录:/data/Backup/SVN
- 赋予权限
- 将目录/data以及子目录对其他用户添加可读、可执行的权限
- 目录/data/Backup以及子目录添加对组backup可读、可写、可执行的权限
# 添加组backup
groupadd backup
# 添加用户cory到组backup
usermod -a -G backup cory
# 更改/data权限
chmod -R 775 /data
# 更改/data/Backup的用户组backup
chown -R root:backup /data/Backup
3.3 备份内容
- 数据备份
将dump出来的文件进行备份
- 配置文件备份
- 认证文件、权限文件备份
- SVNAdmin备份
iF.SVNAdmin管理界面备份
3.4 备份脚本此版本只是基础版本,增量与全量备份未写在其中,请知悉
#!/usr/bin/env bash
# TODO: Bup备份
# TODO: 其他备份目录
# TODO: 软编码 IP 等
# TODO: 定期删除
# TODO: 模块编码
# TODO: 增量备份与全量备份
set -e
password=$1
repo_dir="/svn/repos"
backup_dir="/data/Backup/SVN"
svnadmin="/usr/bin/svnadmin"
svnlook="/usr/bin/svnlook"
name=$(basename "$repo_dir")
revision=$($svnlook youngest "$repo_dir")
target="$backup_dir/$name-$revision.xz"
echo "$name-$revision.xz" > $backup_dir/currentBackup.info
if [ ! -e "$target" ]; then
rm -f "$backup_dir/$name"-*.xz
# nice $svnadmin dump -r $((revision_full + 1)):${latest_revision} --incremental --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
# nice $svnadmin dump --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
nice $svnadmin dump --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
fi
# sync data
sshpass -p "$
将备份在192.168.10.11目录的过期文件定期删除
通过Linux Crontab或者Jenkins都可以,如Crontab
#!/usr/bin/env bash
# TODO: Bup备份
# TODO: 其他备份目录
# TODO: 软编码 IP 等
# TODO: 定期删除
set -e
password=$1
repo_dir="/svn/repos"
backup_dir="/data/Backup/SVN"
svnadmin="/usr/bin/svnadmin"
svnlook="/usr/bin/svnlook"
name=$(basename "$repo_dir")
revision=$($svnlook youngest "$repo_dir")
target="$backup_dir/$name-$revision.xz"
echo "$name-$revision.xz" > $backup_dir/currentBackup.info
if [ ! -e "$target" ]; then
rm -f "$backup_dir/$name"-*.xz
# nice $svnadmin dump -r $((revision_full + 1)):${latest_revision} --incremental --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
# nice $svnadmin dump --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
nice $svnadmin dump --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
fi
# sync data
sshpass -p "$
准备文件
- 全量备份文件:repos-5083-Full.xz
- 增量备份文件:repos-5098-Inc.xz
- 其他其他备份文件:etc配置权限文件、svnadmin界面文件
Centos 7 安装 SVN
- Apache安装
crontab -e
# 每隔两天删除备份文件
# 删除除当前备份文件(从currentBackup.info读取)以外的其他压缩文件
# * * */2 * * cd /data/SVN && ls *.xz | grep -v $(cat currentBackup.info) | xargs rm -rf
- 去除apache默认欢迎界面
sudo sed -i 's/^/#&/g' /etc/httpd/conf.d/welcome.conf
- 阻止显示/var/www/html目录
sudo sed -i "s/Options Indexes FollowSymLinks/Options FollowSymLinks/" /etc/httpd/conf/httpd.conf
- 安装SVN和mod_dav_svn模块
sudo yum install -y subversion mod_dav_svn
2) SVN配置
- 更改配置文件
sudo vi /etc/httpd/conf.modules.d/10-subversion.conf
最终内容如下:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
LoadModule dontdothat_module modules/mod_dontdothat.so
<Location /svn>
DAV svn
SVNParentPath /data/SVN
AuthName "SVN Repos"
AuthType Basic
AuthUserFile /etc/svn/svn-auth
AuthzSVNAccessFile /etc/svn/authz
Require valid-user
</Location>
创建SVN Repo
sudo mkdir /data/SVN
cd /data/SVN
sudo svnadmin create repos
sudo chown -R apache:apache repos
3) 还原Restore
解压全量备份包和增量备份包
sudo xz -d -T 0 repos-5083-Full.xz
sudo xz -d -k -T 0 repos-5098-Inc.xz
依次导入解压出来的备份文件
sudo svnadmin load /data/SVN/repos < repos-5083-Full
sudo svnadmin load /data/SVN/repos < repos-5098-Inc
4)还原权限文件
拷贝备份文件到SVN安装时的配置文件路径地址:
# AuthUserFile /etc/svn/svn-auth
# AuthzSVNAccessFile /etc/svn/authz
sudo /etc/svn
sudo cp /data/etc/svn/authz /etc/svn/
sudo cp /data/etc/svn/svn-auth /etc/svn/
sudo chown -R root:apache /etc/svn/
sudo chmod -R 670 /etc/svn/
5) 开启apache并修改防火墙
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --reload
确认已恢复到到对应Revision:5098
6) iF.SVNAdmin管理界面还原拷贝svnadmin备份文件到/var/www/html中
sudo cp -rf /data/svnadmin /var/www/html/
sudo chmod -R 777 /var/www/html/svnadmin/data/
sudo chown -R apache:apache /var/www/html/svnadmin/
因为未安装php相关软件包,安装完成,重启即可
sudo yum install php
sudo systemctl restart httpd
SVN访问以及IF.Svnadmin管理界面访问
2)权限验证3)节点Revision还原验证