技術分享:如何刪除SVN備份庫
本節(jié)和大家一起學習一下如何刪除SVN備份庫,之前我們學習了刪除SVN版本控制信息,大家可以和本節(jié)對比一下,看看二者有什么區(qū)別,歡迎大家一起來學習刪除SVN備份庫的方法。
刪除SVN備份庫
問題描述:
用svnadminhotcopy備份的svn庫是svn一個完整拷貝,保證了備份的完整、可靠。但用這種方式備份出現(xiàn)的問題是:備份占用空間比較大,需要定期進行刪除,而我們發(fā)現(xiàn)刪除非常困難。
嘗試如下:
1、輸入:rm-rfrepos_backup1
提示訪問拒絕。進到repos/db/revs里面發(fā)現(xiàn)里面的文件權限都是
-r--r--r--
這樣的,所以誰也不能用上面的命令進行刪除了。
2、輸入:rm-Rrepos_backup1
遇到每個文件都提示:是否重寫權限,選擇是,才會刪除成功:
overriderwxrwx---4294967294/usersfor1117/repos1/db/revprops/11249?一個庫往往有數(shù)十個萬個文件,這種刪除方式顯然不現(xiàn)實。
3、輸入:chmod-R777repos_backup1;rm-Rrepos_backup1
等待半天,提示堆棧溢出。輸入ulimit-a查看,堆棧限制為7715;修改這個參數(shù)必須重啟系統(tǒng),服務器級別比較高,不敢重啟,只好作罷。于是想到了用腳本來進行刪除。
刪除SVN備份方案設計如下:
目標:定期刪除備份數(shù)據(jù),并保證備份數(shù)據(jù)一直介于7到16份之間
步驟:
1、每月1號刪除上個月21號之前所有數(shù)據(jù)
2、每月15號刪除上個月所有數(shù)據(jù)和本月8號前的所有數(shù)據(jù)
3、每月25號刪除本月19號之前的所有數(shù)據(jù)。
用perl腳本實現(xiàn),代碼如下:
#!/usr/bin/perl
#Author:xuejiang
#Site:http://www.scmbbs.com #p#
#本單元:定期刪除SVN備份數(shù)據(jù),并保證備份數(shù)據(jù)一直介于7到16份之間,
#適用:備份目錄以mmdd的日期格式命名。
useCwd;
useFile::Find;
&main();
submain()
{
#取得當前時間,根據(jù)時間設置定期進行刪除
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);
#定義刪除的目錄數(shù)組,對每個目錄調(diào)用函數(shù)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號之前所有數(shù)據(jù)
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號刪除上個月所有數(shù)據(jù)和本月8號前的所有數(shù)據(jù) #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號之前的所有數(shù)據(jù)。
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";
}。本節(jié)關于刪除SVN備份庫介紹完畢。
【編輯推薦】