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
|