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}"
相关推荐
小超同学你好5 分钟前
OpenClaw 深度解析与源代码导读 · 第7篇:Memory 子系统——持久化、内置记忆与「人格文件」分界
数据库
2301_775148155 分钟前
如何管理RAC归档日志_共享存储中的FRA配置与双节点访问
jvm·数据库·python
RoboWizard8 分钟前
移动固态硬盘的耐用性如何,怎么判断使用寿命?
服务器·数据库·负载均衡
qq_3300379913 分钟前
php怎么实现接口请求日志记录_php如何自动记录入参出参与耗时
jvm·数据库·python
2401_8653825015 分钟前
各省政务信息化项目验收材料清单汇总及差异分析
java·开发语言·数据库
pele20 分钟前
如何用 contextmenu 事件自定义鼠标右键菜单的显示逻辑
jvm·数据库·python
2301_7735536221 分钟前
怎样禁用phpMyAdmin的控制台历史记录_防凭证与查询留存
jvm·数据库·python
m0_7436239223 分钟前
Go语言怎么实现生产者消费者_Go语言生产者消费者模式教程【精通】
jvm·数据库·python
baidu_3409988224 分钟前
CSS Grid布局如何为特定项目指定位置_使用grid-row和grid-column
jvm·数据库·python
weixin_4585801236 分钟前
如何用 blur 与 focusout 区分不冒泡与冒泡的失焦事件
jvm·数据库·python