Docker部署的Mysql数据库自动化备份

文章目录

最终实现目标

1.每天自动创建一个,日期目录,例如20251011

2.同时备份两个数据库

一、前提准备

  1. 已通过SSH登录到你的服务器
  2. 服务器已安装Docker,且MySQL容器正常运行

二、分步创建并配置备份脚本

步骤1:创建脚本存放目录(可选,推荐规范管理)

为了方便查找,先创建专门的目录存放备份脚本和备份文件(也可直接使用已有目录)

bash 复制代码
# 创建脚本存放目录(示例:/home/mysql/scripts,可自定义)
mkdir -p /home/mysql/scripts
# 创建备份根目录(与脚本中配置的BACKUP_ROOT_DIR一致,示例:/home/mysql/backup)
mkdir -p /home/mysql/backup
# 进入脚本存放目录(后续操作在此目录下进行)
cd /home/mysql/scripts
步骤2:创建备份脚本文件

使用 vim 编辑器创建 docker_mysql_backup.sh 脚本文件,命令如下:

bash 复制代码
vim docker_mysql_backup.sh
步骤3:写入脚本内容
  1. 进入vim编辑器后,按 i 键切换到插入模式(此时编辑器左下角会显示「INSERT」)
  2. 复制粘贴之前修改好的完整脚本内容(需提前替换好配置项:容器名、数据库密码、数据库名等)
  3. 粘贴完成后,按 Esc 键退出插入模式,输入 :wq 并按回车键(保存文件并退出vim编辑器)

用docker命令查看自己的mysql容器名跟容器id:

步骤4:给脚本添加执行权限

脚本创建后默认无执行权限,需通过以下命令授权:

bash 复制代码
chmod +x docker_mysql_backup.sh
  • 验证权限:执行 ls -l 命令,若脚本文件名前显示 -rwxr-xr-x,说明执行权限添加成功
步骤5:测试脚本是否可用

直接执行脚本,验证备份功能是否正常(关键步骤,避免定时任务执行失败)

bash 复制代码
# 执行脚本(当前已在脚本目录下,直接执行)
./docker_mysql_backup.sh
  • 成功标识:
    1. 终端输出 db1 备份完成!db2 备份完成!所有数据库备份完成! 提示
    2. 查看备份目录 ls /home/mysql/backup/,能看到当天日期目录(如 20251229),进入该目录可看到两个数据库的 .sql.gz 压缩备份文件
步骤6:设置定时自动备份(crontab)

通过crontab配置每天自动执行脚本,推荐凌晨服务器负载较低时执行

  1. 编辑crontab定时任务配置:

    bash 复制代码
    crontab -e
  2. 首次执行该命令会提示选择编辑器,推荐选择 vim(输入对应数字如 2 并回车即可)

  3. 进入编辑界面后,按 i 键切换插入模式,在文件末尾添加以下内容(替换为你的脚本绝对路径):

    bash 复制代码
    # 每天凌晨2点自动执行Docker MySQL备份脚本(绝对路径必须准确)
    0 2 * * * /home/mysql/scripts/docker_mysql_backup.sh
  4. Esc 键退出插入模式,输入 :wq 回车保存退出

  5. 验证定时任务是否添加成功:

    bash 复制代码
    crontab -l

    若终端显示上述添加的定时任务内容,说明配置成功

三、总结

  1. 核心流程:创建目录 → 新建脚本 → 写入内容 → 添加执行权限 → 测试脚本 → 配置定时任务
  2. 关键注意点:脚本绝对路径必须准确,配置项(容器名、数据库信息)需与实际一致
  3. 验证标准:手动执行脚本能生成备份文件,crontab -l能看到定时任务配置

四、附录(完整备份脚本)

完整备份脚本(docker_mysql_backup.sh

bash 复制代码
#!/bin/bash
# ===================== 配置项(根据你的实际情况修改)=====================
# Docker容器名称(或容器ID,可通过docker ps查询)
CONTAINER_NAME="mysql_container"  # 替换为你的容器名/ID
# 数据库用户名(默认root)
DB_USER="root"
# 数据库密码
DB_PASS="your_mysql_password"     # 替换为你的数据库密码
# 要备份的两个数据库名(用空格分隔,按需添加更多)
DB_NAMES="db1 db2"                # 替换为你的两个数据库名(示例:test_db prod_db)
# 宿主机备份根目录(提前创建,如 /home/mysql/backup)
BACKUP_ROOT_DIR="/home/mysql/backup"
# ======================================================================

# 1. 按当前日期创建子目录(格式:20251011)
DATE_DIR=$(date +%Y%m%d)
# 完整备份目录:根目录/日期目录
BACKUP_HOST_DIR="${BACKUP_ROOT_DIR}/${DATE_DIR}"

# 自动创建完整备份目录(若不存在,-p支持嵌套创建)
mkdir -p ${BACKUP_HOST_DIR}

# 2. 循环备份多个数据库(遍历DB_NAMES中的每个数据库)
for DB_NAME in ${DB_NAMES}
do
    # 备份文件名(含数据库名+时间戳,避免混淆和覆盖)
    BACKUP_FILE="${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql"

    # 核心命令:docker exec 进入容器执行 mysqldump 备份
    docker exec ${CONTAINER_NAME} \
    mysqldump -u${DB_USER} -p${DB_PASS} --databases ${DB_NAME} \
    > ${BACKUP_HOST_DIR}/${BACKUP_FILE}

    # 可选:压缩备份文件(gzip压缩,节省磁盘空间)
    gzip ${BACKUP_HOST_DIR}/${BACKUP_FILE}

    # 输出单个数据库备份完成信息
    echo "${DB_NAME} 备份完成!备份文件路径:${BACKUP_HOST_DIR}/${BACKUP_FILE}.gz"
done

# 可选:自动清理7天前的旧日期目录(避免备份文件过多占用空间)
find ${BACKUP_ROOT_DIR} -type d -name "20[0-9]{6}" -mtime +7 -delete

# 输出整体备份完成信息
echo "所有数据库备份完成!备份根目录:${BACKUP_ROOT_DIR}"
相关推荐
rising start4 小时前
二、全面理解MySQL架构
mysql·架构
星星也在雾里4 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
bqq198610265 小时前
MySQL性能优化
mysql·mysql优化
雨辰AI6 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20246 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有6 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao7 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_748839497 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录7 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能
海市公约8 小时前
MySQL更新语句执行全流程:从Buffer Pool修改到二阶段提交
数据库·mysql·binlog·innodb·undo log·二阶段提交·update执行原理