WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-users

Re: [Xen-users] snapshot - backup for xen vm's

To: Nico Kadel-Garcia <nkadel@xxxxxxxxx>
Subject: Re: [Xen-users] snapshot - backup for xen vm's
From: Ralf Schenk <rs@xxxxxxxxxx>
Date: Sun, 20 May 2007 00:13:52 +0200
Cc: xen-users@xxxxxxxxxxxxxxxxxxx
Delivery-date: Sat, 19 May 2007 15:12:22 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <464F46E6.8060201@xxxxxxxxx>
List-help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-id: Xen user discussion <xen-users.lists.xensource.com>
List-post: <mailto:xen-users@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-users>, <mailto:xen-users-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-users>, <mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
References: <A5CDEDEDBFC9C14487B8EAE8BA0EF69FB616B9@xxxxxxxxxxxxxxxxxxxxxxxx> <464F2FE4.4050900@xxxxxxxxxx> <464F46E6.8060201@xxxxxxxxx>
Sender: xen-users-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 1.5.0.10 (Windows/20070221)
Nico Kadel-Garcia schrieb:
> Ralf Schenk wrote:
>> it-news (Josef Lahmer) schrieb:
>>  
>>> dear list,
>>>
>>> is there a way to make a lvm-snapshot of an running xen-vm to
>>> implement a function like "snapshot-backup"?
>>>
>>>     
>> - Connect to mysql of VM and issue "FLUSH TABLES WITH READ LOCK;FLUSH
>> LOGS"
>>  
>>> #) make snapshot
>>>     
>> - Connect to mysql of VM and issue "UNLOCK tables"
>>  
>>> #) mount snapshot
>>> #) copy files
>>> #) umount snapshot
>>> #) remove snapshot
>>>
>>> eg (http://tldp.org/HOWTO/LVM-HOWTO/snapshots_backup.html)
>>>
>>> regards
>>> josy
>>>
>>> interessting: How to mount a XenVM filesystem on XenServer Host:
>>> http://kb.xensource.com/entry.jspa?categoryID=14&externalID=162
>>>     
>>
>> Hello !
>>
>> I do this every day. I added two points to your plan which I do with a
>> small perl script to get consistent Backups of my mysql Databases. I
>> also create/destroy the snapshot via this skript and mount the snapshot
>> volume. If you are interested I can send it via Mail.
>>   
> Could I talk you into publishing that tool on the list, please? Or
> sending me a copy to save me some work?
> 

Hello,

there is no secret except that I'm not a real programming guy in the few
lines....

Bye

-- 
__________________________________________________

Ralf Schenk
fon (02 41) 9 91 21-0
fax (02 41) 9 91 21-59
rs@xxxxxxxxxx

Databay AG
Hüttenstraße 7
D-52068 Aachen
www.databay.de

Vorstand: Jens Conze, Ralf Schenk, Aresch Yavari
Aufsichtsratvorsitzender: Ansgar Vögeli

Sitz/Amtsgericht Aachen
HRB:8437
USt-IdNr.: DE 210844202

Databay - einfach machen.

_________________________________________________

#!/usr/bin/perl
# Take perfect snapshot of mysql LVM by flushing mysql tables and
# setting a lock while creating the LVM snapshot
#
# usage: $0 (start|stop) [-v]
#
# Configurable
#
$dbi = "mysql";
$dbserver= "server.office.databay.de";
$dbport = "3306";
$dbname = "mysql";
$dbuser = "backup";
$passwd = "JzJe:64xUnrYKQus";

$mysql_vg = "/dev/server";
$mysql_lv = "/vm01";
$snapshot_name = "vm01_snap";
$snapshot_size = "5G";
$snapshot_mountpoint = "/mnt/vm01_snapshot";

#
# Normally you shouldn't change anything below this line
#
#---------------------------------------------------------------------------------------
use Time::Local;
#use POSIX qw(strftime);
use DBI;

my $start = (@ARGV && $ARGV[0] eq 'start');
my $stop = (@ARGV && $ARGV[0] eq 'stop');
my $verbose = (@ARGV && $ARGV[1] eq '-v' && shift);

if ($start) {
    #
    # Connect to database
    #
    my $connect = "DBI:".$dbi.":".$dbname.":".$dbserver.":".$dbport;
    my $dbh = DBI->connect($connect, 
        $dbuser, $passwd, 
        { RaiseError => 1}) 
        or die "connecting : $DBI::errstr\n";

    #
    # Flush tables and lock mysql for writing
    #
    my $start = time;
    my $sth = $dbh->do("FLUSH TABLES WITH READ LOCK;");
    my $sth = $dbh->do("FLUSH LOGS;");
    printf "Flushed and locked tables and logs in %d seconds.\n", time-$start 
unless !$verbose;

    #
    # Create LVM snapshot
    #
    my $start2 = time;
    printf "Executing /bin/sync;/sbin/lvcreate -s -L ".$snapshot_size." -n 
".$snapshot_name." ".$mysql_vg."/".$mysql_lv."\n" unless !$verbose;
    system("/bin/sync;/sbin/lvcreate -s  -L ".$snapshot_size." -n 
".$snapshot_name." -p r ".$mysql_vg."/".$mysql_lv);
    printf "Created LVM snapshot ".$snapshotname." in %d seconds.\n", 
time-$start2 unless !$verbose;
    #
    # Unlock tables
    #
    my $start3 = time;
    my $sth = $dbh->do("UNLOCK TABLES;");
    printf "Unlocked tables in %d seconds.\n", time-$start3 unless !$verbose;
    printf "Overall time for snapshot: %d seconds.\n", time-$start unless 
!$verbose;

    #
    # Disconnect from database
    #
    $dbh->disconnect;

    #
    # Mount snapshot
    #
    printf "Executing /bin/mount ".$mysql_vg."/".$snapshot_name." 
".$snapshot_mountpoint."\n" unless !$verbose;
    system ("/bin/mount ".$mysql_vg."/".$snapshot_name." 
".$snapshot_mountpoint);

} 

if ($stop) {
    printf "Executing /bin/umount ".$mysql_vg."/".$snapshot_name."\n" unless 
!$verbose;
    system ("/bin/umount ".$mysql_vg."/".$snapshot_name);
    printf "Executing /sbin/lvremove -f ".$mysql_vg."/".$snapshot_name."\n";
    system ("/sbin/lvremove -f ".$mysql_vg."/".$snapshot_name);
}

exit 0;

#
# Sub routines
#
sub fmtdate {
    my $string = shift;
    my ($DD, $MM, $YY, $hh, $mm, $ss) = ($string =~ m/(\d+).(\d+).(\d+) 
(\d+):(\d+):(\d+)/);
    return sprintf strftime("%y-%m-%d %H:%M:%S", $ss, $mm, $hh, $DD, $MM-1, 
$YY);
}    
sub now {
    my ($SEC, $MIN, $HOUR, $DAY, $MONTH, $YEAR) = (localtime)[0..5];
    return sprintf ("%04d-%02d-%02d %02d:%02d:%02d", $YEAR+1900, $MONTH+1, 
$DAY, $HOUR, $MIN, $SEC);
}

sub epoch {
    my $string = shift;
    my ($YYYY, $MM, $DD, $hh, $mm, $ss) = ($string =~ m/(\d+)-(\d+)-(\d+) 
(\d+):(\d+):(\d+)/);
    return timelocal($ss, $mm, $hh, $DD, $MM-1, $YYYY);
}
_______________________________________________
Xen-users mailing list
Xen-users@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-users