MySQL恢复脚本

#!/bin/bash

BACKUP_FILE_DIR=/backup

BACKUP_PIECES_BASE_DIR=$BACKUP_FILE_DIR/mysql_backup_2020-02-27_20-51-23-725425867

RECOVERY_PREPARE_TMP_DIR=$BACKUP_FILE_DIR/xtrabackup_recovery

BACKUP_PIECES_NAMES=`cat $BACKUP_PIECES_BASE_DIR/index |awk -F ':' '{print $1}'`

BACKUP_PIECES_COUNT=`cat $BACKUP_PIECES_BASE_DIR/index |wc -l`

INCREMENT_BASE_DIR=`cat $BACKUP_PIECES_BASE_DIR/index |head -n1|awk -F ':' '{print $1}'`

BACKUP_PIECES_ORDER=1

DO_BACKUP_UNPACK()
{
	if [ ! -d "$RECOVERY_PREPARE_TMP_DIR" ];then
		mkdir -p $RECOVERY_PREPARE_TMP_DIR
	else
		rm -rf $RECOVERY_PREPARE_TMP_DIR
		mkdir -p $RECOVERY_PREPARE_TMP_DIR
	fi

	for i in $BACKUP_PIECES_NAMES
	do
		cd $BACKUP_PIECES_BASE_DIR
		mkdir -p $RECOVERY_PREPARE_TMP_DIR/$i
		xbstream --parallel=4 --extract <$i -C $RECOVERY_PREPARE_TMP_DIR/$i

		if [ `echo $?` -ne 0 ]; then
       	        	echo -e "\033[31m ------------->>>>>>>> Failed Unpack Xbstream File [$i],Please Check Backup Is Valid \033[0m"
                	exit 1
		else
       	        	echo -e "\033[32m ------------->>>>>>>> Unpack Xbstream   File [$i] Successfully !!! \033[0m"
        	fi		

		innobackupex --parallel=4 --decompress --remove-original $RECOVERY_PREPARE_TMP_DIR/$i > $RECOVERY_PREPARE_TMP_DIR/$i'.decomcompress.log' 2>&1

		if [ `echo $?` -ne 0 ]; then
                        echo -e "\033[31m ------------->>>>>>>> Failed Decompress Backup File [$i],Please Check Backup Is Valid \033[0m"
                        exit 1
		else
       	        	echo -e "\033[32m ------------->>>>>>>> Decompress Backup File [$i] Successfully !!! \033[0m"
			echo ''
                fi
	done
}

DO_RECOVERY_PREPARE()
{
	for i in $BACKUP_PIECES_NAMES
	do
		## Recovery Prepare First Full Backup
		if [ $BACKUP_PIECES_ORDER -eq 1 ];then
			innobackupex --use-memory=320MB	--apply-log --redo-only $RECOVERY_PREPARE_TMP_DIR/$i > $RECOVERY_PREPARE_TMP_DIR/$i'.merge_redo_log.log' 2>&1

			if [ `echo $?` -ne 0 ]; then
                        	echo -e "\033[31m ------------->>>>>>>> Failed apply-log For First Full  Backup [$i],Please Check Backup Is Valid \033[0m"
                        	exit 1
                	else
                        	echo -e "\033[32m ------------->>>>>>>> Prepare First Full  Backup [$i] Successfully !!! \033[0m"
                	fi
			
		## Recovery Prepare Incremental Backup Except For The Last One
		elif [ $BACKUP_PIECES_ORDER -lt $BACKUP_PIECES_COUNT ];then
			innobackupex --use-memory=320MB --apply-log --redo-only $RECOVERY_PREPARE_TMP_DIR/$INCREMENT_BASE_DIR --incremental-dir=$RECOVERY_PREPARE_TMP_DIR/$i > $RECOVERY_PREPARE_TMP_DIR/$i'.merge_redo_log.log' 2>&1
			mv $RECOVERY_PREPARE_TMP_DIR/$i $RECOVERY_PREPARE_TMP_DIR/'increment_'$BACKUP_PIECES_ORDER

			
			if [ `echo $?` -ne 0 ]; then
                       		echo -e "\033[31m ------------->>>>>>>> Failed apply-log For Incremental Backup [$i],Please Check Backup Is Valid \033[0m"
                        	exit 1
                	else
                       		echo -e "\033[32m ------------->>>>>>>> Prepare Incremental Backup [$i] Successfully !!! \033[0m"
                	fi

		## Recovery Prepare The Last One Incremental without [--redo-only] Paramenter
		elif [ $BACKUP_PIECES_ORDER -eq $BACKUP_PIECES_COUNT ];then
			innobackupex --use-memory=320MB --apply-log  $RECOVERY_PREPARE_TMP_DIR/$INCREMENT_BASE_DIR --incremental-dir=$RECOVERY_PREPARE_TMP_DIR/$i > $RECOVERY_PREPARE_TMP_DIR/$i'.merge_redo_log.log' 2>&1
			mv $RECOVERY_PREPARE_TMP_DIR/$i $RECOVERY_PREPARE_TMP_DIR/'increment_'$BACKUP_PIECES_ORDER

			if [ `echo $?` -ne 0 ]; then
               	        	echo -e "\033[31m ------------->>>>>>>> Failed apply-log For Incremental Backup [$i],Please Check Backup Is Valid \033[0m"
                        	exit 1
                	else
                        	echo -e "\033[32m ------------->>>>>>>> Prepare Incremental Backup [$i] Successfully !!! \033[0m"
                	fi

		else
			echo 'This Part Will Not Be Executed'
		fi

		let "BACKUP_PIECES_ORDER=$BACKUP_PIECES_ORDER+1"
	done
}

DO_SOME_CLEAN()
{
		cp $BACKUP_PIECES_BASE_DIR/my.cnf $RECOVERY_PREPARE_TMP_DIR
		mv $RECOVERY_PREPARE_TMP_DIR/$INCREMENT_BASE_DIR $RECOVERY_PREPARE_TMP_DIR/full_amount_backup
                mkdir -p $RECOVERY_PREPARE_TMP_DIR/log
                mv $RECOVERY_PREPARE_TMP_DIR/*.log $RECOVERY_PREPARE_TMP_DIR/log
		echo ''
		echo -e "\033[32m ------------->>>>>>>> Now You Can Manually Copy Back The Data Using Commands Like The Following\033[0m"
		echo '    'innobackupex --defaults-file=$RECOVERY_PREPARE_TMP_DIR/my.cnf --copy-back $RECOVERY_PREPARE_TMP_DIR/full_amount_backup
		echo '    'innobackupex --defaults-file=$RECOVERY_PREPARE_TMP_DIR/my.cnf --move-back $RECOVERY_PREPARE_TMP_DIR/full_amount_backup
}




MAIN()
{
DO_BACKUP_UNPACK
DO_RECOVERY_PREPARE
# DO_SOME_CLEAN
}

MAIN

猜你喜欢

转载自blog.csdn.net/qq_42979842/article/details/108966685