本文共 2694 字,大约阅读时间需要 8 分钟。
在实际操作中,MySQL 数据库的备份与恢复是至关重要的操作。通过合理设计备份策略,可以有效避免数据丢失风险。本文将详细介绍如何利用 Shell 脚本实现 MySQL 的全量备份与增量备份,并结合 crontab 进行自动化调度。
全量备份的主要目的是对数据库进行一次完整的数据备份,通常在数据库较为空的时间段进行。以下是一个典型的全量备份脚本示例:
#!/bin/bash# 脚本名称脚本名: DBFullyBak.sh# 脚本用途用 mysqldump 实现全量备份,将所有数据库的数据备份到指定目录,并记录操作日志。# 脚本路径备份目录: /home/mysql/backup日志文件: /home/mysql/backup/bak.log# 获取当前日期日期: $(date +%Y%m%d)# 开始时间与结束时间开始时间: $(date +"%Y年%m月%d日 %H:%M:%S")结束时间: $(date +"%Y年%m月%d日 %H:%M:%S")# 进入备份目录cd $备份目录# 生成备份文件备份文件名: $日期.sql压缩文件名: $日期.sql.tgz# 执行 mysqldump 命令mysqldump -uroot -p123456 --quick --all-databases --flush-logs --delete-master-logs --single-transaction > $备份文件名# 压缩备份文件tar czvf $压缩文件名 $备份文件名# 删除临时文件rm -f $备份文件名# 记录日志echo "开始:$开始时间 结束:$结束时间 $压缩文件名 成功!" >> $日志文件# 清理临时目录cd $备份目录/dailyrm -f *
mysqldump:用于生成完整的数据库备份。
-uroot
:以数据库 root 用户执行备份。-p123456
:指定数据库密码。--quick
:减少输出信息,提高备份效率。--all-databases
:备份所有数据库。--flush-logs
:在备份完成后刷新日志文件。--delete-master-logs
:删除旧的主日志文件。--single-transaction
:确保备份在单个事务中完成,避免数据不一致。压缩与清理:将生成的 SQL 文件压缩为 .tgz
格式,并删除原文件以节省空间。
日志记录:通过 bak.log
文件记录备份操作的时间和结果,便于追踪和验证。
增量备份的核心思想是基于前一次备份的基础上,仅复制自上次备份以后的数据变化。以下是一个增量备份脚本的示例:
#!/bin/bash# 脚本名称脚本名: DBDailyBak.sh# 脚本用途实现每日对 MySQL 数据库的增量备份。# 脚本路径备份目录: /home/mysql/backup/daily数据目录: /home/mysql/data日志文件: /home/mysql/backup/bak.log# 获取当前日期日期: $(date +%Y%m%d)# 获取当前 binlog 文件数量binlog 文件名: mysql-bin.index当前 binlog 数量: $(wc -l $binlog 文件名 | awk '{print $1}')# 执行增量备份for 文件 in $(cat $binlog 文件名):{ base=$(basename $文件) NextNum=$当前 binlog 数量 + 1 if [ $NextNum -eq $当前 binlog 数量 ] { echo "$base skip!" >> $日志文件 } else { 目标路径=$备份目录/$base if [ -e $目标路径 ] { echo "$base exist!" >> $日志文件 } else { cp $数据目录/$base $目标路径 echo "$base copying!" >> $日志文件 } }}# 记录日志echo "开始:$(date +"%Y年%m月%d日 %H:%M:%S") $NextNum Bakup success!" >> $日志文件
获取 binlog 文件数量:通过 mysqladmin flush-logs
命令生成新的 binlog 文件。
遍历 binlog 文件:通过 cat
读取当前 binlog 文件列表,逐一处理。
判断文件状态:
日志记录:记录每个 binlog 文件的状态变化(如 skip!
、exist!
或 copying!
)。
为了实现自动化备份,我们可以使用 crontab
定期调度备份脚本的执行。
# 每周日凌晨3:00执行全量备份0 3 * * 0 /root/DBFullyBak.sh > /dev/null 2>&1# 每周一至周六凌晨3:00执行增量备份0 3 * * 1-6 /root/DBDailyBak.sh > /dev/null 2>&1
全量备份:每周日凌晨3:00运行 DBFullyBak.sh
脚本,生成全量备份文件。
增量备份:工作日(周一至周六)凌晨3:00运行 DBDailyBak.sh
脚本,进行增量备份。
为了确保脚本的语法正确,可以使用以下命令检测脚本:
sh -n /root/DBFullyBak.shsh -n /root/DBDailyBak.sh
通过此命令可以在屏幕上模拟脚本执行过程,检查是否存在语法错误或其他问题。
通过以上方案,可以实现 MySQL 数据库的全量备份与增量备份,结合 crontab 自动化调度,确保数据安全与高效恢复。
转载地址:http://wjrfk.baihongyu.com/