MySQL数据库自动化备份脚本的实践指南

 更新时间:2026年04月26日 16:12:48   作者:lwx57280  
数据是企业的核心资产,定期备份数据库是每个运维和开发人员的必修课,本文分享一个生产环境验证过的 MySQL 自动备份脚本,支持多数据库备份、自动压缩、过期清理,并详细解读每一处细节,帮助你快速搭建可靠的备份体系,需要的朋友可以参考下

一、脚本概述

该脚本使用 mysqldump 工具,实现以下功能:

  • 备份指定的一个或多个 MySQL 数据库
  • 自动创建日志和备份数据目录
  • 备份文件压缩为 .tar.gz 格式,节省磁盘空间
  • 记录每次备份的开始、成功、失败日志
  • 自动删除 30 天前的旧备份文件

适用场景:Linux 服务器 + MySQL 5.7/8.0,支持非标准端口(如 9200)。

二、快速使用

1. 准备脚本

使用 vim 创建脚本文件(不要用 FTP 工具上传,避免格式问题):

vim /opt/mysql_backup.sh

保存退出。

2. 修改配置

根据你的环境修改以下变量:

USER='your_db_user'          # 数据库用户名
PASSWORD='your_password'     # 数据库密码
HOST='your_db_host'          # 数据库 IP
PORT=3306                    # 端口(默认3306)
dbName='db1 db2 db3'         # 需要备份的数据库,空格分隔

3. 执行备份

sh /opt/mysql_backup.sh

执行后会在脚本所在目录下生成 mysql/ 文件夹:

mysql/
├── data/          # 存放 .tar.gz 压缩备份
└── log/           # 存放备份日志 mysqllog.log

4. 设置定时任务(生产推荐)

crontab -e
# 每天凌晨 2 点执行备份
0 2 * * * /bin/bash /opt/mysql_backup.sh > /dev/null 2>&1

三、脚本逐段解读

1. 环境变量与配置

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH

确保 mysqldump 等命令在 PATH 中。如果使用自定义安装路径(如 /usr/local/mysql-8.0/bin),需要在脚本中指定完整路径。

USER='yxw01'
PASSWORD='yxw@123!'
HOST='192.168.11.36'
PORT=9200
dbName='mate_smart'

生产环境建议将密码存储在单独配置文件中,并设置 600 权限,避免硬编码泄漏。

2. 动态路径与日志

backtime=`date +%Y%m%d%H%M%S`           # 备份时间戳,如 20250423140230
logpath=$(pwd)/mysql/log
datapath=$(pwd)/mysql/data

3. 自动创建目录

if [ ! -d ${logpath} ];then
    mkdir -pv ${logpath}
fi

-p 自动创建父目录,-v 输出创建信息。

4. 核心备份命令

/usr/local/mysql-8.0/bin/mysqldump --skip-lock-tables -u ${USER} -h ${HOST} -P${PORT} -p${PASSWORD} ${table} > ${datapath}/${backtime}-${table}.sql

参数解释:

  • --skip-lock-tables:备份时不锁表(对 InnoDB 表有效,MyISAM 仍可能锁)。避免阻塞业务写入。
  • -P${PORT}:大写 P 指定端口,小写 p 是密码。
  • 重定向 > 将 SQL 输出到文件。

注意:如果 MySQL 安装在非标准路径,需要指定 mysqldump 的完整路径,否则会报 command not found

5. 压缩与清理原始文件

tar zcvf ${backtime}-${table}.tar.gz ${backtime}-${table}.sql > /dev/null
rm -f ${datapath}/${backtime}-${table}.sql

压缩后删除原始 SQL 文件,只保留压缩包。> /dev/null 隐藏压缩过程输出

6. 日志记录与错误处理

if [ "$?" == 0 ];then
    echo "备份成功" >> ${logpath}/mysqllog.log
else
    echo "备份失败" >> ${logpath}/mysqllog.log
fi

$? 获取上一条命令的退出码,0 表示成功。

7. 过期备份清理

find $datapath -name "*.tar.gz" -type f -print -mtime +30 -exec rm -rf {} ;
  • -mtime +30:修改时间超过 30 天的文件
  • -exec rm -rf {} ;:执行删除操作

可根据磁盘容量调整保留天数(如 +7 保留一周)。

四、注意事项与生产优化

重要提醒

  1. 不要在业务高峰期备份:虽然使用了 --skip-lock-tables,但 mysqldump 仍可能增加数据库 I/O 负载。建议在凌晨执行。
  2. 脚本格式问题:务必在 Linux 服务器上用 vim 或 nano 创建脚本,不要用 Windows 记事本编辑后上传,否则会遇到 \r 导致的 command not found 错误。
  3. 密码安全:生产环境建议使用 ~/.my.cnf 配置文件存放密码,脚本中只指定 --defaults-extra-file
  4. 备份文件验证:定期尝试恢复备份到测试环境,确保备份可用。
  5. 异地存储:压缩后的备份文件应同步到异地(如 OSS、S3、NFS),防止服务器故障导致数据全丢。

优化建议

① 使用~/.my.cnf避免明文密码

# 创建 /root/.my.cnf
[client]
user=yxw01
password='yxw@123!'
host=192.168.11.36
port=9200
chmod 600 /root/.my.cnf

脚本中改为:

mysqldump --defaults-extra-file=/root/.my.cnf ${table} > ...

② 单数据库多线程备份(可选)

对于超大数据库,可使用 mydumper 或 并行 mysqldump,但脚本复杂度增加。

③ 备份失败告警

添加邮件或钉钉告警:

if [ "$?" != 0 ]; then
    echo "备份失败" | mail -s "DB Backup Failed" admin@example.com
fi

④ 保留策略优化

除按天数删除外,可保留每周一次的全量备份(例如 find ... ! -name "*Monday*" -mtime +7)。

五、脚本完整版(生产级改进)

#!/bin/bash
# 生产级 MySQL 备份脚本
# 支持多库、压缩、过期清理、免密登录
set -e  # 遇错停止(可选)
BACKUP_BASE="/data/backup/mysql"
LOG_PATH="${BACKUP_BASE}/log"
DATA_PATH="${BACKUP_BASE}/data"
RETENTION_DAYS=30
# 使用 .my.cnf 存储凭证
MYSQL_OPTS="--defaults-extra-file=/root/.my.cnf --skip-lock-tables"
# 需要备份的数据库列表
DATABASES="db1 db2 db3"
# 创建目录
mkdir -p ${LOG_PATH} ${DATA_PATH}
# 备份时间戳
TIMESTAMP=$(date +%Y%m%d%H%M%S)
# 记录日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a ${LOG_PATH}/backup.log
}
log "========== 开始备份 =========="
for DB in ${DATABASES}; do
    BACKUP_FILE="${DATA_PATH}/${TIMESTAMP}-${DB}.sql"
    COMPRESSED_FILE="${BACKUP_FILE}.tar.gz"
    log "正在备份数据库: ${DB}"
    mysqldump ${MYSQL_OPTS} ${DB} > ${BACKUP_FILE}
    if [ $? -eq 0 ]; then
        tar czf ${COMPRESSED_FILE} -C ${DATA_PATH} $(basename ${BACKUP_FILE})
        rm -f ${BACKUP_FILE}
        log "备份成功: ${COMPRESSED_FILE}"
    else
        log "备份失败: ${DB}"
        # 可选:发送告警
    fi
done
# 清理过期备份
find ${DATA_PATH} -name "*.tar.gz" -type f -mtime +${RETENTION_DAYS} -delete
log "已清理超过 ${RETENTION_DAYS} 天的旧备份"
log "========== 备份完成 =========="

六、总结

本文提供的备份脚本简单可靠,已在生产环境运行多年。核心要点:

  • 使用 mysqldump + tar 实现备份与压缩
  • 通过 find 自动清理过期文件
  • 完整的日志记录便于追溯
  • 结合 crontab 实现无人值守

最后提醒:定期测试恢复 比备份本身更重要。建议每季度从备份文件中恢复一次数据,验证备份有效性。

以上就是MySQL数据库自动化备份脚本的实践指南的详细内容,更多关于MySQL自动化备份脚本的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL入门(五) MySQL中的索引详讲

    MySQL入门(五) MySQL中的索引详讲

    之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了
    2018-07-07
  • mysql数据自增ID为2的解决方案

    mysql数据自增ID为2的解决方案

    这篇文章主要介绍了mysql数据自增ID为2的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • mysql数据存储过程参数实例详解

    mysql数据存储过程参数实例详解

    这篇文章主要介绍了mysql数据存储过程参数实例详解,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • MySQL中的启动和关闭命令

    MySQL中的启动和关闭命令

    这篇文章主要介绍了MySQL中的启动和关闭命令,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 保障MySQL数据安全的一些建议

    保障MySQL数据安全的一些建议

    这篇文章主要介绍了MySQL数据安全的一些建议,帮助大家平时更好的运维数据库,保障数据安全,感兴趣的朋友可以了解下
    2020-08-08
  • MYSQL比对版本号字符串的方法实例

    MYSQL比对版本号字符串的方法实例

    因为mysql的版本较多,所以最近也踩了一个因为版本号字符串的坑,下面这篇文章主要给大家介绍了关于MYSQL比对版本号字符串的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • MYSQL的索引使用注意小结

    MYSQL的索引使用注意小结

    这篇文章主要介绍了MYSQL的索引使用注意,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • mysql 编码设置命令

    mysql 编码设置命令

    mysql 编码设置命令,需要的朋友可以参考下。
    2009-10-10
  • MySQL数据库社招必考题:索引如何优化WHERE子句?

    MySQL数据库社招必考题:索引如何优化WHERE子句?

    本文系统分享WHERE子句优化方法,从定位低效SQL、分析原因到逐步改进,涵盖索引、写法调整及数据访问优化,通过实战案例说明常见错误及解决策略,强调优化需逻辑而非仅建索引,助力面试准备
    2025-09-09
  • 通过MySQL日志实时查看执行语句以及更新日志的教程

    通过MySQL日志实时查看执行语句以及更新日志的教程

    这篇文章主要介绍了通过MySQL日志实时查看执行语句以及更新日志的教程,文中所讲的方法使用到了mysqladmin命令,需要的朋友可以参考下
    2015-12-12

最新评论