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

 更新时间:2026年03月03日 10:37:40   作者:南山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 全量备份+增量备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 字段默认值该如何设置

    MySQL 字段默认值该如何设置

    这篇文章主要介绍了MySQL 字段默认值该如何设置,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-02-02
  • MySQL之B+Tree、索引及使用时优化方式

    MySQL之B+Tree、索引及使用时优化方式

    MySQL索引优化关键点包括BTree、Hash、R-tree及Full-text索引,并详述BTree结构与操作,强调索引使用场景与失效情形,如优化SQL需考虑索引选择、覆盖索引及分页优化策略
    2026-06-06
  • 解决MySQL批量新增或修改时出现异常:Lock wait timeout exceeded

    解决MySQL批量新增或修改时出现异常:Lock wait timeout exceeded

    这篇文章主要给大家介绍了关于如何解决MySQL批量新增或修改时出现异常:Lock wait timeout exceeded;try restarting transaction的相关资料,需要的朋友可以参考下
    2024-01-01
  • mysql横向转纵向、纵向转横向排列的方法

    mysql横向转纵向、纵向转横向排列的方法

    这篇文章主要介绍了mysql横向转纵向、纵向转横向排列的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • MySQL的match函数在sp中使用BUG解决分析

    MySQL的match函数在sp中使用BUG解决分析

    这篇文章主要为大家介绍了MySQL的match函数在sp中使用BUG解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • MySQL使用触发器实现数据自动更新的应用实例

    MySQL使用触发器实现数据自动更新的应用实例

    触发器是非常常见的自动化数据库操作方式,无论是在数据更新、删除还是需要自动添加一些内容到数据表上,触发器都可以发挥作用,熟悉 SQL 的基本语法和一些常见的用例,可以帮助你合理地设置自己的数据库操作流程,
    2024-01-01
  • 了解MySQL查询语句执行过程(5大组件)

    了解MySQL查询语句执行过程(5大组件)

    这篇文章主要介绍了了解MySQL查询语句执行过程(5大组件),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • mysql插入带emoji表情的数据报错问题

    mysql插入带emoji表情的数据报错问题

    在处理MySQL数据库插入表情时出现错误,主要可能是由三个因素引起的:1、数据库版本号是否大于5.5.3;2、数据库表及字段的字符集是否为utf8mb4;3、项目中MySQL驱动的版本是否大于5.1.13,本文详细讲解了如何针对这三个关键点进行排查和解决
    2024-11-11
  • MySQL中Union子句不支持order by的解决方法

    MySQL中Union子句不支持order by的解决方法

    这篇文章主要介绍了MySQL中Union子句不支持order by的解决方法,结合实例形式分析了在mysql的Union子句中使用order by的方法,需要的朋友可以参考下
    2016-06-06
  • Ubuntu自启动Mysql的三种方式

    Ubuntu自启动Mysql的三种方式

    本文给大家介绍ubuntu自启动mysql的三种方式,一种方法通过执行命令,也是最简单的方法,第二种方法是使用sysv-rc-cont工具,第三种方法是使用chkconfig工具,关于以上三种方式的详解请看下文
    2015-10-10

最新评论