MySQL 全量 + 增量备份脚本(RPM 安装)实践与疑问解析

news/2025/10/3 11:48:53/文章来源:https://www.cnblogs.com/lxjshuju/p/19124447

前言

一、备份方案概述

二、最终备份脚本

三、遇到的问题与解决方案

1. 增量备份只备份了 mysql-bin.index

2. 增量备份为空或不完整

3. 新增 binlog 文件数量增加

4. crontab 日志记录

四、总结

五、附录

rpm安装mysql步骤

1.下载RPM以及依赖包

2.下载MYSQL所需的依赖包

3.安装RPM包

4.启动mysql

5.修改初始密码

6.修改配置文件

7.修改密码

8.测试登录

六、脚本参数详解

脚本逐行解析

配置区

创建备份目录

全量备份(每周日执行)

增量备份(每天执行)

自动删除过期备份

脚本结束

前言

在实际生产环境中,数据库备份是保障数据安全的重要环节。本文总结了基于 RPM 安装的 MySQL 5.7 的全量 + 增量备份方案,结合遇到的问题和解决方法,为大家提供一个完整参考。


一、备份方案概述

  • 全量备份:每周日使用 mysqldump 备份所有数据库到 SQL 文件

  • 增量备份:每天基于 MySQL 二进制日志(binlog) 进行备份

  • 自动清理:保留最近 7 天的备份文件

  • 目录结构

/var/lib/mysql/mysql_backup/
├── full/       # 全量备份目录
└── increment/  # 增量备份目录

二、最终备份脚本

#!/bin/bash
# MySQL 全量+增量备份脚本
​
# 配置区
BACKUP_ROOT=/var/lib/mysql/mysql_backup
FULL_DIR=$BACKUP_ROOT/full
INCR_DIR=$BACKUP_ROOT/increment
MYSQL_USER=root
MYSQL_PASS='123456'
DATE=$(date +%F)
WEEKDAY=$(date +%u)
BINLOG_DIR=/var/lib/mysql
RETENTION_DAYS=7
​
# 创建备份目录
mkdir -p $FULL_DIR
mkdir -p $INCR_DIR
​
# 每周日执行全量备份
if [ "$WEEKDAY" -eq 7 ]; then   echo "[`date`] 开始全量备份..."   FULL_FILE=$FULL_DIR/all_$DATE.sql   mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases --single-transaction --flush-logs > $FULL_FILE   if [ $? -eq 0 ]; then       echo "[`date`] 全量备份完成:$FULL_FILE"   else       echo "[`date`] 全量备份失败!"   fi
fi
​
# 每日增量备份(基于 binlog)
echo "[`date`] 开始增量备份..."
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "FLUSH LOGS;"
# 获取倒数第二个完整 binlog 文件
PREV_BINLOG=$(ls -tr $BINLOG_DIR/mysql-bin.[0-9]* | tail -2 | head -1)
​
if [ -f "$PREV_BINLOG" ]; then   cp $PREV_BINLOG $INCR_DIR/$(basename $PREV_BINLOG).$DATE   if [ $? -eq 0 ]; then       echo "[`date`] 增量备份完成:$INCR_DIR/$(basename $PREV_BINLOG).$DATE"   else       echo "[`date`] 增量备份失败!"   fi
else   echo "[`date`] 没找到可用的 binlog 文件"
fi
​
# 自动删除 7 天前备份
echo "[`date`] 开始清理7天前的备份..."
find $FULL_DIR -type f -mtime +$RETENTION_DAYS -name "*.sql" -exec rm -f {} \;
find $INCR_DIR -type f -mtime +$RETENTION_DAYS -name "mysql-bin.*" -exec rm -f {} \;
echo "[`date`] 清理完成"
​
echo "[`date`] 备份任务完成"

测试截图


三、遇到的问题与解决方案

1. 增量备份只备份了 mysql-bin.index

现象:执行脚本后,增量备份目录中出现了 mysql-bin.index.日期 文件,而不是实际的 binlog 文件(如 mysql-bin.000002)。

原因

  • 原脚本中使用了:

PREV_BINLOG=$(ls -tr $BINLOG_DIR/mysql-bin.* | tail -2 | head -1)
  • mysql-bin.* 会匹配所有文件,包括 .index 文件

  • 如果目录中有 mysql-bin.index,shell 排序可能取到了索引文件,导致备份文件不包含实际事务数据

解决方案

PREV_BINLOG=$(ls -tr $BINLOG_DIR/mysql-bin.[0-9]* | tail -2 | head -1)
  • 使用 mysql-bin.[0-9]* 只匹配数字序号文件

  • 排除索引文件,保证增量备份内容完整


2. 增量备份为空或不完整

现象:新生成的 binlog 文件可能正在写入,直接备份会导致空或未完成事务。

原因

  • 脚本使用 SHOW MASTER STATUS 获取当前 binlog 文件

  • 当前文件可能刚生成,还未写入任何事务

解决方案

  • 备份倒数第二个文件,而不是最新文件:

PREV_BINLOG=$(ls -tr $BINLOG_DIR/mysql-bin.[0-9]* | tail -2 | head -1)
  • 最新文件仍在写入,倒数第二个文件已经完成,可以安全备份


3. 新增 binlog 文件数量增加

现象:每次执行 FLUSH LOGS; 后,binlog 文件会生成新的序号,如 mysql-bin.000002

原因

  • MySQL FLUSH LOGS; 会滚动当前 binlog,生成新的文件

  • 是 MySQL 的标准行为,不是脚本错误

注意

  • 每次增量备份都应复制倒数第二个文件

  • 保证备份完整、不会备份正在写入的文件


4. crontab 日志记录

  • 脚本可以加入定时任务:

0 1 * * * /bin/bash /var/lib/mysql/mysql_backup/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
  • 注意:/var/log/mysql_backup.log 路径不存在时,>> 会自动创建文件,但父目录必须存在


四、总结

  1. 全量备份使用 mysqldump 每周一次

  2. 增量备份基于 binlog,注意只备份已完成的 binlog 文件

  3. 清理机制保证备份目录不无限膨胀

  4. 脚本问题排查要点

  • 增量备份误备份索引文件 → 用数字匹配避免

  • 空增量备份 → 复制倒数第二个文件

  • binlog 文件不断增加 → FLUSH LOGS 导致,正常

日志管理

  • 全量备份使用 .sql 文件

  • 增量备份使用 mysql-bin 文件

  • 自动保留 7 天备份

脚本中常用参数

  • ls -tr:按时间排序文件

  • basename:去掉路径,只取文件名

  • [ -f "$file" ]:判断普通文件是否存在

  • $?:判断上一条命令是否成功

通过这套方案,可以在 MySQL RPM 安装环境下实现 安全、稳定、可自动化的全量 + 增量备份

五、附录

rpm安装mysql步骤

1.下载RPM以及依赖包

# 下载 MySQL 5.7 的 YUM 仓库配置包
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# 安装 repo 配置包
sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm

2.下载MYSQL所需的依赖包

cd /opt
mkdir mysql5720_rpms
#--resolve 自动下载依赖,--destdir 指定保存目录
yumdownloader --resolve --destdir=/opt/mysql5720_rpms mysql-community-server-5.7.20

3.安装RPM包

cd /opt/mysql5720_rpms
yum localinstall -y *.rpm

4.启动mysql

systemctl start mysqld

5.修改初始密码

mysql -uroot -p$(grep "password" /var/log/mysqld.log | awk '{print $NF}') --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123';"

6.修改配置文件

vim /etc/my.cnf
[mysqld]
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
port = 3306
bind-address = 0.0.0.0
default-storage-engine=INNODB
character-set-server=utf8
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
validate_password_policy=LOW    # 降低强度策略(仅检查长度)
validate_password_length=6       # 最小密码长度设为6位
#log-bin=mysql-bin (可选:开启二进制日志)
#binlog_format=MIXED (可选:指定二进制日志的记录格式)
server-id=1
​
systemctl restart mysqld

7.修改密码

mysql -uroot -pAdmin@123 -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';"

8.测试登录

mysql -uroot -p123456

六、脚本参数详解

脚本逐行解析

#!/bin/bash
  • 指定脚本解释器为 bash,保证脚本在 Linux 系统下用 Bash 执行。


配置区

BACKUP_ROOT=/var/lib/mysql/mysql_backup
  • 备份根目录,所有备份文件都存放在这里。

FULL_DIR=$BACKUP_ROOT/full
INCR_DIR=$BACKUP_ROOT/increment
  • 全量备份目录和增量备份目录,便于分类管理备份。

MYSQL_USER=root
MYSQL_PASS='123456'
  • MySQL 登录用户名和密码,用于执行 mysqldumpmysql 命令。

  • 注意:命令行中使用密码会有安全提示,可使用 .my.cnf 文件避免明文密码。

DATE=$(date +%F)
  • 获取当前日期,格式为 YYYY-MM-DD,用于给备份文件命名。

  • 示例:2025-10-01

WEEKDAY=$(date +%u)
  • 获取当前星期几,1 = 星期一,7 = 星期日。用于判断是否执行全量备份。

BINLOG_DIR=/var/lib/mysql
  • MySQL 二进制日志目录(RPM 安装默认 /var/lib/mysql),用于增量备份。

RETENTION_DAYS=7
  • 自动清理多少天前的备份文件,这里设置为 7 天。


创建备份目录

mkdir -p $FULL_DIR
mkdir -p $INCR_DIR
  • -p 参数表示递归创建目录,如果目录已存在不会报错。

  • 保证备份目录存在,避免 cpmysqldump 写入失败。


全量备份(每周日执行)

if [ "$WEEKDAY" -eq 7 ]; then   echo "[`date`] 开始全量备份..."   FULL_FILE=$FULL_DIR/all_$DATE.sql
  • 判断今天是否是星期日,如果是则执行全量备份。

  • 全量备份文件命名为 all_YYYY-MM-DD.sql

mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases --single-transaction --flush-logs > $FULL_FILE
  • mysqldump:MySQL 官方备份工具。

  • 参数解释:

    • -u$MYSQL_USER:登录用户名。

    • -p$MYSQL_PASS:登录密码。

    • --all-databases:备份所有数据库。

    • --single-transaction:对 InnoDB 表启用一致性快照,避免锁表。

    • --flush-logs:备份时刷新日志,生成新的二进制日志文件,便于增量备份。

  • > $FULL_FILE:将输出保存到全量备份文件。

if [ $? -eq 0 ]; then   echo "[`date`] 全量备份完成:$FULL_FILE"
else   echo "[`date`] 全量备份失败!"
fi
  • $? 表示上一条命令执行状态码:

    • 0 表示成功

    • 非 0 表示失败

  • 根据状态输出备份结果。


增量备份(每天执行)

echo "[`date`] 开始增量备份..."
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "FLUSH LOGS;"
  • 每次增量备份前执行 FLUSH LOGS;

    • MySQL 生成一个新的二进制日志文件(如 mysql-bin.000003)。

    • 保证增量备份文件完整。

PREV_BINLOG=$(ls -tr $BINLOG_DIR/mysql-bin.[0-9]* | tail -2 | head -1)
  • 获取最新两个 binlog 文件中倒数第二个(完整的上一个 binlog)。

  • 参数解释:

    • ls -tr

      • -t:按修改时间排序(最新的在前)

      • -r:反转顺序(最旧在前)

    • $BINLOG_DIR/mysql-bin.[0-9]*:匹配所有数字编号的 binlog 文件。

    • tail -2 | head -1:取倒数第二个文件(上一次的 binlog,用于增量备份)。

if [ -f "$PREV_BINLOG" ]; then   cp $PREV_BINLOG $INCR_DIR/$(basename $PREV_BINLOG).$DATE
  • -f:判断文件是否存在且为普通文件。

  • basename $PREV_BINLOG:获取文件名(去掉路径),避免复制时路径问题。

  • cp ... $INCR_DIR/....$DATE:复制 binlog 到增量目录,并加日期后缀。

if [ $? -eq 0 ]; then   echo "[`date`] 增量备份完成:$INCR_DIR/$(basename $PREV_BINLOG).$DATE"
else   echo "[`date`] 增量备份失败!"
fi
  • 判断复制是否成功,输出结果。

else   echo "[`date`] 没找到可用的 binlog 文件"
fi
  • 如果 $PREV_BINLOG 不存在,则输出警告。


自动删除过期备份

echo "[`date`] 开始清理7天前的备份..."
find $FULL_DIR -type f -mtime +$RETENTION_DAYS -name "*.sql" -exec rm -f {} \;
find $INCR_DIR -type f -mtime +$RETENTION_DAYS -name "mysql-bin.*" -exec rm -f {} \;
  • find:查找符合条件的文件并删除。

  • 参数解释:

    • $FULL_DIR / $INCR_DIR:查找路径。

    • -type f:只查找普通文件。

    • -mtime +$RETENTION_DAYS:修改时间超过 $RETENTION_DAYS 天。

    • -name "*.sql" / "mysql-bin.*":匹配文件名。

    • -exec rm -f {} \;:删除匹配文件。

echo "[`date`] 清理完成"
  • 输出清理完成信息。


脚本结束

echo "[`date`] 备份任务完成"
  • 输出最终备份完成的提示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025最新展会搭建公司推荐排行榜:服务商创意定制与全流程服务能力深度解析

会展经济的蓬勃发展让展会搭建成为品牌展示的核心载体,但其行业痛点却日益凸显:多数服务商设计同质化严重,难以匹配品牌个性化表达;施工团队专业度参差不齐,进度延误与安全隐患屡见不鲜;服务链条断裂导致客户需多…

10 3

10.3P2679很容易想到定义状态 \(f_{i,j,k}\) 表示匹配到了 s 的第 \(i\) 个字符,t 的第 \(j\) 个字符用了 \(k\) 个串的方案数 然后你就会发现爆空间了 这时候我们可以使用滚动数组滚动第一维,令 \(f_{i,j,0/1}\) 表…

2025磁选机厂家TOP企业品牌推荐排行榜,立环磁选机,高梯度磁选机,立环高梯度磁选机,油冷立环磁选机公司推荐

在矿产加工与原料提纯行业中,磁选机作为核心分选设备,其品质与适配性直接影响生产效率与产品纯度。当前市场上,设备品牌繁杂、型号混乱,部分厂家存在产品单一、适配性不足等问题,难以满足不同规模企业的产能需求。…

医疗设备厂家不要再盲选了,专业的医疗DMS经销商管理软件来了!

当销售渠道遍地开花,管理却漏洞百出——是时候告别“盲选”,拥抱精准掌控!医疗设备厂家渠道管理中的挑战 在医疗器械行业深耕多年的厂家,你是否正被这些问题困扰:订单混乱效率低:手工处理订单慢、易出错,发货延…

做微商网站制作工作证明模板 范本

一、 could not establish connection to “XXX” 尝试使用Remote-SSH插件连接远程的服务器,但是配置显示出错,端口显示试图写入的管道不存在,弹出窗口显示could not establish connection to “XXX” 二、检查Windows的OpenSSH 1.检索是否…

修改网站空间服务器密码动态h5网站开发

安装情况: 直接安装提示错误!!! 安装程序命令: apt install -y docker.io 安装结果提示安装失败!!!看别人安装直接成功到我这怎么失败!!!找原因…

网站设计 上海医疗 网站前置审批

解决最短路径问题:(如下三种算法)(1)迪杰斯特拉算法(Dijkstra算法)(2)弗洛伊德算法(Floyd算法)(3)SPFA算法第一种算法:Dijkstra算法广度优先搜索解决赋权有向图或者无向图的单源最短路径问题.是一种贪心的策略算法的思路声明一个数组dis来保存源点到各个…

15年做哪个网站致富wordpress看不到图片

目的:将遥感图像进行地理配准、矢量化,并且制作地图。要求:对的遥感图像进行地理配准;矢量化建筑物、绿地、道路、水体等主要地物要素;对各类地物要素进行符号化设置并对其名称进行标注;添加指北针、比例尺…

2025最新编织袋生产厂家推荐排行榜:涵盖牛皮纸、塑料、PP 彩膜等品类,助力企业精准甄选可靠合作伙伴

在工业、农业、食品等领域的生产流转中,编织袋作为关键包装载体,其品质与供应稳定性直接关系到企业成本控制、产品安全及市场口碑。当前市场上编织袋生产厂家数量繁杂,部分厂家存在质量管理缺失、工艺水平落后、供货…

AT_abc266_g [ABC266G] Yet Another RGB Sequence

首先将 \(r, g\) 给捆绑出来,先把 \(g, b, rg\) 这三种东西给排好,方案数容易计算。 然后考虑到目前插板,不能将 \(r\) 插到 \(g\) 前面,空隙数是好计算的,于是简单组合一下就做完了。

2025超市货架厂家 TOP 企业品牌推荐排行榜,云南超市货架,昆明超市货架,西南超市货架推荐这十家公司!

引言在商超零售与专业门店的运营体系中,货架作为核心陈列与存储设备,其品质、设计适配性及服务效率,直接影响终端的空间利用率、顾客购物体验与长期运营成本。当前市场上,超市货架供给方数量众多,但质量参差不齐:…

详细介绍:鸿蒙与iOS跨平台开发方案全解析

详细介绍:鸿蒙与iOS跨平台开发方案全解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

US$58 HU162T Clamp Work on VW SN-CP-JJ-16 Work with SEC-E9 Key Cutting Machine

HU162T Clamp Work on VW SN-CP-JJ-16 Work with SEC-E9 Key Cutting MachineFor Volkswagen Golf 7, Magotan 2018, Lavida 2018, Phaeton etc. also for Audi 2018 new modelsPackage List:1pc* HU162T Clamp for VW…

17zwd一起做网站网站建设需要注意哪些方面

现在的猫咪主人都把自家的小猫当成了心头的宝贝,呵护备至。但宠爱过度有时会导致猫咪形成挑食的坏习惯。小猫挑食不吃猫粮是为什么呢?面对这一问题,我们应该如何解决呢? 今天,我给大家剖析一下小猫挑食不吃猫粮是为什…

完整教程:Linux中安装es

完整教程:Linux中安装es2025-10-03 11:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

深入解析:Visual RM 用智能引擎重塑企业协作新模式!

深入解析:Visual RM 用智能引擎重塑企业协作新模式!pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

学习unigui【36】把数据导航放在Unidbgrid脚中

学习unigui【36】把数据导航放在Unidbgrid脚中UniDBGrid1.WebOptions.Paged := True;UniDBGrid1.PagingBarAuxControl := UniDBNavigator1;

比较好的源码网站天津网站建设业务

借鉴https://blog.csdn.net/aaa333qwe/article/details/79025336 往浏览器里面储存数据 localStorage.setItem(‘todos’, JSON.stringify(value)) 读取 const list JSON.parse(localStorage.getItem(‘todos’)) || []

Windows 11 共享打印机设置

IX. 匿名共享方案(不推荐) 下面是一些匿名共享方案,从网络安全角度考虑强烈不建议使用! FIX: Windows 11 24H2 Cannot Access Network Shares (0x80070035) Allow Anonymous Access to Shared Folder or Printer o…

河南建设银行网站seo外链是什么

1、将dom转换为图片 这里我们使用html2canvas工具插件先将dom转为canvas元素然后canvas拥有一个方法可以将绘制出来的图形转为url然后下载即可注意:如果元素使用了渐变背景并透明的话,生成的图片可能会有点问题。我下面这个案例使用了渐变背景实现元素对…