Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL 全量备份+增量备份

MySQL数据库全量备份+增量备份的实现

作者:南山nash

本文介绍了通过全量备份和增量备份实现数据库数据的安全,并通过cron定时任务自动进行备份,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

本篇文档带来的是数据库每周进行一次全量备份,每天通过binlog日志进行每天的增量备份,当数据库被drop时可以使用备份文件进行恢复数据库,从而实现数据的安全。

一、实现全量备份

通过MySQL dump+shell脚本实现对某个库进行备份

需要将下面脚本中的文件名称替换为自己本地存放文件的位置,一定注意文件的创建

#!/bin/bash
# MySQL全量备份脚本
# 配置信息
MYSQL_USER="root"    # 替换你的用户
MYSQL_PASS="123456"  # 替换成你的密码
DB_NAME="test"       # 替换你的数据库名称
BACKUP_DIR="/opt/q_z_back"       #替换为你数据库备份的目录
FULL_DIR="${BACKUP_DIR}/full"
LOG_FILE="${BACKUP_DIR}/log/backup_log_$(date +%Y%m%d).log"

# 创建目录(防止目录被误删)
mkdir -p $FULL_DIR $BACKUP_DIR/log

# 全量备份文件名(带日期时间,避免覆盖)
FULL_BACKUP_FILE="${FULL_DIR}/${DB_NAME}_full_$(date +%Y%m%d_%H%M%S).sql"

# 执行全量备份(--flush-logs刷新binlog,--master-data记录binlog位置)
echo "[$(date "+%Y-%m-%d %H:%M:%S")] 开始全量备份${DB_NAME}库..." >> $LOG_FILE
mysqldump -u$MYSQL_USER -p$MYSQL_PASS --single-transaction --flush-logs --master-data=2 $DB_NAME > $FULL_BACKUP_FILE

# 检查备份结果
if [ $? -eq 0 ]; then
    gzip $FULL_BACKUP_FILE  # 压缩备份
    echo "[$(date "+%Y-%m-%d %H:%M:%S")] 全量备份成功,文件:${FULL_BACKUP_FILE}.gz" >> $LOG_FILE      
    find $FULL_DIR -name "${DB_NAME}_full_*.sql.gz" -mtime +30 -delete # (删除30天前的)
else
    echo "[$(date "+%Y-%m-%d %H:%M:%S")] 全量备份失败!" >> $LOG_FILE
fi

脚本解释:备份你的目标库,将备份的文件压缩并存放在指定目录下;使用if判断,如果备份命令执行成功就输出备份成功日志,删除30天前的备份文件防止占用磁盘空间,备份命令执行失败输出备份失败日志

二、实现增量备份

1. 开启binlog日志

需要检查自己的mysql是否开启了binlog日志,mysql8.0默认是开启binlog日志的,你也可以在本地查看一下,(登录mysql 然后执行show variables like '%log_bin%'; 如果binlog是ON说明是开启的)要是没有开启binlog日志需要开启binlog日志(可以上网搜索一下如何开启)

2. binlog日志开启之后书写增量备份脚本

先要创建脚本中所需的目录full(全量备份文件存放位置)、log(日志存放位置)、increment(增量备份文件存放位置),需要更换将下面脚本中的文件名称替换为自己本地存放文件的位置

#!/bin/bash
# MySQL增量备份脚本(test库)
# 配置信息
MYSQL_USER="root"
MYSQL_PASS="123456"  # 替换成你的密码
DB_NAME="test"       # 替换为你备份的数据库
BACKUP_DIR="/opt/q_z_back"   #替换为你的备份目录
INCR_DIR="${BACKUP_DIR}/increment"
FULL_DIR="${BACKUP_DIR}/full"
LOG_FILE="${BACKUP_DIR}/log/backup_log_$(date +%Y%m%d).log"
# binlog路径(MySQL 8.0默认在/var/lib/mysql/,前缀是binlog)
BINLOG_DIR="/var/lib/mysql"
BINLOG_PREFIX="binlog"

# 创建目录
mkdir -p $INCR_DIR $BACKUP_DIR/log

# 找到最新的全量备份文件
LATEST_FULL_BACKUP=$(ls -t $FULL_DIR/${DB_NAME}_full_*.sql* 2>/dev/null | head -n 1)
if [ -z "$LATEST_FULL_BACKUP" ]; then
            echo "[$(date "+%Y-%m-%d %H:%M:%S")] 未找到全量备份文件,增量备份失败!" >> $LOG_FILE
                exit 1
fi
# 从全量备份中提取binlog起始位置
BINLOG_INFO=$(grep -E "CHANGE MASTER TO MASTER_LOG_FILE='.*', MASTER_LOG_POS=[0-9]+" $LATEST_FULL_BACKUP | head -n 1)
BINLOG_FILE=$(echo $BINLOG_INFO | sed -n "s/.*MASTER_LOG_FILE='\(.*\)', MASTER_LOG_POS=[0-9]\+;/\1/p")
BINLOG_POS=$(echo $BINLOG_INFO | sed -n "s/.*MASTER_LOG_POS=\([0-9]\+\);/\1/p")

# 增量备份文件名
INCR_BACKUP_FILE="${INCR_DIR}/${DB_NAME}_incr_$(date +%Y%m%d_%H%M%S).sql"

# 执行增量备份(解析binlog)
echo "[$(date "+%Y-%m-%d %H:%M:%S")] 开始增量备份${DB_NAME}库,从binlog ${BINLOG_FILE} 位置${BINLOG_POS}开始..." >> $LOG_FILE
mysqlbinlog --no-defaults -u$MYSQL_USER -p$MYSQL_PASS --database=$DB_NAME --start-position=$BINLOG_POS $BINLOG_DIR/$BINLOG_FILE > $INCR_BACKUP_FILE

# 检查备份结果
if [ $? -eq 0 ]; then
    gzip $INCR_BACKUP_FILE  # 压缩备份
    echo "[$(date "+%Y-%m-%d %H:%M:%S")] 增量备份成功,文件:${INCR_BACKUP_FILE}.gz" >> $LOG_FILE             
    find $INCR_DIR -name "${DB_NAME}_incr_*.sql.gz" -mtime +7 -delete  # 保留最近7天的增量备份
else
    echo "[$(date "+%Y-%m-%d %H:%M:%S")] 增量备份失败!" >> $LOG_FILE
fi

三、书写cron定时任务

1. 添加定时任务规则

1. crontab -e

加上
0 0 * * 0 /opt/q_z_back/test_full_backup.sh      #这个可执行文件是你的全量备份脚本路径
0 0 * * * /opt/q_z_back/test_increment_backup.sh #这是你增量备份可执行文件路径
# 0 0 * * 0 表示每周六晚上24点或者每周天晚上0点执行这个脚本
# 0 0 * * * 表示每天晚上0点执行这个脚本

2. 检查定时任务规则

2. crontab -l #查看规则

#0 11 * * * /opt/backup/shell/table_student.sh
0 0 * * 0 /opt/q_z_back/test_full_backup.sh
0 0 * * * /opt/q_z_back/test_increment_backup.sh

当把这些配置好之后你的数据库就会被自动备份,但是还是存在风险,比如中午突然数据库出现故障那么早上的数据该怎么修复呢,这时候需要主从复制+高可用来解决这个问题,后续我会带来主从复制、高可用等文档,大家感兴趣的可以自己先去了解。

到此这篇关于MySQL数据库全量备份+增量备份的实现的文章就介绍到这了,更多相关MySQL 全量备份+增量备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文