windows和linux下一样操作
随整项目的更新迭代、网站的svn版本历史也越来越大,超过了项目的本身的几倍。为了缩减硬盘开支决定采用删除版本库早期履历的方式缩减版本库尺寸。
具体作业过程如下:
准备工作
停止apache服务器,修改版本库目录路权限为root的方式,阻止所有的用户使用该版本库。重启apache,这样可保证其他版本库的用户继续使用。
备份原有版本库
版本库全备份可以采用svnadmin dump和svnadmin hotcopy两种方法。在整个过程中两种方法都会用到。首先作为版本库全备份,以防将来出现作业错误时可以立刻恢复原有版本库的操作,建议使用svnadmin hotcopy。一方面这样的备份速度比较快,另一方面备份的结果就是一个可以立刻使用的版本库,在需要恢复的时候直接拷贝回去就行了。具体命令如下:
svnadmin hotcopy --clean-logs svn版本厍路径 ./hotcopy >hotcopy.log 2>hotcopy_err.log &
备份的结果就是一个目录,尺寸基本和原版本库相同,1G。
dump版本库需要保留的版本
通过svnlook youngest /path/to/repo
命令可以看到版本库最后的版本是多少。
我要作业的版本库是814。决定保留800到814之间的版本。因此需要从版本库把800以后的版本dump出来。具体命令如下:
我的文件路径是 /data/svn_data/sk/
svnadmin dump /data/svn_data/sk/ -r 800:814 > repo_dump_800-814.dmp 2>repo_dump_800-814.log &
dump出来的文件大约194mb。
从1到814大概dump出1G
查看一下日志文件,确定所需要的版本都被正确的dump下来了。
- 重建版本库
- 注意重建版本厍之前一定要把/data/svn_data/sk/conf里面的文件给备份一下
rm -rf /data/svn_data/sk/
svnadmin create /data/svn_data/sk/
注意这里面没有使用 –fs-type bdb参数,因此创建出来的版本库是FSFS后端的。后面还会继续解释为什么这么做。
重新导入新版本
svnadmin load /data/svn_data/sk/ < repo_dump_800-814.dmp > repo_load.log 2>repo_load_err.log &
检查一下日志文件,看看load是否成功。用svnlook命令看看load以后版本库的最新版本。
修改版本库权限
chown -R apache:apache /path/to/repo
我的是Root权限的 本地不改也行
到此为止版本库的历史版本删除工作就结束了。需要注意的是,新建出来的版本库的最新版本应该是15。BDB后端和FSFS后端版本库在某种情况下的尺寸差距惊人的大。手册是虽然也说了FSFS会比BDB小一些,但是绝对没想到会小那么多。subversion现在主推FSFS格式是有道理的。但是我总觉得毕竟BDB历史更悠久一些,也更稳定一些。所以在今后硬盘空间不紧张的前提下,我还是倾向于使用BDB后端格式。