Skip to content
Snippets Groups Projects
mysql 7.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • # -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
    
    elijah's avatar
    elijah committed
    #
    # mysql handler script for backupninja
    #
    
    getconf backupdir /var/backups/mysql
    getconf databases all
    
    elijah's avatar
    elijah committed
    getconf dbhost localhost
    
    elijah's avatar
    elijah committed
    getconf hotcopy no
    
    elijah's avatar
    elijah committed
    getconf sqldump no
    
    elijah's avatar
    elijah committed
    getconf compress yes
    
    micah's avatar
    micah committed
    getconf vsname
    
    elijah's avatar
    elijah committed
    
    
    elijah's avatar
    elijah committed
    # 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
    
          # 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
    
    micah's avatar
    micah committed
    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
    
    micah's avatar
    micah committed
    	
    
    # create backup dirs, $vroot will be empty if no vsname was specified
    # and we will instead proceed to operate on the host
    
    micah's avatar
    micah committed
    [ -d $vroot$backupdir ] || mkdir -p $vroot$backupdir
    [ -d $vroot$backupdir ] || fatal "Backup directory '$vroot$backupdir'"
    
    elijah's avatar
    elijah committed
    hotdir="$backupdir/hotcopy"
    dumpdir="$backupdir/sqldump"
    
    micah's avatar
    micah committed
    
    
    if [ $usevserver = yes ]
    
    micah's avatar
    micah committed
    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
    
    elijah's avatar
    elijah committed
    
    
    elijah's avatar
    elijah committed
    #######################################################################
    ## 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-file
    #    (this option DOESN'T WORK WITH MYSQLHOTCOPY)
    #
    
    
    elijah's avatar
    elijah committed
    # create .my.cnf
    
    # only if dbusername and dbpassword specified.
    
    elijah's avatar
    elijah committed
    # we create a tmp file because we don't want to
    
    # specify the password on the command line.
    
    elijah's avatar
    elijah committed
    
    
    defaultsfile=""
    
    if [ "$dbusername" != "" -a "$dbpassword" != "" ]
    then
    
        if [ $usevserver = yes ]
    
        	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 <<EOF
    
    elijah's avatar
    elijah committed
    # auto generated backupninja mysql conf
    [mysql]
    
    host=$dbhost
    
    elijah's avatar
    elijah committed
    user=$dbusername
    
    password="$dbpassword"
    
    elijah's avatar
    elijah committed
    
    [mysqldump]
    
    host=$dbhost
    
    elijah's avatar
    elijah committed
    user=$dbusername
    
    password="$dbpassword"
    
    elijah's avatar
    elijah committed
    
    [mysqlhotcopy]
    
    host=$dbhost
    
    elijah's avatar
    elijah committed
    user=$dbusername
    
    password="$dbpassword"
    
    elijah's avatar
    elijah committed
    EOF
    	umask $oldmask
    
    	if [ $usevserver = yes ] 
    
    	then
    	    defaultsfile="--defaults-file=$vhome/.my.cnf"
    	else
    	    defaultsfile="--defaults-file=$mycnf"
    	fi
    
    elijah's avatar
    elijah committed
    fi
    
    intrigeri's avatar
    intrigeri committed
    # if a user is not set, use $configfile, otherwise use $mycnf
    
    if [ "$user" == "" ]; then
    	user=root;
    
    	defaultsfile="--defaults-file=$configfile"
    
    else
    	userset=true;
    
    	if [ $usevserver = yes ]
    
    	then
    	    vuserhome=`$VSERVER $vsname exec getent passwd "$user" | awk -F: '{print $6}'`
    	    if [ $? -eq 2 ]
    	    then
    	    	fatal "User $user not found in /etc/passwd"
    	    fi
        	    userhome="$vroot$vuserhome"
    	else
    	    userhome=`getent passwd "$user" | awk -F: '{print $6}'`
    	    if [ $? -eq 2 ]
    	    then
    	    	fatal "User $user not found in /etc/passwd"
    	    fi
           	fi
    	
    	debug "User home set to: $userhome"
    	[ -f $userhome/.my.cnf ] || fatal "Can't find config file in $userhome/.my.cnf"
    
    	defaultsfile="--defaults-file=$userhome/.my.cnf"
    
    	debug "using $defaultsfile"
    fi
    
    
    elijah's avatar
    elijah committed
    #######################################################################
    
    elijah's avatar
    elijah committed
    ## HOT COPY
    
    
    if [ "$hotcopy" == "yes" ]
    then
        info "Initializing hotcopy method"
        if [ "$databases" == "all" ]
        then
    
    	if [ $usevserver = yes ]
    
    	    	info "dbhost: $dbhost"
    		execstr="$VSERVER $vsname exec $MYSQLHOTCOPY -h $dbhost --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
    
    	else
    		execstr="$MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $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 all mysql databases"
    		else
    			warning $output
    			warning "Failed to hotcopy all mysql databases"
    		fi
    	fi
        else	
    	for db in $databases
    	do
    
    		if [ $usevserver = yes ]
    
    micah's avatar
    micah committed
    		then
    
    			execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --allowold $db $hotdir"
    
    micah's avatar
    micah committed
    		else
    
    			execstr="$MYSQLHOTCOPY --allowold $db $hotdir"
    
    micah's avatar
    micah committed
    		fi
    
    elijah's avatar
    elijah committed
    		debug "su $user -c '$execstr'"
    
    		if [ ! $test ]
    		then
    
    elijah's avatar
    elijah committed
    			output=`su $user -c "$execstr" 2>&1`
    			code=$?
    
    			if [ "$code" == "0" ]
    			then
    
    elijah's avatar
    elijah committed
    				debug $output
    
    				info "Successfully finished hotcopy of mysql database $db"
    
    elijah's avatar
    elijah committed
    			else
    
    elijah's avatar
    elijah committed
    				warning $output
    
    				warning "Failed to hotcopy mysql database $db"
    
    elijah's avatar
    elijah committed
    			fi
    		fi
    
    elijah's avatar
    elijah committed
    fi
    
    elijah's avatar
    elijah committed
    
    ##########################################################################
    
    elijah's avatar
    elijah committed
    ## SQL DUMP
    
    
    if [ "$sqldump" == "yes" ]
    then
        info "Initializing SQL dump method"
        if [ "$databases" == "all" ]
        then
    
    	if [ $usevserver = yes ]
    
    	    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"
    
    	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"
    
    micah's avatar
    micah committed
    		fi
    
    elijah's avatar
    elijah committed
    	fi
    
    elijah's avatar
    elijah committed
    
    
    	for db in $databases
    	do
    
    		if [ $usevserver = yes ]
    
    micah's avatar
    micah committed
    		then
    
    			execstr="$VSERVER $vsname exec $MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db > $vroot$dumpdir/${db}.sql"
    
    micah's avatar
    micah committed
    		else
    
    			execstr="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db > $dumpdir/${db}.sql"
    
    micah's avatar
    micah committed
    		fi
    
    elijah's avatar
    elijah committed
    		debug "su $user -c '$execstr'"
    
    		if [ ! $test ]
    		then
    
    elijah's avatar
    elijah committed
    			output=`su $user -c "$execstr" 2>&1`
    			code=$?
    
    			if [ "$code" == "0" ]
    			then
    
    elijah's avatar
    elijah committed
    				debug $output
    				info "Successfully finished dump of mysql database $db"
    
    elijah's avatar
    elijah committed
    			else
    
    elijah's avatar
    elijah committed
    				warning $output
    				warning "Failed to dump mysql databases $db"
    
    elijah's avatar
    elijah committed
    			fi
    		fi
    	done
    	
    
    	if [ "$compress" == "yes" ]
    	then
    
    micah's avatar
    micah committed
    		output=`$GZIP -f $vroot$dumpdir/*.sql 2>&1`
    
    elijah's avatar
    elijah committed
    		debug $output
    
    elijah's avatar
    elijah committed
    	fi
    fi
    
    
    # clean up tmp config file
    
    if [ "$dbusername" != "" ]
    then
    
    elijah's avatar
    elijah committed
    	## clean up tmp config file
    
    elijah's avatar
    elijah committed
    	debug "rm $mycnf"
    
    elijah's avatar
    elijah committed
    	rm $mycnf
    
    	if [ -f "$tmpcnf" ]
    	then
    
    elijah's avatar
    elijah committed
    		debug "mv $tmpcnf $mycnf"
    		mv $tmpcnf $mycnf
    	fi
    
    elijah's avatar
    elijah committed
    fi
    
    return 0