本节和大家一起学习一下如何删除SVN备份库,之前我们学习了删除SVN版本控制信息,大家可以和本节对比一下,看看二者有什么区别,欢迎大家一起来学习删除SVN备份库的方法。
删除SVN备份库
问题描述:
用svnadminhotcopy备份的svn库是svn一个完整拷贝,保证了备份的完整、可靠。但用这种方式备份出现的问题是:备份占用空间比较大,需要定期进行删除,而我们发现删除非常困难。
尝试如下:
1、输入:rm-rfrepos_backup1
提示访问拒绝。进到repos/db/revs里面发现里面的文件权限都是
-r--r--r--
这样的,所以谁也不能用上面的命令进行删除了。
2、输入:rm-Rrepos_backup1
遇到每个文件都提示:是否重写权限,选择是,才会删除成功:
overriderwxrwx---4294967294/usersfor1117/repos1/db/revprops/11249?一个库往往有数十个万个文件,这种删除方式显然不现实。
3、输入:chmod-R777repos_backup1;rm-Rrepos_backup1
等待半天,提示堆栈溢出。输入ulimit-a查看,堆栈限制为7715;修改这个参数必须重启系统,服务器级别比较高,不敢重启,只好作罢。于是想到了用脚本来进行删除。
删除SVN备份方案设计如下:
目标:定期删除备份数据,并保证备份数据一直介于7到16份之间
步骤:
1、每月1号删除上个月21号之前所有数据
2、每月15号删除上个月所有数据和本月8号前的所有数据
3、每月25号删除本月19号之前的所有数据。
用perl脚本实现,代码如下:
#!/usr/bin/perl
#Author:xuejiang
#Site:http://www.scmbbs.com #p#
#本单元:定期删除SVN备份数据,并保证备份数据一直介于7到16份之间,
#适用:备份目录以mmdd的日期格式命名。
useCwd;
useFile::Find;
&main();
submain()
{
#取得当前时间,根据时间设置定期进行删除
my$targetDir="/home/backup/svn/hotcopy2/";#定义备份目录。
my($sec,$min,$hour,$day,$month,$year,$wday,$yday)=localtime(time());
$month++;
my$today=sprintf("%02d",$day);
if($today!~/(01$|15$|25$|)/)
{
exit(0);
}
my$monthday=sprintf("%02d%02d",$month,$day);
my$thismonth=sprintf("%02d",$month);
my($lastmonth,$passdate,$tempstr);
#定义删除的目录数组,对每个目录调用函数deleteDir进行删除。
chdir($targetDir);
my@dir=<*>;
print@dir;
if($thismonth=~/01/)
{
$lastmonth='12';
}else
{
$lastmonth=$thismonth-1;
}
foreachmy$dir(@dir)
{
if($dir=~/[^0-9]/)
{
next;
}
#每月1号删除上个月21号之前所有数据
if($today=~/01$/)
{
$passdate=$lastmonth.'21';
if($lastmonth=='12')
{
$tempstr=substr($dir,0,2);
if(($tempstrne"01")&&($dir<$passdate))
{
&deleteDir($targetDir.$dir);
}
}else
{
if($dir<$passdate)
{
&deleteDir($targetDir.$dir);
}}}
#每月15号删除上个月所有数据和本月8号前的所有数据 #p#
if($today=~/15$/)
{
$passdate=$thismonth.'08';
if($dir<$passdate)
{
&deleteDir($targetDir.$dir);
}
if($lastmonth=='12')
{
$tempstr=substr($dir,0,2);
if($tempstr=="12")
{
&deleteDir($targetDir.$dir);
}}}
#每月25号删除本月19号之前的所有数据。
if($today=~/25$/)
{
$passdate=$thismonth.'19';
if($dir<$passdate)
{
&deleteDir($targetDir.$dir);
}
if($lastmonth=='12')
{
$tempstr=substr($dir,0,2);
if($tempstr=="12")
{
&deleteDir($targetDir.$dir);
}}}}}
#递归遍历各目录,遍历各个文件,每个文件先进行chmod777filename操作,再进行rm-rffilename操作。
subdeleteDir($)
{
my($dir)=@_;
print"loginthedir:$dir\n";
my$handle;
opendir($handle,$dir);
while(defined(my$ndir=readdir($handle)))
{
if(($ndireq".")||($ndireq".."))
{
next;
}
$ndir=$dir."/".$ndir;
if(-f$ndir)
{
ls`chmod777$ndir`;##如果需要此步。
print"file:$ndir\n"ifunlink($ndir);
}else
{
print"Dir:$ndir\n";
deleteDir($ndir);
}}
closedir($handle);
rmdir($dir);
print"nowlocate:$dir\n";
}。本节关于删除SVN备份库介绍完毕。
【编辑推荐】