mysql通过innobackupex备份脚本

mysql 命令备份方式典型的二种方式mysqldump和innobackupex:

  • mysqldump优点:mysqldump的优点就是逻辑备份,把数据生成SQL形式保存,在单库,单表数据迁移,备份恢复等场景方便,SQL形式的备份文件通用,也方便在不同数据库之间移植。对于InnoDB表可以在线备份。
  • mysqldump缺点:mysqldump是单线程,数据量大的时候,备份时间长,甚至有可能在备份过程中非事务表长期锁表对业务造成影响(SQL形式的备份恢复时间也比较长)。mysqldump备份时会查询所有的数据,这可能会把内存中的热点数据刷掉
  • innobackupex优点:物理备份可以绕过MySQL Server层,加上本身就是文件系统级别的备份,备份速度块,恢复速度快,可以在线备份,支持并发备份,支持加密传输,支持备份限速
  • innobackupex缺点:要提取部分库表数据比较麻烦,不能按照基于时间点来恢复数据,并且不能远程备份,只能本地备份,增量备份的恢复也比较麻烦。如果使用innobackupex的全备+binlog增量备份就可以解决基于时间点恢复的问题。

一般情况下,项目上会每周执行一次全备,每天进行多次增备,所以脚本按照这个思路来写,本文分享通过innobackupex 备份脚本:

#!/bin/sh
##脚本里面登入mysql我带的是参数--login-path, 这个需要提前在服务端配置。命令如下:
##mysql_config_editor set  --user=root --password  --host localhost --port=13306 --login-path=backup_data
##mysql_config_editor print --all 可以查看是否配置过login-path
##如果选择不带--login-path这个参数,那么就在脚本里直接带上用户名和密码,这样不太安全,任何人都可以看到数据密码了
##执行脚本需要带1个参数,参数为start代表启动该脚本,会周期性执行全备和增量备份;参数为stop代表停止该脚本

##crontab -e    ##配置定时任务
#5 1 * * 0 xtrabackup.sh start //每周天1点5分启动脚本   
#0 1 * * 0 xtrabackup.sh stop  //每周天1点停止脚本
## 每次备份前,脚本会打包之前整个备份路径,之后才会进行全备和增备,全备路径为/opt/backup/backup_1
##增备路径为/opt/backup/backup_2,backup_3依次类推,增备是基于上一次增备的备份


#定义全备路径
backuppath=/opt/backup


#定义login_path,需要提前配置,或输入mysql_config_editor print --all命令查看配置
login_path=backup_data


#备份my.cnf文件
cp /etc/my.cnf /opt/backup/

#定义邮件地址,备份成功或失败通过邮件进行告知
#提前在服务端安装mailx包,配置/etc/mail.rc脚本,定义发送方邮件地址,在最下面添加
#set from=379534764@qq.com
#set smtp=smtp.qq.com
#set smtp-auth-user=379534764@qq.com
#set smtp-auth-password=授权码    //需要开启POP3/IMAP/SMTP服务才能进行查看,不是普通邮件密码
#set smtp-auth=login

function sendMail() {
mail=379534764@qq.com
echo "$1"|mail -s "$1" $mail
}

#函数fullbackup定义了全备命令,执行一次
function fullbackup(){
	while(true)
		do
		 if [ -d "$backuppath" ];then
		cd /opt/
		tar -cvf backup_$(date +%Y%m%d-%H%M%S).tar backup                
		rm -fr $backuppath/*
		fi	
		echo "------------Full backup is going to start at: $(date +%Y%m%d-%H%M%S)-----------------------" 

innobackupex --defaults-file=/etc/my.cnf --login-path=$login_path --no-timestamp $backuppath/backup_1


	echo "------------Full backup is finished at $(date +%Y%m%d-%H%M%S)---------------------------------------"
		
        if [ -f "$backuppath/backup_1/xtrabackup_checkpoints" ];then
		full_check=$(grep -i "backup_type" $backuppath/backup_1/xtrabackup_checkpoints| cut -b 15-27)

		if [ $full_check = full-backuped ]; then
				echo "full backup is sucessfully"
					retMsg="success:full backup is sucessfully! `date +%Y%m%d_%H%M%S` "
					sendMail "$retMsg"
				else
                echo "full backup is failed"
					retMsg="failed:full backup is failed! `date +%Y%m%d_%H%M%S` "
					sendMail "$retMsg"
				    stop
				
        fi
		else
				echo "xtrabackup_checkpoints is not exist"
					retMsg="failed:xtrabackup_checkpoints is not exist! `date +%Y%m%d_%H%M%S` "
					sendMail "$retMsg"					
				    stop
		fi
		
		sleep 8d
	done
}

i=1
#函数incrementbackup定义了增量备份命令,并且在全备的基础上执行一次,接着就是每隔4h在上一次增量基础上进行增量备份
function incrementbackup(){
	while(true)
		do

echo "-----------------increment backup is going to start at: $(date +%Y%m%d-%H%M%S)------------------------------" 				

innobackupex --defaults-file=/etc/my.cnf --login-path=$login_path --incremental --no-timestamp --incremental-basedir=$backuppath/backup_$i  $backuppath/backup_$(($i+1))

echo "-----------------increment backup is finished at: $(date +%Y%m%d-%H%M%S)----------------------------------"
		
	if [ -f "$backuppath/backup_$(($i+1))/xtrabackup_checkpoints" ];then
	increment_check=$(grep -i "backup_type" $backuppath/backup_$(($i+1))/xtrabackup_checkpoints| cut -b 15-27)

	if [ $increment_check = incremental ]; then
			echo "increment backup is sucessfully"
				retMsg="success:increment backup is sucessfully! `date +%Y%m%d_%H%M%S` "
				sendMail "$retMsg"
		else
                         echo "-----------------increment backup is failed----------------"
		        retMsg="failed:increment backup is failed! `date +%Y%m%d_%H%M%S` "
		        sendMail "$retMsg"
			stop
				
        fi
		else
			echo "--------xtrabackup_checkpoints is not exist--------"
			retMsg="failed:xtrabackup_checkpoints is not exist! `date +%Y%m%d_%H%M%S` "
			sendMail "$retMsg"					
		        stop
	fi		

#这里可以设置每隔4h进行一次增量备份
		let i++
		sleep 4h
 done
}


#定义start的函数
function start(){

#删除28天以上的备份文件
find /opt -mtime +28 -name "backup_*" -exec rm {} \;
	fullbackup &
#全备完成等待4h才开始做增量备份
		sleep 4h
	incrementbackup &		
	
}

#定义stop的函数
function stop(){
	var kill=`ps -ef|grep $0|grep -v grep |awk '{print $2}'|xargs kill -9 `
		if [ $? ]; then
			exit 0
			else exit 1
		fi
}



#脚本后面需要带参数,输入start则会启动备份,输入stop则会停止备份进程,输入restart则会重启备份进程,输入*或者其他值脚本无法执行
if [ -n "$1" ]; then
	case $1 in
		start)
			start;;
		stop)
			stop;;
		    *)
	echo "~~~~~~~~~~~~~~~~~please run the script with start|stop~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
		esac
		else 
	echo "~~~~~~~~~~~~~~~~~Please run the script with start|stop~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
fi
posted @ 2024-02-22 14:52  陶清刚  阅读(262)  评论(0)    收藏  举报