博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何删除svn备份库
阅读量:3976 次
发布时间:2019-05-24

本文共 2622 字,大约阅读时间需要 8 分钟。

作者: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://iieki.baihongyu.com/

你可能感兴趣的文章
终于&nbsp;整明白了中断的工作原…
查看>>
2010年11月19日
查看>>
2010年11月19日
查看>>
TC35i&nbsp;单片机
查看>>
TC35i&nbsp;单片机
查看>>
AT&nbsp;命令详解
查看>>
AT&nbsp;命令详解
查看>>
AT指令发送PDU中文短信——使用串口…
查看>>
AT指令发送PDU中文短信——使用串口…
查看>>
指针的使用注意事项(个人体…
查看>>
指针的使用注意事项(个人体…
查看>>
~c++中的指针使用注意事项
查看>>
~c++中的指针使用注意事项
查看>>
函数返回值、引用和指针的区别思考
查看>>
函数返回值、引用和指针的区别思考
查看>>
AT指令中文手册
查看>>
AT指令中文手册
查看>>
module_param&amp;&amp;MODULE_PARM_DESC
查看>>
struct&nbsp;inode&nbsp;和&nbsp;struct&nbsp;file
查看>>
mknod
查看>>