MySQL+Redis實戰教程:從Docker安裝部署到自動化備份與數據恢復
一、前言
在企業應用中,對MySQL和Redis運維的要求越來越高:
- 不能僅是啟動就算部署
- 運行穩定、隔離、訪問控制、備份恢復、安全可靠,才是 企業級的基本功能
本文將手把手教你打造一套 可備份、可恢復、可產用的MySQL+Redis基礎設備 ,基于Docker實現全路徑開發。
二、項目目錄結構
我們完整的Docker部署目錄結構如下:
/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
# MySQL配置
MYSQL_ROOT_PASSWORD=StrongRootPwd123!
MYSQL_DATABASE=yufudb
MYSQL_USER=mysqluser
MYSQL_PASSWORD=StrongUserPwd123!# Redis配置
REDIS_PASSWORD=StrongRedisPwd123!
2. docker-compose.yml
采用環境變量模式配置,且配置了healthcheck:
services:mysql:image: mysql:8.0container_name: mysql_containerenvironment: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.dhealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p${MYSQL_ROOT_PASSWORD}"]interval: 20sretries: 3start_period: 30stimeout: 10sredis:image: redis:7.2-alpinecontainer_name: redis_containercommand: ["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.confhealthcheck:test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]interval: 30sretries: 3start_period: 10stimeout: 5s
四、MySQL數據庫備份腳本 (multi-db + 自動清理 + 日志)
#!/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[@]}"; dodocker 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"
donefind "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +$KEEP_DAYS -exec rm {} \;
echo "[$DATE] Cleaned expired backups." | tee -a "$LOG_FILE"
配合crontab
0 2 * * * bash /opt/docker/mysql_redis_deploy/backup_mysql.sh >> /opt/docker/backups/mysql/backup_$(date +\%Y\%m\%d).log 2>&1
五、MySQL數據恢復一行命令
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
建議恢復前確保目標數據庫為空
六、遺忘密碼處理方案
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-tablesdocker exec -it mysql_reset_tmp bash
mysql -uroot
進入MySQL后:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongRootPwd123!';
ALTER USER 'root'@'%' IDENTIFIED BY 'StrongRootPwd123!';
ALTER USER 'mysqluser'@'%' IDENTIFIED BY 'StrongUserPwd123!';
FLUSH PRIVILEGES;
退出,刪除并重啟正常安全式MySQL容器
七、健康狀態自動檢查 + 重啟
#!/bin/bash
check_container_health() {container_name=$1health_status=$(docker inspect --format='{{.State.Health.Status}}' ${container_name} 2>/dev/null)if [ "$health_status" != "healthy" ]; thenecho "[$(date +"%F %T")] $container_name unhealthy! Restarting..."docker restart $container_nameelseecho "[$(date +"%F %T")] $container_name healthy."fi
}check_container_health mysql_container
check_container_health redis_container
配合crontab每小時檢查一次
0 * * * * bash /opt/docker/mysql_redis_deploy/health_check.sh >> /opt/docker/logs/health_check.log 2>&1
八、總結與實踐
該項目展示了如何從零構建一套符合企業級要求的可備份、可恢復、可穩定運行的MySQL+Redis服務體系,覆蓋了部署、備份、恢復、密碼管理與健康維護的完整鏈路。
持續完善,可擴展:如一鍵數據庫恢復腳本、災備切換腳本等。