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}"
相关推荐
Sheffield14 小时前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
随风飘的云14 小时前
MySQL的慢查询优化解决思路
数据库
IvorySQL18 小时前
PostgreSQL 技术日报 (3月7日)|生态更新与内核性能讨论
数据库·postgresql·开源
赵渝强老师19 小时前
【赵渝强老师】金仓数据库的数据文件
数据库·国产数据库·kingbase·金仓数据库
Sheffield1 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
随逸1771 天前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
神秘的猪头1 天前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm
马艳泽1 天前
win10下运行Start Broker and Proxy报错解决
docker
0xDevNull2 天前
MySQL索引进阶用法
后端·mysql
0xDevNull2 天前
MySQL索引用法
mysql