如何删除svn备份库

作者:xuejiang
问题描述:
   用svnadmin hotcopy备份的svn库是svn一个完整拷贝,保证了备份的完整、可靠。但用这种方式备份出现的问题是:备份占用空间比较大,需要定期进行删除,而我们发现删除非常困难。
  尝试如下:
1、输入:rm -rf repos_backup1
   提示访问拒绝。进到 repos/db/revs里面发现里面的文件权限都是
  -r--r--r--
这样的,所以谁也不能用上面的命令进行删除了。
2、输入:rm -R repos_backup1
  遇到每个文件都提示:是否重写权限,选择是,才会删除成功:
override rwxrwx---  4294967294/users for 1117/repos1/db/revprops/11249?  
一个库往往有数十个万个文件,这种删除方式显然不现实。

3、输入:chmod -R 777 repos_backup1;rm -R repos_backup1
   等待半天,提示堆栈溢出。输入ulimit -a查看,堆栈限制为7715;修改这个参数必须重启系统,服务器级别比较高,不敢重启,只好作罢。

  于是想到了用脚本来进行删除。

删除备份方案设计如下:
目标:定期删除备份数据,并保证备份数据一直介于7到16份之间
步骤:1、每月1号删除上个月21号之前所有数据
      2、每月15号删除上个月所有数据和本月8号前的所有数据
      3、每月25号删除本月19号之前的所有数据。
用perl脚本实现,代码如下:

#! /usr/bin/perl
# Author:xuejiang
# Site: http://www.scmbbs.com

#本单元:定期删除备份数据,并保证备份数据一直介于7到16份之间,
#适用:备份目录以mmdd的日期格式命名。

use Cwd;
use File::Find;

&main();

sub main()
{
#取得当前时间,根据时间设置定期进行删除
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;
}
foreach my $dir(@dir)
{
      if ($dir =~ /[^0-9]/)
      {
          next;
      }
#每月1号删除上个月21号之前所有数据
        if ($today=~/01$/)
        {
            $passdate=$lastmonth.'21';    
            if ($lastmonth == '12')
            {
                $tempstr= substr($dir,0,2);
                if (($tempstr ne "01")&&($dir < $passdate))
                {
                    &deleteDir($targetDir.$dir);
                }
            }else
            {
                if ($dir < $passdate)
                {
                    &deleteDir($targetDir.$dir);
                }
            }
        }
#每月15号删除上个月所有数据和本月8号前的所有数据
   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);
                }
            }
   }
}
}
#递归遍历各目录,遍历各个文件,每个文件先进行chmod 777 filename操作,再进行 rm -rf filename操作。

sub deleteDir($)
{
        my ($dir)=@_;
        print "log in the dir:$dir /n";
        my $handle;
        opendir($handle,$dir);
        while(defined(my $ndir=readdir($handle)))
        {
                  if (($ndir eq ".")||($ndir eq ".."))
                  {
                        next;
                  }
                $ndir=$dir."/".$ndir;
                if (-f $ndir)
                {
                        ls `chmod 777 $ndir`; ##如果需要此步。
                        print "file:$ndir/n" if unlink($ndir);
                }else
                {
                        print "Dir:$ndir/n";
                        deleteDir($ndir);
                }
        }
        closedir($handle);
        rmdir($dir);
        print "now locate:$dir/n";
}

 

转自:http://www.scmbbs.com/cn/systp/2007/12/systp6.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值