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}"
相关推荐
爬山算法2 小时前
MongoDB(11)MongoDB的默认端口号是多少?
数据库·mongodb
betazhou2 小时前
Mongodb日志类型以及日志轮转
数据库·mongodb
一次旅行2 小时前
接口自动化测试模板
数据库·python·pytest
l1t2 小时前
利用Docker安装PostgreSQL 19 dev版
docker·postgresql·容器
想睡hhh2 小时前
redis的高效工作方式
数据库·redis·缓存
、BeYourself2 小时前
PostgreSQL 安装中文全文检索插件zhparser扩展
数据库·postgresql·全文检索
予枫的编程笔记2 小时前
【Docker进阶篇】从入门到精通:Java应用Docker打包,最佳实践与多阶段构建详解
java·docker·容器化·dockerfile·多阶段构建·docker最佳实践·java镜像优化
dishugj2 小时前
【Oracle】Oracle rac1 节点ora.chad offline解决方案
数据库·oracle
木子02042 小时前
oracle里面inner join 和left join 的区别
数据库·oracle