perl语言写增量-全量备份脚本

Posted 云容灾备份安全治理

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perl语言写增量-全量备份脚本相关的知识,希望对你有一定的参考价值。

Perl 简介

Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。

Perl 语言的应用范围很广,除CGI以外,Perl被用于图形编程、系统管理、网络编程、金融、生物以及其他领域。由于其灵活性,Perl被称为脚本语言中的瑞士军刀。

什么是 Perl?

Perl是由Larry Wall设计的,并由他不断更新和维护的编程语言。

Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。

Perl与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。

Perl提供脚本语言(如sed和awk)的所有功能,还具有它们所不具备的很多功能。Perl还支持sed到Perl及awk到Perl的翻译器。

简而言之,Perl像C一样强大,像awk、sed等脚本描述语言一样方便。

Perl 优点

相比C、Pascal这样的"高级"语言而言,Perl语言直接提供泛型变量、动态数组、Hash表等更加便捷的编程元素。

Perl具有动态语言的强大灵活的特性,并且还从C/C++、Basic、Pascal等语言中分别借鉴了语法规则,从而提供了许多冗余语法。

在统一变量类型和掩盖运算细节方面,Perl做得比其他高级语言(如:Python)更为出色。

由于从其他语言大量借鉴了语法,使得从其他编程语言转到Perl语言的程序员可以迅速上手写程序并完成任务,这使得Perl语言是一门容易用的语言。

Perl 是可扩展的,我们可以通过CPAN("the Comprehensive Perl Archive Network"全面的 Perl 存档网络)中心仓库找到很多我们需要的模块。Perl 的 mod_perl 的模块允许 Apache web 服务器使用 Perl 解释器。

Perl脚本采用json配置文件,可以自定义,备份目录,全量备份周期,增量备份时间等。
JSON配置文件:
{
  "backupDir": "/data_backup",
  "archiveDir": "/archive_dir",
  "original": "/www/",
  "fullDayBase": 10
}
主程序
#!/usr/bin/perl
use warnings;
use File::Copy::Recursive qw/dircopy rcopy/;
use File::Rsync;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
use JSON;
use File::Basename;
use POSIX qw(strftime);
use Data::Dumper;
my ( $day, $json );
my $backupDate = strftime( "%Y%m%d", localtime(time) );
open JSON, "/sh/rsyncfile/backupconf.json" or die "$!";
$json = $_ while <JSON>;
my $hashRef     = decode_json $json;
my $originalDir = $hashRef->{original};      
#记得加/,不加/ 弹鸡鸡
my $backupDir   = $hashRef->{backupDir};
my $archiveDir  = $hashRef->{archiveDir};
my $fullDayBase = $hashRef->{fullDayBase};   
#全备份周期
$day = $1 if $backupDate =~ /(\d{2})$/;
mkdir $backupDir  unless -d $backupDir;
mkdir $archiveDir unless -d $archiveDir;
rsync_dir( $originalDir, $backupDir );       
#同步目录
if ( $day % $fullDayBase == 0 ) {            
#判断周期
    for my $zipName ( glob "$backupDir/*" ) {
        my $zipFromDir = basename($zipName);
        $zipName = basename($zipName) . "_" . $backupDate . ‘.zip‘;
        print $zipName, "\n";
        zip_dir( $backupDir, $archiveDir, $zipName, $zipFromDir );
    }
}
#压缩目录
sub zip_dir {
    my ( $backupDir, $archiveDir, $zipName, $zipFromDir ) = @_;
    my $zip = Archive::Zip->new();
    my $dirMember = $zip->addTree( "$backupDir/$zipFromDir", $zipFromDir );
#递归压缩目录
    unless ( $zip->writeToFileNamed("$archiveDir/$zipName") == 0 ) {
        die ‘write error‘;
    }
}
#同步目录
sub rsync_dir {
    my ( $source, $target ) = @_;
    print "rsync file from $source to $target\n"; 
# archive 归档模式  
# compress 压缩  
# verbose 打印详细信息
    my $obj = File::Rsync->new(
        { archive => 1, compress => 1, del => 1, verbose => 1 } );
    $obj->exec( { src => $source, dest => $target } )
        or warn "rsync failed\n";  
#输出同步内容
    print $obj->out;
}
#复制
sub copy {
    my ( $source, $target ) = @_;
    print $source, "\n";
    if ( -d $source ) {
        $File::Copy::Recursive::CPRFComp = 1;
        dircopy( $source, $target ) or die "$!";
    }
    else {
        rcopy( $source, $target ) or die "$!";
    }
    return 1;
}

以上是关于perl语言写增量-全量备份脚本的主要内容,如果未能解决你的问题,请参考以下文章

关于Subversion主从备份方式的调整(全量增量脚本)更新

mysql备份脚本,一天执行一次全量备份,三次增量备份

mysql自动化(全量+增量)备份脚本

mysql mysqldum备份脚本

win7系统下mysql如何增量备份

innobackupex自动备份数据库脚本