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 中常用的字段截取和字符串截取方法,帮助你灵活处理数据,需要的朋友可以参考下
    2024-01-01
  • my.cnf参数配置实现InnoDB引擎性能优化

    my.cnf参数配置实现InnoDB引擎性能优化

    目前来说:InnoDB是为Mysql处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。在数据量大的网站或是应用中Innodb是倍受青睐的。另一方面,在数据库的复制操作中Innodb也是能保证master和slave数据一致有一定的作用。
    2017-05-05
  • MySQL虚拟列的使用示例

    MySQL虚拟列的使用示例

    虚拟列是MySQL中的一种特殊列,它不存储在表中,而是在查询时动态计算生成,虚拟列可以提高查询效率、减少存储需求、确保数据一致性、简化查询和保护敏感数据,感兴趣的可以了解一下
    2024-11-11
  • 浅谈MySQL的容量规划

    浅谈MySQL的容量规划

    进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下
    2025-08-08
  • Docker搭建MySQL并挂载数据的全过程

    Docker搭建MySQL并挂载数据的全过程

    环境搭建费时费力,但要必不可少,这篇文章主要给大家介绍了关于Docker搭建MySQL并挂载数据的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • window下mysql 8.0.15 winx64安装配置方法图文教程

    window下mysql 8.0.15 winx64安装配置方法图文教程

    这篇文章主要为大家详细介绍了window下mysql 8.0.15 winx64安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • MySQL复制之GTID复制的具体使用

    MySQL复制之GTID复制的具体使用

    从MySQL 5.6.5开始新增了一种基于GTID的复制方式,本文主要介绍了MySQL复制之GTID复制的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Mysql中Cast()函数的用法案例详解

    Mysql中Cast()函数的用法案例详解

    CAST 函数是 SQL 中的一种类型转换函数,它用于将一个数据类型转换为另一个数据类型,这篇文章主要介绍了Mysql中Cast()函数的用法,需要的朋友可以参考下
    2023-05-05
  • mysql数据如何通过data文件恢复

    mysql数据如何通过data文件恢复

    这篇文章主要介绍了mysql数据如何通过data文件恢复问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 详解如何使用DockerHub官方的MySQL镜像

    详解如何使用DockerHub官方的MySQL镜像

    MySQL是一个广泛使用的开源关系型数据库,那如何获取Mysql Docker镜像?下面通过这篇文章来一起看看如何使用DockerHub官方的MySQL镜像,有需要的朋友们可以参考借鉴。
    2016-12-12

最新评论