zmanda를 사용한 쉬운 MySQL 백업과 복구 (증분백업 가능)

리눅스/MySQL|2015. 1. 16. 11:07
반응형

zmanda를 사용한 MySQL 백업과 복구


1. zmanda는 복잡한 mysql의 옵션을 사용하지 않고 쉽게 mysql을 백업하고, 복구할 수 있는 유틸리티이다. 본 문서에서는 자체 백업만 언급하였다. 원격 백업 혹은 replication에 대해서는 zmanda 사이트의 메뉴얼을 읽어보기 바란다.

적용 가능한 MySQL 버전:

MySQL 4.1.x and MySQL 5.x

Manual:
http://mysqlbackup.zmanda.com/index.php/Zmanda_Recovery_Manager_for_MySQL_Users_Manual 
http://www.zmanda.com/quick-mysql-backup.html 

2. 다운로드, 설치

# lftpget http://www.zmanda.com/downloads/community/ZRM-MySQL/2.1/RPM/MySQL-zrm-2.1-1.noarch.rpm 
# lftpget http://www.zmanda.com/downloads/community/ZRM-MySQL/2.1/RPM/MySQL-zrm-client-2.1-1.noarch.rpm 

아래의 3가지 perl 모듈이 필요하다.

===
*중요 : perl-DBD-MySQL 패키지도 필요하다. 만약 이 패키지가 설치되어 있지 않을 경우, yum 으로 설치하면 mysql 패키지도 의존성으로 인하여 같이 설치하려고 한다. MySQL을 소스로 설치했다면, 자신의 OS 버전에 맞는 패키지를 직접 다운로드 하여 rpm -ivh --nodeps perl-DBD-MySQL-xxx 형식을 사용하여 의존성을 체크하지 않고 설치하도록 한다.
===

[root@localhost ~]# yum install perl-DBI perl-XML-parser
[root@localhost ~]# rpm -ivh MySQL-zrm-*
[root@localhost ~]# rpm -ql MySQL-zrm
/etc/logrotate.d/mysql-zrm
/etc/mysql-zrm
/etc/mysql-zrm/RSS.header
/etc/mysql-zrm/mysql-zrm-release
/etc/mysql-zrm/mysql-zrm-reporter.conf
/etc/mysql-zrm/mysql-zrm.conf
/etc/xinetd.d/mysql-zrm-socket-server
/usr/bin/mysql-zrm
/usr/bin/mysql-zrm-abort-backup
/usr/bin/mysql-zrm-backup
/usr/bin/mysql-zrm-check
/usr/bin/mysql-zrm-extract-backup
/usr/bin/mysql-zrm-getconf
/usr/bin/mysql-zrm-list
/usr/bin/mysql-zrm-manage-backup
/usr/bin/mysql-zrm-migrate-file-ownership
/usr/bin/mysql-zrm-parse-binlogs
/usr/bin/mysql-zrm-purge
/usr/bin/mysql-zrm-reporter
/usr/bin/mysql-zrm-restore
/usr/bin/mysql-zrm-scheduler
/usr/bin/mysql-zrm-verify-backup
/usr/bin/zrm-pre-scheduler
/usr/lib/mysql-zrm/Data/Report.pm
/usr/lib/mysql-zrm/Data/Report/Base.pm
/usr/lib/mysql-zrm/Data/Report/Plugin/Csv.pm
/usr/lib/mysql-zrm/Data/Report/Plugin/Html.pm
/usr/lib/mysql-zrm/Data/Report/Plugin/Text.pm
/usr/lib/mysql-zrm/XML/RSS.pm
/usr/lib/mysql-zrm/ZRM/Common.pm
/usr/lib/mysql-zrm/ZRM/MySQL.pm
/usr/lib/mysql-zrm/ZRM/Replication.pm
/usr/lib/mysql-zrm/ZRM/SnapshotCommon.pm
/usr/share/doc/MySQL-zrm-2.1
/usr/share/doc/MySQL-zrm-2.1/AUTHORS
/usr/share/doc/MySQL-zrm-2.1/COPYING
/usr/share/doc/MySQL-zrm-2.1/INSTALL
/usr/share/doc/MySQL-zrm-2.1/README
/usr/share/doc/MySQL-zrm-2.1/README-plugin-encrypt
/usr/share/doc/MySQL-zrm-2.1/README-plugin-post-backup
/usr/share/doc/MySQL-zrm-2.1/README-plugin-pre-backup
/usr/share/doc/MySQL-zrm-2.1/README-plugin-pre-scheduler
/usr/share/doc/MySQL-zrm-2.1/README-plugin-snapshot-plugin
/usr/share/doc/MySQL-zrm-2.1/README-plugin-socket-copy
/usr/share/doc/MySQL-zrm-2.1/README-plugin-ssh-copy
/usr/share/man/man1/mysql-zrm-abort-backup.1.gz
/usr/share/man/man1/mysql-zrm-backup.1.gz
/usr/share/man/man1/mysql-zrm-check.1.gz
/usr/share/man/man1/mysql-zrm-extract-backup.1.gz
/usr/share/man/man1/mysql-zrm-list.1.gz
/usr/share/man/man1/mysql-zrm-manage-backup.1.gz
/usr/share/man/man1/mysql-zrm-parse-binlogs.1.gz
/usr/share/man/man1/mysql-zrm-purge.1.gz
/usr/share/man/man1/mysql-zrm-reporter.1.gz
/usr/share/man/man1/mysql-zrm-restore.1.gz
/usr/share/man/man1/mysql-zrm-scheduler.1.gz
/usr/share/man/man1/mysql-zrm-verify-backup.1.gz
/usr/share/man/man1/mysql-zrm.1.gz
/usr/share/man/man5/mysql-zrm-reporter.conf.5.gz
/usr/share/man/man5/mysql-zrm.conf.5.gz
/usr/share/mysql-zrm
/usr/share/mysql-zrm/plugins
/usr/share/mysql-zrm/plugins/encrypt.pl
/usr/share/mysql-zrm/plugins/lvm-snapshot.pl
/usr/share/mysql-zrm/plugins/parse-binlogs.pl
/usr/share/mysql-zrm/plugins/post-backup.pl
/usr/share/mysql-zrm/plugins/pre-backup.pl
/usr/share/mysql-zrm/plugins/pre-scheduler-plugin.pl
/usr/share/mysql-zrm/plugins/socket-copy.pl
/usr/share/mysql-zrm/plugins/socket-server.pl
/usr/share/mysql-zrm/plugins/ssh-copy.pl
/usr/share/mysql-zrm/plugins/xinetd.smf
/usr/share/mysql-zrm/plugins/zfs-snapshot.pl
/var/lib/mysql-zrm
/var/log/mysql-zrm
/var/log/mysql-zrm/mysql-zrm.log
[root@localhost ~]#

[root@localhost ~]# rpm -ql MySQL-zrm-client
/etc/xinetd.d/mysql-zrm-socket-server
/usr/lib/mysql-zrm/ZRM/SnapshotCommon.pm
/usr/share/mysql-zrm/plugins/lvm-snapshot.pl
/usr/share/mysql-zrm/plugins/socket-copy.pl
/usr/share/mysql-zrm/plugins/socket-server.pl
/usr/share/mysql-zrm/plugins/ssh-copy.pl
/usr/share/mysql-zrm/plugins/zfs-snapshot.pl
/var/lib/mysql-zrm
/var/log/mysql-zrm
/var/log/mysql-zrm/mysql-zrm.log
[root@localhost ~]#

3. 설정

[3.1] /etc/my.cnf 파일 설정
MySQL의 환경설정 파일(/etc/my.cnf)에서 바이너리 로그를 생성하도록 설정한다.

# Replication Master Server (default)
# binary logging is required for replication
log-bin=mysql-bin
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id       = 1

[3.2] /etc/mysql-zrm/mysql-zrm.conf 파일 설정

/etc/mysql-zrm/mysql-zrm.conf 파일에서 MySQL 접속 아이디와 패스워드를 설정한다.

[MySQL server parameters]
user=mysqlbackup
password="mysqlbackup_password"
host="localhost"
port=3306
socket=/tmp/mysql.sock

mysql의 캐릭터셋을 지정한다. 지정하지 않으면 디폴트값으로 ut8로 지정된다.
default-character-set=utf8

mysql 실행파일 경로와 binlog 파일의 경로, 임시파일 경로 설정.
mysql-binpath="/usr/local/server/mysql/bin"
mysql-binlog-path="/usr/local/server/mysql/var"
tmpdir=/tmp

[Backup parameters]
백업 레벨이 0이면 전체 백업, 1이면 증분 백업
# Backup level.
backup-level = 0

백업 모드에는 raw와 logical이 있다. raw는 DB와 동일한 파일을 복사(mysqlhotcopy)하고, logical은 .sql의 파일로 백업한다. (logical로 백업하면 .sql 파일을 생성하므로, OS에 관계없이 복구가 가능하다.)
# Backup method
backup-mode = logical

백업 파일을 저장할 디렉토리 경로를 설정한다.
destination=/backup/mysql

백업 파일을 보유할 기간을 명시한다. D는 일, W는 주, M은 월을 의미한다. 아래와 같이 10D로 설정하면 백업 파일을 10일동안만 보관하고, 10일 이후에는 자동으로 삭제한다.
retention-policy=10D

모든 데이터 베이스를 백업대상으로 한다.
all-databases=1

[ZRM parameters]
백업을 한 다음 백업 리포트를 전송할 메일 지정. 메일을 지정하지 않으면, 디폴트로 발송하지 않는다.
mailto="mymail@domain.com"

=======================================
* MySQL 서버 프로세스를 구동하는 유저는 mysql 이어야 한다. *
=======================================

4. 백업

아래 명령을 사용하면, 백업셋 이름으로 dailyrun을 사용하여 곧바로 모든 DB 테이블을 백업한다. (Full Backup) 백업을 완료하면 /etc/mysql-zrm/dailyrun 디렉토리내에 last_backup 파일을 만든다. 이 파일에는 저장된 백업파일의 경로가 입력되어 있다.
  
mysql-zrm-scheduler --now --backup-set dailyrun --backup-level 0
# cat /etc/mysql-zrm/dailyrun/last_backup
/backup/lug/mysql/dailyrun/20081229135816

백업 파일 검증하기.
mysql-zrm --action verify-backup --backup-set dailyrun
verify-backup:INFO: ZRM for MySQL Community Edition - version 2.1
dailyrun:verify-backup:INFO: Verification successful

백업 상태 로그 보기.
mysql-zrm-reporter --where backup-set=dailyrun --show backup-status-info
REPORT TYPE : backup-status-info

          backup_set  backup_date                  backup_level  backup_status         backup_type       comment
-----------------------------------------------------------------------------------------------------------------------------
            dailyrun  2008년 12월 29일 (월)               0  Backup succeeded      regular           ----
                      오후 01시 58분 16초

백업된 크기와 백업방법, 시간등을 확인한다.
mysql-zrm-reporter --where backup-set=dailyrun --show backup-performance-info
REPORT TYPE : backup-performance-info


          backup_set  backup_date                  backup_level     backup_size  backup_size_compressed     backup_time   backup_type       compress_encrypt_time
----------------------------------------------------------------------------------------------------------------------------------------------------------------
            dailyrun  2008년 12월 29일 (월)               0       124.21 MB  ----                       00:00:35      regular           ----
                      오후 01시 58분 16초

매일 새벽 2시에 백업을 하도록 cron에 설정한다.(Full Backup)
mysql-zrm-scheduler --add --interval daily --backup-set dailyrun --start 02:00

cron에 설정되었는지 확인한다.
mysql-zrm-scheduler --query
schedule:INFO: ZRM for MySQL Community Edition - version 2.1
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
0 2 * * * /usr/bin/zrm-pre-scheduler --action backup --backup-set dailyrun --backup-level 0 --interval daily

5. 복구

백업에 사용할 이미지의 정보를 확인한다.
mysql-zrm-reporter --show restore-info --where backup-set=dailyrun
REPORT TYPE : restore-info
          backup_set  backup_date                  backup_level  backup_directory                          backup_status         comment
-----------------------------------------------------------------------------------------------------------------------------------------------------
            dailyrun  2008년 12월 29일 (월)               0  /backup/lug/mysql/dailyrun/2008122913581  Backup succeeded      ----
                      오후 01시 58분 16초                   6

복구옵션(-restore)과 함께 위의 빨간색 백업 디렉토리를 소스 디렉토리로 지정하여 복구한다.
mysql-zrm -restore --backup-set dailyrun --source-directory /backup/lug/mysql/dailyrun/2008122913581

logical 즉 .sql 형식으로 백업해 두면 어떤 시스템(윈도우즈,리눅스,솔라리스등)에서도 mysql 명령어로 복구가 가능하다는 장점이 있다.

[Addition]
zmanda는 perl로 만들어진 오픈소스이다.

[root@localhost ~]# cat /usr/bin/mysql-zrm

#!/usr/bin/perl
#
# Copyright (c) 2006 Zmanda Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
#
# Contact information: Zmanda Inc, 505 N Mathlida Ave, Suite 120
# Sunnyvale, CA 94085, USA, or: http://www.zmanda.com
#

use strict;
use warnings;


our $oldPATH = $ENV{'PATH'};
$ENV{'PATH'} = "/usr/local/bin:/opt/csw/bin:/usr/bin:/usr/sbin:/sbin:/bin:/usr/ucb";


#path where ZRM utilities are installed
my $ZRM_BINPATH="/usr/bin";


my $USAGE="--action <backup|restore|schedule-backup|report|list|getconf|purge|parse-binlogs|check|verify-backup|extract-backup|abort-backup>nHelp on individual action items can be obtained by specifying --help with the required action.nFor example: 'mysql-zrm --action backup --help'";


my @cmd_args;


sub usage()
{
        print STDERR "$_[0]n";
        print STDERR "USAGE:n";
        print STDERR "$USAGEn";
        exit(2);
}


sub getAction()
{
        my $len = @ARGV;
        my $i;
        my $act;
        for( $i = 0; $i < $len; $i++ ){
                if( $ARGV[$i]=~/^--action=/ ){
                        $act = $';
                }elsif( $ARGV[$i]=~/^--action/ ){
                        $i++;
                        if( $i < $len ){
                                $act = $ARGV[$i];
                        }
                }else{
                        my $x = ""$ARGV[$i]"";
                        push @cmd_args, $x;
                }
        }
        if( ! defined $act || $act eq "" ){
                &usage( "ERROR: Please specify --action" );
        }
        $ENV{"ZRM_CMD_NAME"}="$0 --action $act";
        $ENV{"ZRM_LAUNCHER"}=$$;
        return $act;
}


sub main()
{
        my $act = getAction();
        if( !defined $act ){
                &usage( "ERROR: Please specify --action" );
        }
        my $cmd;
        if($act eq "backup") {
                $cmd = "mysql-zrm-backup";
        } elsif($act eq "restore") {
                $cmd = "mysql-zrm-restore";
        } elsif($act eq "list" ) {
                $cmd = "mysql-zrm-list";
        } elsif($act eq "purge" ){
                $cmd = "mysql-zrm-purge";
        } elsif($act eq "parse-binlogs"){
                $cmd = "mysql-zrm-parse-binlogs";
        } elsif($act eq "check"){
                $cmd = "mysql-zrm-check";
        } elsif($act eq "verify-backup"){
                $cmd = "mysql-zrm-verify-backup";
        } elsif($act eq "extract-backup"){
                $cmd = "mysql-zrm-extract-backup";
        } elsif($act eq "abort-backup"){
                $cmd = "mysql-zrm-abort-backup";
        } elsif($act eq "schedule-backup"){
                $cmd = "mysql-zrm-scheduler";
        } elsif($act eq "report"){
                $cmd = "mysql-zrm-reporter";
        } elsif($act eq "getconf"){
                $cmd = "mysql-zrm-getconf";
        } elsif($act eq "manage-backup"){
                $cmd = "mysql-zrm-manage-backup";
        }else{
                &usage("ERROR: Unknown Action '$act'");
        }
        my $r = system( "$ZRM_BINPATH/$cmd @cmd_args" );
        exit( $r>>8 );
}
&main();

[root@localhost ~]#


혹시라도 잘못된 사항이나, 추가적인 내용이 있으면 코멘트 남겨주세요.

망극!

- 끝 -


반응형

댓글()