#!/usr/bin/perl -w # # ec2-snapshot-xfs-mysql - EBS snapshot XFS file system with MySQL database # # Usage: # # ec2-snapshot-xfs-mysql XFSMOUNTPOINT VOLUMEID # # Requires: # # Amazon EC2 API tools should be installed on the instance, # especially /usr/local/bin/ec2-create-snapshot # # MySQL username and password are stored in $HOME/.my.cnf in the # usual manner following this format: # # [client] # user=MYUSERNAME # password=MYPASSWORD # # Author: # # Eric Hammond # use strict; use DBI; BEGIN { $ENV{PATH} = '/bin:/usr/bin:/usr/local/bin:/usr/sbin:/home/ec2/bin'; $ENV{EC2_CERT} = '/home/ec2/certs/[certificate name].pem'; $ENV{EC2_PRIVATE_KEY} = '/home/ec2/certs/[private key name].pem'; $ENV{EC2_HOME} = '/home/ec2'; $ENV{HOME} = '/root'; $ENV{JAVA_HOME} = '/usr/java/default'; } my ($mountpoint, $volume_id) = @ARGV; die "Usage: $0 XFSMOUNTPOINT VOLUMEID" unless $mountpoint && $volume_id; # Get the MySQL username/password from $HOME/.my.cnf and connect my ($username, $password); open(FH, "$ENV{HOME}/.my.cnf") or die "Unable to open .my.cnf: $!"; while ( defined (my $line = ) ) { $username = $1 if $line =~ m%^\s*user\s*=\s*(\S+)%; $password = $1 if $line =~ m%^\s*password\s*=\s*(\S+)%; } close(FH); my $dbh = DBI->connect('DBI:mysql:;host=localhost', $username, $password); # Flush, lock, freeze $dbh->do(q{ FLUSH TABLES WITH READ LOCK }); my ($logfile, $position) = $dbh->selectrow_array(q{ SHOW MASTER STATUS }); system('xfs_freeze', '-f', $mountpoint); # Snapshot my $snapshot_output = `ec2-create-snapshot $volume_id`; my ($snapshot_id) = ($snapshot_output =~ m%(snap-[0-9a-f]{8})%); # Thaw, unlock system('xfs_freeze', '-u', $mountpoint); $dbh->do(q{ UNLOCK TABLES }); print $snapshot_id ? "$snapshot_id (master_log_file=\"$logfile\", master_log_pos=$position)\n" : "snapshot FAILED\n";