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
浙公网安备 33010602011771号