X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fbackupninja.git;a=blobdiff_plain;f=handlers%2Fmysql.in;fp=handlers%2Fmysql.in;h=de4e4c3d2f920d8117c2e960e9c1f5e1619ccf22;hp=0000000000000000000000000000000000000000;hb=579ea902ba24854b3c9acb307cda7e996e8e41a3;hpb=be75e4e6c536882c14db9a41c61585e7a9c045f6 diff --git a/handlers/mysql.in b/handlers/mysql.in new file mode 100644 index 0000000..de4e4c3 --- /dev/null +++ b/handlers/mysql.in @@ -0,0 +1,304 @@ +# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- +# +# mysql handler script for backupninja +# + +getconf backupdir /var/backups/mysql +getconf databases all +getconf ignores +getconf dbhost localhost +getconf hotcopy no +getconf sqldump no +getconf compress yes +getconf vsname + +# authentication: +getconf user +getconf dbusername +getconf dbpassword +getconf configfile /etc/mysql/debian.cnf + + +# Decide if the handler should operate on a vserver or on the host. +# In the former case, check that $vsname exists and is running. +local usevserver=no +local vroot +if [ $vservers_are_available = yes ]; then + if [ -n "$vsname" ]; then + # does it exist ? + if ! vservers_exist "$vsname" ; then + fatal "The vserver given in vsname ($vsname) does not exist." + fi + # is it running ? + $VSERVERINFO -q $vsname RUNNING + if [ $? -ne 0 ]; then + fatal "The vserver $vsname is not running." + fi + # everything ok + info "Using vserver '$vsname'." + usevserver=yes + vroot="$VROOTDIR/$vsname" + else + info "No vserver name specified, actions will be performed on the host." + fi +fi + +## Prepare ignore part of the command +## This only works for mysqldump at the moment + +ignore='' +for i in $ignores; do + ignore="$ignore --ignore-table=$i" +done + +# create backup dirs, $vroot will be empty if no vsname was specified +# and we will instead proceed to operate on the host +[ -d $vroot$backupdir ] || mkdir -p $vroot$backupdir +[ -d $vroot$backupdir ] || fatal "Backup directory '$vroot$backupdir'" +hotdir="$backupdir/hotcopy" +dumpdir="$backupdir/sqldump" + +if [ $usevserver = yes ] +then + [ "$sqldump" == "no" -o -d $vroot$dumpdir ] || $VSERVER $vsname exec mkdir -p $dumpdir + [ "$hotcopy" == "no" -o -d $vroot$hotdir ] || $VSERVER $vsname exec mkdir -p $hotdir +else + [ "$sqldump" == "no" -o -d $dumpdir ] || mkdir -p $dumpdir + [ "$hotcopy" == "no" -o -d $hotdir ] || mkdir -p $hotdir +fi + +####################################################################### +## AUTHENTICATION + +# +# one of three authentication methods: +# 1. setting the user, so that /home/user/.my.cnf is used. +# 2. specifying the user and password in the handler config, +# which generates a temporary .my.cnf in /root/.my.cnf +# 3. specify the config file with --defaults-extra-file +# (this option DOESN'T WORK WITH MYSQLHOTCOPY) +# + +# create .my.cnf +# only if dbusername and dbpassword specified. +# we create a tmp file because we don't want to +# specify the password on the command line. + +defaultsfile="" + +if [ "$dbusername" != "" -a "$dbpassword" != "" ] +then + if [ $usevserver = yes ] + then + vhome=`$VSERVER $vsname exec getent passwd "root" | @AWK@ -F: '{print $6}'` + home="$vroot$vhome" + else + home=`getent passwd "root" | @AWK@ -F: '{print $6}'` + fi + + [ -d $home ] || fatal "Can't find root's home directory ($home)." + + mycnf="$home/.my.cnf" + + if [ -f $mycnf ] + then + # rename temporarily + tmpcnf="$home/my.cnf.disable" + debug "mv $mycnf $tmpcnf" + mv $mycnf $tmpcnf + fi + + oldmask=`umask` + umask 077 + cat > $mycnf <&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished hotcopy of all mysql databases" + else + warning $output + warning "Failed to hotcopy all mysql databases" + fi + fi + else + for db in $databases + do + if [ $usevserver = yes ] + then + execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --allowold $db $hotdir" + else + execstr="$MYSQLHOTCOPY --allowold $db $hotdir" + fi + debug 'su $user -c \"$execstr\"' + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished hotcopy of mysql database $db" + else + warning $output + warning "Failed to hotcopy mysql database $db" + fi + fi + done + fi +fi + +########################################################################## +## SQL DUMP + +if [ "$sqldump" == "yes" ] +then + info "Initializing SQL dump method" + if [ "$databases" == "all" ] + then + if [ $usevserver = yes ] + then + debug 'echo show databases | $VSERVER $vsname exec su $user -c \"$MYSQL $defaultsfile\" | grep -v Database' + databases=`echo 'show databases' | $VSERVER $vsname exec su $user -c "$MYSQL $defaultsfile" | grep -v Database` + if [ $? -ne 0 ] + then + fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" + fi + else + databases=`echo 'show databases' | su $user -c "$MYSQL $defaultsfile" | grep -v Database` + if [ $? -ne 0 ] + then + fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" + fi + fi +fi + + for db in $databases + do + if [ $usevserver = yes ] + then + # Test to make sure mysqld is running, if it is not sqldump will not work + $VSERVER $vsname exec su $user -c "$MYSQLADMIN $defaultsfile ping" + if [ $? -ne 0 ]; then + fatal "Either you have an authentication problem, or mysqld doesn't appear to be running!" + fi + if [ "$compress" == "yes" ]; then + execstr="$VSERVER $vsname exec $MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db | $GZIP > $vroot$dumpdir/${db}.sql.gz" + else + execstr="$VSERVER $vsname exec $MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db -r $vroot$dumpdir/${db}.sql" + fi + else + # Test to make sure mysqld is running, if it is not sqldump will not work + su $user -c "$MYSQLADMIN $defaultsfile ping" + if [ $? -ne 0 ]; then + fatal "Either you have an authentication problem, or mysqld doesn't appear to be running!" + fi + if [ "$compress" == "yes" ]; then + execstr="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db | $GZIP > $dumpdir/${db}.sql.gz" + else + execstr="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db -r $dumpdir/${db}.sql" + fi + fi + debug "su $user -c \"$execstr\"" + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished dump of mysql database $db" + else + warning $output + warning "Failed to dump mysql databases $db" + fi + fi + done +fi + +# clean up tmp config file +if [ "$dbusername" != "" -a "$dbpassword" != "" ] +then + ## clean up tmp config file + debug "rm $mycnf" + rm $mycnf + if [ -f "$tmpcnf" ] + then + debug "mv $tmpcnf $mycnf" + mv $tmpcnf $mycnf + fi +fi + +return 0