MySQL+Redis實戰教程:從Docker安裝部署到自動化備份與數據恢復20250418

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服務體系,覆蓋了部署、備份、恢復、密碼管理與健康維護的完整鏈路。

持續完善,可擴展:如一鍵數據庫恢復腳本、災備切換腳本等。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77415.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統編程之守護進程與調試技術

在Linux系統編程中&#xff0c;守護進程&#xff08;Daemon&#xff09;是非常重要的一種概念。它允許程序在后臺運行&#xff0c;不受用戶交互的影響&#xff0c;并且可以持續長時間地運行。通過了解如何創建和管理守護進程&#xff0c;我們能夠開發出更加穩定、高效的系統應用…

Linux中的管道

管道的概念 管道是一種進程間通信的方式。 管道是一種半雙工通信機制&#xff0c;數據只能讀或寫&#xff0c;如果要讀寫同時進行就要創建兩個管道 管道的類型 1、匿名管道PIPE&#xff1a;通常在親緣進程中使用&#xff08;兄弟、父子&#xff09; 函數參考&#xff1a;匿名管…

深度學習2.4 微積分

2.4.1 導數和微分 2.4.2 偏導數 ![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/17227e00adb14472902baba4da675aed.png 2.4.3 梯度 具體證明&#xff0c;矩陣-向量積

《軟件設計師》復習筆記(11.3)——需求獲取、分析、定義、驗證、管理

目錄 一、軟件需求概述 真題示例&#xff1a; 二、質量功能部署&#xff08;QFD&#xff09; 三、需求開發流程 需求獲取 需求分析 需求定義&#xff08;SRS&#xff09; 需求驗證 真題示例&#xff1a; 四、需求管理 真題示例&#xff1a; 一、軟件需求概述 軟件…

Spring Boot 依賴注入與Bean管理:JavaConfig如何取代XML?

大家好呀&#xff01;今天我們來聊一個超級實用的技術話題 —— Spring Boot 中的依賴注入和Bean管理&#xff0c;特別是JavaConfig是如何一步步取代XML配置的。我知道很多小伙伴一聽到"依賴注入"、"Bean管理"這些詞就頭大&#xff0c;別擔心&#xff01;我…

全志H5,NanopiKP1lus移植QT5.12記錄

移植步驟 機器環境下載QT5.12.0源碼安裝交叉編譯器修改qmake.conf文件配置編譯選項qt5的configure選項說明基本配置選項編譯器和鏈接器選項功能模塊配置第三方庫集成注意事項 配置過程報錯解決配置完成編譯過程報錯解決編譯完成將arm-qt文件夾傳送到開發板配置板子環境變量運行…

STM32單片機C語言

1、stdint.h簡介 stdint.h 是從 C99 中引進的一個標準 C 庫的文件 路徑&#xff1a;D:\MDK5.34\ARM\ARMCC\include 大家都統一使用一樣的標準&#xff0c;這樣方便移植 配置MDK支持C99 位操作 如何給寄存器某個值賦值 舉個例子&#xff1a;uint32_t temp 0; 宏定義 帶參…

【專題刷題】雙指針(四):最接近的三數之和,接雨水

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代碼&#xff1b;&#xff08;2&#xff09;優質解法 優質代碼&#xff1b;&#xff…

chili3d調試筆記3 加入c++ 大模型對話方法 cmakelists精讀

加入 #include <emscripten/bind.h> #include <emscripten/val.h> #include <nlohmann/json.hpp> 怎么加包 函數直接用emscripten::function&#xff0c;如&#xff1a; emscripten::function("send_to_llm", &send_to_llm); set (CMAKE_C…

[Redis]1-高效的數據結構P2-Set

按照慣例&#xff0c;先丟一個官網文檔鏈接。 上篇我們已經了解了高效的數據結構P1-String與Hash。 這篇&#xff0c;我們繼續來了解Redis的 Set 與 Sorted set。 目錄 有序集合 Sorted set底層實現 集合 Set總結資料引用 有序集合 Sorted set Redis 有序集合是一組唯一的字符…

Python + Playwright:使用正則表達式增強自動化測試

Python + Playwright:使用正則表達式增強自動化測試 前言一、 為什么選擇正則表達式?二、 Playwright 中集成正則表達式:途徑與方法三、 實戰應用:正則表達式解決典型測試難題場景 1:定位 ID 或 Class 包含動態部分的元素場景 2:驗證包含可變數字或文本的提示信息場景 3:…

VASP 6.4.1 Ubuntu系統編譯安裝手冊

VASP 6.4.1 Ubuntu系統編譯安裝手冊 &#xff08;基于Ubuntu 22.04 LTS&#xff0c;適用x86_64架構&#xff09; 文章目錄 VASP 6.4.1 Ubuntu系統編譯安裝手冊第一章 系統環境深度配置1.1 硬件兼容性驗證1.2 操作系統環境準備1.3 數學庫深度優化配置 第二章 編譯環境深度調優2…

uniapp h5接入地圖選點組件

uniapp h5接入地圖選點組件 1、申請騰訊地圖key2、代碼接入2.1入口頁面 &#xff08;pages/map/map&#xff09;templatescript 2.2選點頁面&#xff08;pages/map/mapselect/mapselect&#xff09;templatescript 該內容只針對uniapp 打包h5接入地圖選點組件做詳細說明&#x…

java輸出、輸入語句

先創建一個用于測試的java 編寫程序 #java.util使java標準庫的一個包&#xff0c;這里拉取Scanner類 import java.util.Scanner;public class VariableTest {public static void main(String[] args) {#創建一個 Scanner 對象Scanner scanner new Scanner(System.in);System.…

AI Agents系列之構建多智能體系統

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…

04.Spring 框架注解體系詳解

Spring 框架注解體系詳解 本文詳細介紹 Spring、Spring Boot 及 Spring Cloud 中常用注解的用途、生命周期及使用方式&#xff0c;幫助開發者更深入理解 Spring 注解驅動編程模式。 參考來源&#xff1a;Spring、SpringMVC、SpringBoot、SpringCloud 框架常用注解說明 目錄 注…

手撕STL——vector

目錄 引言 1&#xff0c;了解 STL 中的 vector 2&#xff0c;先來一個簡易版跑起來 2_1&#xff0c;構造函數 2_2&#xff0c;擴容reserve&#xff08;&#xff09; 2_3&#xff0c;push_back&#xff08;&#xff09; 2_4&#xff0c;pop_back&#xff08;&#xff09; …

優恩-具備浪涌保護功能的固態繼電器UNRD0610-無觸點開關器件?

MOSFET固態繼電器 : 最高負載電壓&#xff1a;60V 最大負載電流&#xff1a;10A 快速響應時間&#xff1a;≤1ms 低驅動電流&#xff1a;≤10mA 高絕緣性&#xff0c;輸入輸出間隔離電壓&#xff1a;AC3000V 耐脈沖浪涌沖擊能力強 符合IEC 61000-4-2 ESD標準&#xff1a…

Kaamel隱私與安全分析報告:Microsoft Recall功能評估與風險控制

本報告對Microsoft最新推出的Recall功能進行了全面隱私與安全分析。Recall是Windows 11 Copilot電腦的專屬AI功能&#xff0c;允許用戶以自然語言搜索曾在電腦上查看過的內容。該功能在初次發布時因嚴重隱私和安全問題而備受爭議&#xff0c;后經微軟全面重新設計。我們的分析表…

Kotlin協程Semaphore withPermit約束并發任務數量

Kotlin協程Semaphore withPermit約束并發任務數量 import kotlinx.coroutines.* import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main() {val permits 1 /…