mysql在centos环境下全量备份和增量备份

一、开启binlog
1、检查binlog是否开启,进入mysql

mysql -uroot -p

2、查看binlog状态,ON为开启,如果为关闭则参考3 - 4步骤;

show variables like '%log_bin%';

ON为开启

3、进入mysql配置文件编辑模式

vim /etc/my.cnf

在[mysqld]下面加入,并保存(不加server_id会报错,server_id的值可以随便设。)

[mysqld]
log_bin=/data/mysql/backup/incr
server_id=166

4、重启mysql

service mysqld restart

二、自动备份脚本
1、将 full_backup.sh(全量备份) 和 incr_backup.sh(增量备份) 脚本上传至指定路径

full_backup.sh(全量备份) 代码

#!/bin/bash
# MySQL全量备份,本脚本备份所有库
# **********
# 用户名、密码
user="root"
password="password"
# 备份开始时间
beginTime=`date +"%Y年%m月%d日 %H:%M:%S"`
# 备份结束时间
endTime=`date +"%Y年%m月%d日 %H:%M:%S"`
# 全量备份目录,提前手动创建这个目录
bakDir=/data/mysql/backup/full
# 日志文件
logFile=/data/mysql/backup/log/full.log
# 备份时间
nowDate=`date +"%Y%m%d_%H%M%S"`
dumpFile="alldb_${nowDate}.sql"
gzDumpFile="alldb_${nowDate}.sql.tgz"

cd $bakDir
echo 全量备份开始:$beginTime >> $logFile
# 全量备份(--databases对指定数据库备份,--all-databases对所有数据库备份)
mysqldump --all-databases -u${user} -p${password} -A -E -q --flush-privileges --single-transaction > $dumpFile

# 判断备份是否成功
if [ $? -eq 0 ]; then
  # 产生新的mysql-bin
  echo 刷新增量备份节点  
  sh /root/incr_backup.sh
  # 将备份SQL打包
  /bin/tar -zvcf $gzDumpFile $dumpFile
  /bin/rm $dumpFile
  echo 全量备份结束:$endTime $gzDumpFile ! SUCCESS ! >> $logFile
  exit 0;
else
  echo 全量备份结束:$endTime $gzDumpFile ! ERROR ! >> $logFile
  exit 1;    
fi

#删除60天前的备份
find $bakDir -name "*.sql.tgz" -type f -mtime +60 -exec rm -rf {} \; > /dev/null 2>&1
exit 0;

incr_backup.sh(增量备份) 代码

#!/bin/bash
# **********
# 用户名、密码
user="root"
password="password"
# **********
# 在使用之前,请提前创建以下各个目录
backupDir=/data/mysql/backup/incr
# 增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录
mysqlDir=/usr/local/mysql
# 设置mysql增量备份的日志文件保存路径,没这个文件夹需要主动新建
logFile=/data/mysql/backup/log/incr.log
#mysql的index文件路径,放在数据目录下的
BinFile=/usr/local/mysql/mysql-bin.index

# 产生新的mysql-bin.00000*文件
mysqladmin -u${user} -p${password} flush-logs

# wc -l 统计行数
# awk 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
for file in `cat $BinFile`
do
    base=`basename $file`
    echo $base
    #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    NextNum=`expr $NextNum + 1`
    if [ $NextNum -eq $Counter ]
    then
        echo $base skip! >> $logFile
    else
        dest=$backupDir/$base
        if(test -e $dest)
        #test -e用于检测目标文件是否存在,存在就写exist!到$logFile去
        then
            echo $base exist! >> $logFile
        else
            cp $mysqlDir/$base $backupDir
            echo $base copying >> $logFile
         fi
     fi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $logFile

2、创建备份路径文件夹,如:

/data/mysql/backup/full
/data/mysql/backup/incr
/data/mysql/backup/log

3、首先执行命令进行全量备份,完成全量备份脚本会刷新增量备份日志节点

./full_backup.sh

在这里插入图片描述

4、参考全量备份和增量备份文件

全量备份文件
在这里插入图片描述
增量备份文件
在这里插入图片描述
三、开启定时增量备份

输入以下命令

crontab -e

进入编辑模式,复制如下内容保存,可以先进行测试

# 先测试每分钟增量备份一次效果
# * */1 * * * sh /root/incr_backup.sh
# 在每天凌晨2点执行脚本
0 2 * * * /bin/bash -x /root/incr_backup.sh >/dev/null 2>&1
# 重启
systemctl restart crond
systemctl reload crond

四、恢复全量备份和增量备份数据

1、恢复全量备份

# 进入备份文件目录
cd /data/mysql/backup
# 解压最新的全量备份文件
tar -zxvf xxx.sql.tgz
# 执行要指定恢复的SQL路径
mysql -u root -p < /data/mysql/backup/full/alldb_xxx.sql

2、恢复增量备份

# 指定对应要恢复的mysql-bin文件,注意恢复要从早到晚的顺序
mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000001 | mysql -uroot -p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值