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}"
相关推荐
Cloud云卷云舒9 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手10 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学10 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh12 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
生活爱好者!12 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
用户713335851562412 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD13 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo13 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
MC皮蛋侠客13 小时前
uv 系列(七):CI/CD、Docker 与私有索引——生产级交付
python·ci/cd·docker·uv