Skip to content
Snippets Groups Projects
mysql 5.87 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
    
    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
    
    if [ "$user" == "" ]; then
    	userset=false;
    	user=root;
    else
    	userset=true;
    
    	userhome=`getent passwd "$user" | awk -F: '{print $6}'`
    
    elijah's avatar
    elijah committed
    	[ -f $userhome/.my.cnf ] || fatal "Can't find config file in $userhome/.my.cnf"
    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
    # If vservers are configured, decide if the handler should
    # use them or if it should just operate on the host
    
    if [ "$vservers" = "yes" ]
    
    micah's avatar
    micah committed
    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
    
    
    # If needed, make sure that the specified vserver exists and is running.
    
    micah's avatar
    micah committed
    if [ $usevserver ]
    then
    
    	info "Examining vserver '$vsname'"
    
    micah's avatar
    micah committed
    	vroot="$VROOTDIR/$vsname"
    	[ -d $vroot ] || fatal "vserver '$vsname' does not exist at '$vroot'"
    
    	$VSERVERINFO -q $vsname RUNNING
    
    	if [ $? -ne 0 ]
    	then
    		fatal "vserver $vsname is not running."
    	fi
    
    micah's avatar
    micah committed
    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
    
    
    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
    
    	home=`getent passwd "root" | awk -F: '{print $6}'`
    
    elijah's avatar
    elijah committed
    	[ -d $home ] || fatal "Can't find root's home directory ($home)."
    	mycnf="$home/.my.cnf"
    
    elijah's avatar
    elijah committed
    	if [ -f $mycnf ]; then
    
    elijah's avatar
    elijah committed
    		# rename temporarily
    		tmpcnf="$home/my.cnf.disable"
    		debug "mv $mycnf $tmpcnf"
    		mv $mycnf $tmpcnf
    
    elijah's avatar
    elijah committed
    	fi
    	oldmask=`umask`
    	umask 077
    	cat > $mycnf <<EOF
    # auto generated backupninja mysql conf
    [mysql]
    user=$dbusername
    
    password="$dbpassword"
    
    elijah's avatar
    elijah committed
    
    [mysqldump]
    user=$dbusername
    
    password="$dbpassword"
    
    elijah's avatar
    elijah committed
    
    [mysqlhotcopy]
    user=$dbusername
    
    password="$dbpassword"
    
    elijah's avatar
    elijah committed
    EOF
    	umask $oldmask
    
    elijah's avatar
    elijah committed
    	defaultsfile="--defaults-file=$mycnf"
    elif [ "$userset" == "false" ]; then
    	# if user is set, don't use $configfile
    	defaultsfile="--defaults-file=$configfile"
    
    elijah's avatar
    elijah committed
    fi
    
    elijah's avatar
    elijah committed
    #######################################################################
    
    elijah's avatar
    elijah committed
    ## HOT COPY
    
    if [ "$hotcopy" == "yes" ]; then 
    	if [ "$databases" == "all" ]; then
    
    micah's avatar
    micah committed
    		if [ $usevserver ]
    		then
    
    elijah's avatar
    elijah committed
    			execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
    
    micah's avatar
    micah committed
    		else
    
    elijah's avatar
    elijah committed
    			execstr="$MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
    
    micah's avatar
    micah committed
    		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
    
    elijah's avatar
    elijah committed
    				execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --allowold $db $hotdir"
    
    micah's avatar
    micah committed
    			else
    
    elijah's avatar
    elijah committed
    				execstr="$MYSQLHOTCOPY --allowold $db $hotdir"
    
    micah's avatar
    micah committed
    			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
    
    elijah's avatar
    elijah committed
    
    ##########################################################################
    
    elijah's avatar
    elijah committed
    ## 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 $defaultsfile" | grep -v Database`
    
    micah's avatar
    micah committed
    		else
    
    			databases=`echo 'show databases' | su $user -c "$MYSQL $defaultsfile" | grep -v Database`
    
    micah's avatar
    micah committed
    		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 $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'"
    
    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
    
    
    # clean up tmp config file
    
    elijah's avatar
    elijah committed
    if [ "$dbusername" != "" ]; then
    	## clean up tmp config file
    
    elijah's avatar
    elijah committed
    	debug "rm $mycnf"
    
    elijah's avatar
    elijah committed
    	rm $mycnf
    
    elijah's avatar
    elijah committed
    	if [ -f "$tmpcnf" ]; then
    		debug "mv $tmpcnf $mycnf"
    		mv $tmpcnf $mycnf
    	fi
    
    elijah's avatar
    elijah committed
    fi
    
    return 0