详情

首页手游攻略 MySQL数据库自动化备份脚本的实践指南实用指南

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

佚名 2026-08-28 09:00:02

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“MySQL数据库自动化备份脚本的实践指南”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 一、脚本概述
  • 二、更快采用
    • 1. 准备脚本
    • 2. 修改设置
    • 3. 执行备份
    • 4. 设置定时任务(生产建议)
  • 三、脚本逐段解读
    • 1. 环境变量与设置
    • 2. 动态路径与日志
    • 3. 自动新建目录
    • 4. 核心备份命令
    • 5. 压缩与清理原始文件
    • 6. 日志记录与错误处理
    • 7. 过期备份清理
  • 四、注意事项与生产优化
    • 重要提醒
    • 优化建议
      • 采用~/.my.cnf避免明文密码
      • 单数据库多线程备份(可选)
      • 备份失败告警
      • 保留策略优化
  • 五、脚本完整版(生产级改进)
    • 六、总结

      一、脚本概述

      该脚本采用 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 服务器上用 vimnano 新建脚本,不要用 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" [email protected]
      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 workbench 数据库备份的实现步骤
      • MySQL备份还原导入导出脚本的方法详解
      • 2026年新手版MySQL数据库备份与恢复的完整指南
      • MySQL数据库备份的四种常用方式与选型指南
      • Docker部署MySQL 多库自动备份的方法(结构+数据完整,适配CentOS)

      相关资讯
      点击查看更多
      游戏推荐
      推荐专题
      热门阅读
      推荐下载