Skip to content
Snippets Groups Projects
mysql 4.49 KiB
Newer Older
  • Learn to ignore specific revisions
  • elijah's avatar
    elijah committed
    #
    # mysql handler script for backupninja
    #
    
    getconf backupdir /var/backups/mysql
    getconf databases all
    getconf compress yes
    getconf dbusername
    getconf dbpassword
    getconf dbhost localhost
    getconf hotcopy no
    getconf sqldump no
    getconf user root
    
    micah's avatar
    micah committed
    getconf vsname
    
    elijah's avatar
    elijah committed
    
    
    micah's avatar
    micah committed
    # If vservers are configured, decide if the handler should
    # use them or if it should just operate on the host
    if [ "$VSERVERS" = "yes" ]
    then
    	if [ ! -z $vsname ]
    	then		
    		info "Using vserver '$vsname'"
    		usevserver=1
    	else
    		info "No vserver name specified, actions will be performed on the host"
    	fi
    fi
    
    elijah's avatar
    elijah committed
    
    
    micah's avatar
    micah committed
    # Check to make sure that the specified vserver exists
    if [ $usevserver ]
    then
    	vroot="$VROOTDIR/$vsname"
    	[ -d $vroot ] || fatal "vserver '$vsname' does not exist at '$vroot'"
    fi
    	
    # create backup dirs, the vroot variable will be empty if no vsname was specified
    # and will proceed to operate on the host
    [ -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 ]
    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
    
    # create .my.cnf
    
    micah's avatar
    micah committed
    # (we do this because we don't want to have to specify the password on the command line
    # because then anyone would be able to see it with a 'ps aux'. instead, we create a 
    # temporary ~/.my.cnf in root's home directory).
    
    elijah's avatar
    elijah committed
    
    if [ "$dbusername" != "" ]; then
    
    micah's avatar
    micah committed
    	home=`grep '^root:' $vroot/etc/passwd | awk -F: '{print $6}'`
    
    elijah's avatar
    elijah committed
    	[ -d $home ] || fatal "Can't find root's home directory ($home)."
    
    micah's avatar
    micah committed
    	mycnf="$vroot$home/.my.cnf"
    
    elijah's avatar
    elijah committed
    	if [ -f $mycnf ]; then
    		# rename temporarily
    		tmpcnf="$home/my.cnf.disable"
    
    elijah's avatar
    elijah committed
    		debug "mv $mycnf $tmpcnf"
    
    elijah's avatar
    elijah committed
    		mv $mycnf $tmpcnf
    	fi
    	oldmask=`umask`
    	umask 077
    	cat > $mycnf <<EOF
    # auto generated backupninja mysql conf
    [mysql]
    user=$dbusername
    password=$dbpassword
    
    [mysqldump]
    user=$dbusername
    password=$dbpassword
    
    [mysqlhotcopy]
    user=$dbusername
    password=$dbpassword
    EOF
    	umask $oldmask
    fi
    	
    ## HOT COPY
    
    if [ "$hotcopy" == "yes" ]; then 
    	if [ "$databases" == "all" ]; then
    
    micah's avatar
    micah committed
    		if [ $usevserver ]
    		then
    			execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
    		else
    			execstr="$MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
    		fi
    
    elijah's avatar
    elijah committed
    		debug "su $user -c '$execstr'"
    
    elijah's avatar
    elijah committed
    		if [ ! $test ]; then
    			output=`su $user -c "$execstr" 2>&1`
    			code=$?
    			if [ "$code" == "0" ]; then
    
    elijah's avatar
    elijah committed
    				debug $output
    				info "Successfully finished hotcopy of all mysql databases"
    
    elijah's avatar
    elijah committed
    			else
    
    elijah's avatar
    elijah committed
    				warning $output
    				warning "Failed to hotcopy all mysql databases"
    
    elijah's avatar
    elijah committed
    			fi
    		fi
    	else	
    		for db in $databases; do
    
    micah's avatar
    micah committed
    			if [ $usevserver ]
    			then
    				execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --allowold $db $hotdir"
    			else
    				execstr="$MYSQLHOTCOPY --allowold $db $hotdir"
    			fi
    
    elijah's avatar
    elijah committed
    			debug "su $user -c '$execstr'"
    
    elijah's avatar
    elijah committed
    			if [ ! $test ]; then
    				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
    		done
    	fi
    fi
    	
    ## SQL DUMP
    
    if [ "$sqldump" == "yes" ]; then
    	if [ "$databases" == "all" ]; then
    
    micah's avatar
    micah committed
    		if [ $usevserver ]
    		then
    			databases=`echo 'show databases' | $VSERVER $vsname exec su $user -c "$MYSQL" | grep -v Database`
    		else
    			databases=`echo 'show databases' | su $user -c "$MYSQL" | grep -v Database`
    		fi
    
    elijah's avatar
    elijah committed
    	fi
    
    	for db in $databases; do
    
    micah's avatar
    micah committed
    		if [ $usevserver ]
    		then
    			execstr="$VSERVER $vsname exec $MYSQLDUMP --lock-tables --complete-insert --add-drop-table --quick --quote-names $db > $vroot$dumpdir/${db}.sql"
    		else
    			execstr="$MYSQLDUMP --lock-tables --complete-insert --add-drop-table --quick --quote-names $db > $dumpdir/${db}.sql"
    		fi
    
    elijah's avatar
    elijah committed
    		debug "su $user -c '$execstr'"
    
    elijah's avatar
    elijah committed
    		if [ ! $test ]; then
    			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
    
    if [ "$dbusername" != "" ]; then
    	## 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"
    
    elijah's avatar
    elijah committed
    		mv $tmpcnf $mycnf
    	fi
    fi
    
    return 0