文章目录
最终实现目标
1.每天自动创建一个,日期目录,例如20251011
2.同时备份两个数据库


一、前提准备
- 已通过SSH登录到你的服务器
- 服务器已安装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:写入脚本内容
- 进入vim编辑器后,按
i键切换到插入模式(此时编辑器左下角会显示「INSERT」) - 复制粘贴之前修改好的完整脚本内容(需提前替换好配置项:容器名、数据库密码、数据库名等)
- 粘贴完成后,按
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
- 成功标识:
- 终端输出
db1 备份完成!、db2 备份完成!、所有数据库备份完成!提示 - 查看备份目录
ls /home/mysql/backup/,能看到当天日期目录(如20251229),进入该目录可看到两个数据库的.sql.gz压缩备份文件
- 终端输出
步骤6:设置定时自动备份(crontab)
通过crontab配置每天自动执行脚本,推荐凌晨服务器负载较低时执行
-
编辑crontab定时任务配置:
bashcrontab -e -
首次执行该命令会提示选择编辑器,推荐选择
vim(输入对应数字如2并回车即可) -
进入编辑界面后,按
i键切换插入模式,在文件末尾添加以下内容(替换为你的脚本绝对路径):bash# 每天凌晨2点自动执行Docker MySQL备份脚本(绝对路径必须准确) 0 2 * * * /home/mysql/scripts/docker_mysql_backup.sh -
按
Esc键退出插入模式,输入:wq回车保存退出 -
验证定时任务是否添加成功:
bashcrontab -l若终端显示上述添加的定时任务内容,说明配置成功
三、总结
- 核心流程:创建目录 → 新建脚本 → 写入内容 → 添加执行权限 → 测试脚本 → 配置定时任务
- 关键注意点:脚本绝对路径必须准确,配置项(容器名、数据库信息)需与实际一致
- 验证标准:手动执行脚本能生成备份文件,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}"