mysql全量备份和增量备份脚本

一、全量备份 ,每周一次

vim   MYSQL_FULLBAK.sh
#!/bin/bash
#set -x
############################################################
if [ $# -ne 2 ];then 
	echo "Usage:依次输入参数: <ROOTPASSWD> <BAKDIR> ";
	exit 1
fi

if ! ps -ef | grep -v "grep"|grep -q "mysqld ";then
	echo "未检测到mysql进程"
	exit 1
fi
############################################################
# 入参
PASSWD=$1
BAKDIR=$2
############################################################
# PORT && HOST && MYSQLHOME && BAKDIR
PORT=$(netstat -lanp | grep LISTEN | grep "mysqld"|awk -F ":" 'NR==1{print $2}'|awk '{print $1}')
MYSQL_HOME=$(ps -ef | grep -v "grep"|grep "mysqld "|tr -s ' ' '\n'|grep "\-\-basedir"|awk -F "=" '{print $NF}')
PATH=$MYSQL_HOME/bin:$PATH

localnetcard=$(route -n|grep UG|head -n 1|awk '{print $NF}')
if [ ! "$localnetcard" == "" ];then
    HOST=$(ip -4 addr show $localnetcard|awk -F '[/ ]' '{for(i=1;i<=NF;i++){if($i~"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"){print $i;break}}}'|awk 'NR==1{print $0}')
fi

if [ ! -d $BAKDIR ];then
	mkdir -p $BAKDIR
	chown -Rf mysql:mysql  $BAKDIR
fi
############################################################
# 主从
LANG=C
MYSQL_CONN="mysql -uroot -p$PASSWD  -h$HOST -P$PORT -s -e"
MHOST=$($MYSQL_CONN "show slave status\G" | grep -i "Master_Host:")
if [ "X$MHOST" != "X" ];then
    echo "current is Slave, got Master Info..." 
    MPORT=$($MYSQL_CONN "show slave status\G" | grep -i "Master_Port:")
    if [ "X$MPORT" != "X" ]; then
        HOST=$(echo $MHOST | awk '{ print $2 }')
        PORT=$(echo $MPORT | awk '{ print $2 }')
        MYSQL_CONN="mysql -uroot -p$PWD -h$HOST -P$PORT -s -e"
    fi
fi
############################################################
# 备份时间
TIME=$(date +"%Y%m%d%H%M%S")
# 备份文件名
DUMPFILE=FULL_$TIME.sql
GZDUMPFILE=FULL_$TIME.sql.tgz
############################################################
# 开始备份
cd $BAKDIR
LAST=$(date +"%Y年%m月%d日 %H:%M:%S")
mysqldump -uroot -p$PASSWD  -h$HOST -P$PORT --quick --events --all-databases  >$DUMPFILE 2>&1
if [ $? -eq 0 ];then
	tar -czf $GZDUMPFILE $DUMPFILE 2>&1
	rm -f $DUMPFILE 
	echo "***********$GZDUMPFILE******************"         
	echo "***********${LAST}全量备份成功******************"  
else
	rm -f $DUMPFILE
	echo "***********${LAST}全量备份失败******************"  
	exit 1
fi
############################################################
# 清理备份,保留1个月
COUNT=$(ls -lrt *.tgz | wc -l)
if [ "$COUNT" -gt 4 ];then
	FILE=$(ls -lrt  *.tgz |awk 'NR==1{print $NF}')
	rm -f $FILE
fi

# 删除增量
#if [ -d "/data/backup/increment" ];then
	#rm -f /data/backup/increment/* 
#fi

二、增量备份,每天一次

vim  MYSQL_INCREMENT_BAK.sh
#!/bin/bash
#set -x
############################################################
if [ $# -ne 2 ];then 
    echo "Usage:依次输入参数: <ROOTPASSWD> <BAKDIR>";
    exit 1
fi

if [ "$UID" != 0 ];then
    echo "must be root"
    exit 1
fi 

if ! ps -ef | grep -v "grep"|grep -q "mysqld ";then
    echo "未检测到mysql进程"
    exit 1
fi
############################################################
# 入参
PASSWD=$1
BAKDIR=$2
############################################################
# PORT && HOST && MYSQLHOME && BAKDIR
PORT=$(netstat -lanp | grep LISTEN | grep "mysqld"|awk -F ":" 'NR==1{print $4}')
MYSQL_HOME=$(ps -ef | grep -v "grep"|grep "mysqld "|tr -s ' ' '\n'|grep "\-\-basedir"|awk -F "=" '{print $NF}')
PATH=$MYSQL_HOME/bin:$PATH

localnetcard=$(route -n|grep UG|head -n 1|awk '{print $NF}')
if [ ! "$localnetcard" == "" ];then
    HOST=$(ip -4 addr show $localnetcard|awk -F '[/ ]' '{for(i=1;i<=NF;i++){if($i~"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"){print $i;break}}}'|awk 'NR==1{print $0}')
fi

if [ ! -d $BAKDIR ];then
    mkdir -p $BAKDIR
    chown -Rf mysql:mysql  $BAKDIR
fi
############################################################
# 主从
LANG=C
MYSQL_CONN="mysql -uroot -p$PASSWD  -h$HOST -P$PORT -s -e"
MHOST=$($MYSQL_CONN "show slave status\G" | grep -i "Master_Host:")
if [ "X$MHOST" != "X" ];then
    echo "current is Slave, got Master Info..." 
    MPORT=$($MYSQL_CONN "show slave status\G" | grep -i "Master_Port:")
    if [ "X$MPORT" != "X" ]; then
        HOST=$(echo $MHOST | awk '{ print $2 }')
        PORT=$(echo $MPORT | awk '{ print $2 }')
        MYSQL_CONN="mysql -uroot -p$PASSWD -h$HOST -P$PORT -s -e"
    fi
fi
############################################################
if $MYSQL_CONN "show variables like 'log_%';" |egrep -i -q "log_bin[[:space:]]ON";then
    # binlog生成目录
    BINDIR=$($MYSQL_CONN "show variables like 'log_%';" |egrep -i "log_bin_basename"|awk '{print $NF}'|awk -F "mysql-bin|" '{print $1}')   
    # binlog索引
    BINFILE=$($MYSQL_CONN "show variables like 'log_%';" |egrep -i "log_bin_index"|awk '{print $NF}')
    TIME=$(date +"%Y年%m月%d日 %H:%M:%S")
    # 产生新的mysql-bin.00000*文件
    mysqladmin -uroot -p$PASSWD  -h$HOST -P$PORT flush-logs
    if [ $? -ne 0 ];then
        echo "***********${TIME}增量备份失败******************"  
        exit 1
    fi
else
    echo "mysql 未开启binlog日志"
    exit 1
fi
############################################################
COUNT=$(wc -l $BINFILE |awk '{print $1}')
i=0
cat $BINFILE|while read line;do   
    BINNAME=$(basename $line)
    i=$(expr $i + 1)
    if [ $i -ne $COUNT ];then
        dest=$BAKDIR/$BINNAME
        if [ ! -e $dest ];then
            cp $BINDIR/$BINNAME $BAKDIR
            if [ $? -eq 0 ];then
                echo "***********${TIME} $BINNAME增量备份成功******************"  
            else
                echo "***********${TIME} $BINNAME增量备份失败******************"  
                exit 1
            fi   
        fi

    fi
done

三、赋权(可选)

chmod +x  /data/backup/*.sh

四、定时任务(可选)

crontab  -e
#每个星期日凌晨23:00执行完全备份脚本
0 23 * * 0   sh  /data/backup/MYSQL_FULLBAK.sh /back1 123456 >/dev/null 2>&1
#周一到周六凌晨23:00做增量备份
0 23 * * 1-6 sh /data/backup/MYSQL_INCREMENT_BAK.sh /back2 123456>/dev/null 2>&1
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用xtrabackup工具及shell脚本来进行MySQL数据库的备份。下面是一个示例脚本,可以实现每小时进行全量备份增量备份: ```bash #!/bin/bash # 设置备份目录 BACKUP_DIR="/path/to/backup/directory" # 设置MySQL连接信息 MYSQL_USER="your_mysql_user" MYSQL_PASSWORD="your_mysql_password" # 创建备份目录 mkdir -p $BACKUP_DIR # 获取当前时间 CURRENT_TIME=$(date +%Y%m%d%H%M%S) # 进行全量备份 xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --target-dir=$BACKUP_DIR/full_$CURRENT_TIME # 判断上一次全量备份是否存在 if [ -d $BACKUP_DIR/full_last ]; then # 进行增量备份 xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --target-dir=$BACKUP_DIR/incr_$CURRENT_TIME --incremental-basedir=$BACKUP_DIR/full_last else # 如果全量备份不存在,则进行第二次全量备份 xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --target-dir=$BACKUP_DIR/full_$CURRENT_TIME fi # 更新最后一次全量备份目录 rm -rf $BACKUP_DIR/full_last mv $BACKUP_DIR/full_$CURRENT_TIME $BACKUP_DIR/full_last ``` 将以上脚本保存为一个shell脚本文件,并根据你的实际情况修改相关参数。然后,通过设置定时任务(例如crontab)来每小时执行该脚本即可实现每小时全量备份增量备份。 请注意,以上脚本仅提供了基本的备份逻辑,实际使用时可能需要根据需求进行进一步的优化和安全性考虑。务必确保你的数据库连接信息和备份目录设置正确,并对备份文件进行适当的保护和存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值