MySQL+Redis实战教程:从Docker安装部署到自动化备份与数据恢复20250418

MySQL+Redis实战教程:从Docker安装部署到自动化备份与数据恢复


一、前言

在企业应用中,对MySQL和Redis运维的要求越来越高:

  • 不能仅是启动就算部署
  • 运行稳定、隔离、访问控制、备份恢复、安全可靠,才是 企业级的基本功能

本文将手把手教你打造一套 可备份、可恢复、可产用的MySQL+Redis基础设备 ,基于Docker实现全路径开发。


二、项目目录结构

我们完整的Docker部署目录结构如下:

bash 复制代码
/opt/docker/
├── mysql_redis_deploy/           # 实际部署代码目录
│   ├── .env                      # 环境变量
│   ├── docker-compose.yml        # docker组合启动文件
│   ├── service_*.sh              # 系列启动、停止、重启、状态脚本
│   ├── backup_mysql.sh           # MySQL备份脚本 (多数据库、自动清理)
│   ├── redis_backup.sh           # Redis备份脚本 (选用)
│   ├── health_check.sh           # 异常自动重启
│   ├── readme.md                 # 项目内部文档
├── backups/                      # 数据备份文件夹
│   ├── mysql/                    # MySQL备份 .sql.gz
│   ├── redis/                    # Redis备份
├── config/
│   ├── mysql/                    # MySQL配置文件 + data挂载目录
│   ├── redis/                    # Redis配置文件 + data
├── iso/
│   ├── mysql_8.0.tar              # 离线Docker镜像
│   ├── redis_7.2-alpine.tar      # 离线Docker镜像

三、关键文件详解

1. .env

env 复制代码
# MySQL配置
MYSQL_ROOT_PASSWORD=StrongRootPwd123!
MYSQL_DATABASE=yufudb
MYSQL_USER=mysqluser
MYSQL_PASSWORD=StrongUserPwd123!

# Redis配置
REDIS_PASSWORD=StrongRedisPwd123!

2. docker-compose.yml

采用环境变量模式配置,且配置了healthcheck:

yaml 复制代码
services:
  mysql:
    image: mysql:8.0
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_INITDB_ARGS: "--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci"
    ports:
      - "3306:3306"
    volumes:
      - /opt/docker/config/mysql/data:/var/lib/mysql
      - /opt/docker/config/mysql/conf:/etc/mysql/conf.d
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 20s
      retries: 3
      start_period: 30s
      timeout: 10s

  redis:
    image: redis:7.2-alpine
    container_name: redis_container
    command: ["redis-server", "/etc/redis/redis.conf", "--requirepass", "${REDIS_PASSWORD}"]
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
      - /opt/docker/backups/redis:/backups/redis
      - /opt/docker/config/redis/redis.conf:/etc/redis/redis.conf
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 30s
      retries: 3
      start_period: 10s
      timeout: 5s

四、MySQL数据库备份脚本 (multi-db + 自动清理 + 日志)

bash 复制代码
#!/bin/bash
BACKUP_DIR="/opt/docker/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
CONTAINER_NAME="mysql_container"
MYSQL_USER="root"
MYSQL_PASSWORD="StrongRootPwd123!"
KEEP_DAYS=30
DATABASES=("yufudb" "testdb" "analyticsdb")
LOG_FILE="${BACKUP_DIR}/backup_${DATE}.log"

mkdir -p "$BACKUP_DIR"
echo "[${DATE}] Start backup..." | tee -a "$LOG_FILE"

for DB in "${DATABASES[@]}"; do
  docker exec $CONTAINER_NAME /usr/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD $DB > "$BACKUP_DIR/${DB}_$DATE.sql"
  gzip "$BACKUP_DIR/${DB}_$DATE.sql"
  echo "[$DB] Done: ${DB}_$DATE.sql.gz" | tee -a "$LOG_FILE"
done

find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +$KEEP_DAYS -exec rm {} \;
echo "[$DATE] Cleaned expired backups." | tee -a "$LOG_FILE"

配合crontab

bash 复制代码
0 2 * * * bash /opt/docker/mysql_redis_deploy/backup_mysql.sh >> /opt/docker/backups/mysql/backup_$(date +\%Y\%m\%d).log 2>&1

五、MySQL数据恢复一行命令

bash 复制代码
gunzip /opt/docker/backups/mysql/yufudb_20240418_020000.sql.gz
docker exec -i mysql_container mysql -uroot -p'StrongRootPwd123!' yufudb < /opt/docker/backups/mysql/yufudb_20240418_020000.sql

建议恢复前确保目标数据库为空


六、遗忘密码处理方案

bash 复制代码
docker run --name mysql_reset_tmp \
  -v /opt/docker/config/mysql/data:/var/lib/mysql \
  -v /opt/docker/config/mysql/conf:/etc/mysql/conf.d \
  -p 3307:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
  -d mysql:8.0 --skip-grant-tables

docker exec -it mysql_reset_tmp bash
mysql -uroot

进入MySQL后:

sql 复制代码
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongRootPwd123!';
ALTER USER 'root'@'%' IDENTIFIED BY 'StrongRootPwd123!';
ALTER USER 'mysqluser'@'%' IDENTIFIED BY 'StrongUserPwd123!';
FLUSH PRIVILEGES;

退出,删除并重启正常安全式MySQL容器


七、健康状态自动检查 + 重启

bash 复制代码
#!/bin/bash
check_container_health() {
  container_name=$1
  health_status=$(docker inspect --format='{{.State.Health.Status}}' ${container_name} 2>/dev/null)
  if [ "$health_status" != "healthy" ]; then
    echo "[$(date +"%F %T")] $container_name unhealthy! Restarting..."
    docker restart $container_name
  else
    echo "[$(date +"%F %T")] $container_name healthy."
  fi
}

check_container_health mysql_container
check_container_health redis_container

配合crontab每小时检查一次

bash 复制代码
0 * * * * bash /opt/docker/mysql_redis_deploy/health_check.sh >> /opt/docker/logs/health_check.log 2>&1

八、总结与实践

该项目展示了如何从零构建一套符合企业级要求的可备份、可恢复、可稳定运行的MySQL+Redis服务体系,覆盖了部署、备份、恢复、密码管理与健康维护的完整链路。

持续完善,可扩展:如一键数据库恢复脚本、灾备切换脚本等。


相关推荐
CodexDave16 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
爬也要爬着前进18 小时前
redis主从搭建
数据库·redis·缓存
王琦031819 小时前
生产环境中使用通用二进制包安装
mysql
BullSmall19 小时前
Anolis OS 8.10 完整安装 Docker CE(生产可用,解决 podman 冲突)
docker·容器·podman
用户0953675158321 小时前
在系统的学习 redis 前的疑惑
redis·go
蓝田~21 小时前
MySQL慢查询怎么优化?B+Tree索引原理+MVCC读不阻塞写+EXPLAIN执行计划,从5秒到0.05秒
数据库·mysql
Herbert_hwt1 天前
MySQL学习前言:关于MySQL的历史与当下学习的必要性
mysql
梦梦代码精1 天前
开源AI应用平台BuildingAI解析:插件化架构、应用市场与热门案例
人工智能·机器学习·docker·开源
时间的拾荒人1 天前
MySQL 视图详解
android·数据库·mysql
吴声子夜歌1 天前
Redis 3.x——集群故障转移
java·数据库·redis·集群