Skip to content

Nuface Blog

隨意隨手記 Casual Notes

Menu
  • Home
  • About
  • Services
  • Blog
  • Contact
  • Privacy Policy
  • Login
Menu

Docker + MariaDB 備份與還原最佳實務

Posted on 2025-11-052025-11-05 by Rico

本文整理在 Docker 環境中執行 MariaDB 的備份與還原最佳實務,說明不同場景下的策略、指令範例與注意事項,協助在容器化環境中維持資料安全與可靠性。


一、為什麼 Docker 化的資料庫要特別注意備份?

在 Docker 架構中,MariaDB 通常以容器形式運行,
而容器的資料是存在 volume(資料卷) 或 bind mount(對應主機資料夾) 中。
如果只重新建立容器而未備份這些持久資料,整個資料庫會直接遺失。

所以:
📌 資料庫備份的重點在於「持久層(persistent data)」與「資料一致性(consistency)」的保存。


二、常見的三種備份方式

備份方式特點適用情境
邏輯備份 (mysqldump)以 SQL 指令匯出結構與資料較慢但最通用,可跨版本匯入
實體備份 (volume / 資料夾)直接複製 /var/lib/mysql 內容快速但需停機,版本必須一致
容器自動備份 (cron + dump)使用排程在容器內週期性匯出 SQL自動化備份最常見作法

三、邏輯備份(mysqldump)

這是最穩定、跨版本相容度最高的方式。

🔹 手動匯出備份

docker exec -i mariadb \
  mysqldump -u root -p'abcd123' --single-transaction --quick \
  --routines --events --triggers --default-character-set=utf8 \
  nuface | gzip > /backup/nuface_$(date +%F).sql.gz

📘 重點參數說明

  • --single-transaction:避免鎖表 (InnoDB)
  • --quick:逐筆輸出,降低記憶體使用
  • --routines --events --triggers:確保完整匯出邏輯物件
  • --default-character-set=utf8:防止亂碼
  • gzip:同時壓縮備份檔

四、自動化排程備份(每日自動 dump)

1️⃣ 建立備份腳本 backup.sh

#!/bin/bash
DATE=$(date +%F)
docker exec -i mariadb \
  mysqldump -u root -p'abcd123' --single-transaction --quick \
  --routines --events --triggers --default-character-set=utf8 \
  nuface | gzip > /backup/nuface_$DATE.sql.gz

# 清除舊備份 (保留最近7天)
find /backup -name "nuface_*.sql.gz" -mtime +7 -delete

2️⃣ 加入系統排程 (cron)

0 2 * * * /usr/local/bin/backup.sh >> /var/log/mariadb_backup.log 2>&1

📌 建議執行時間:凌晨 2 點(業務流量最低時段)
📦 備份保留天數:可依需求調整為 7~30 天


五、實體備份(Volume 或 Bind Mount)

若你的資料庫資料位於宿主機 /data/mysql:

docker run -d \
  --name mariadb \
  -v /data/mysql:/var/lib/mysql \
  -e MARIADB_ROOT_PASSWORD=abcd123 \
  mariadb:12.1

🔹 備份方式:

直接複製整個資料夾:

systemctl stop docker
cp -a /data/mysql /backup/mysql_$(date +%F)
systemctl start docker

⚠️ 注意事項

  • 必須在 資料庫停止時 進行,避免檔案不一致。
  • 不可跨版本還原(需相同 MariaDB 版本)。
  • 不建議在線上服務環境使用此方式(會造成中斷)。

六、還原(Restore)

還原 .sql 匯出檔

docker exec -i mariadb \
  mariadb -u root -p'abcd123' nuface < /backup/nuface_2025-09-16.sql

或還原壓縮檔:

gunzip -c /backup/nuface_2025-09-16.sql.gz | \
docker exec -i mariadb \
  mariadb -u root -p'abcd123' nuface

📌 若匯出檔中已包含 CREATE DATABASE / USE 指令,可省略 nuface。


七、從 Volume 備份還原

假設備份在 /backup/mysql_2025-09-16:

systemctl stop docker
rm -rf /data/mysql/*
cp -a /backup/mysql_2025-09-16/* /data/mysql/
systemctl start docker

若是使用 Docker Volume:

docker run --rm -v mariadb_data:/var/lib/mysql -v /backup:/backup busybox \
  sh -c "cd /var/lib/mysql && tar xvf /backup/mysql_backup.tar"

八、資料一致性與熱備份建議

類型建議動作備註
InnoDB 引擎使用 --single-transaction可進行線上備份
MyISAM 引擎建議先 FLUSH TABLES WITH READ LOCK;避免資料不同步
多資料庫服務使用 --all-databases 匯出確保版本一致性
大資料量加上 --max-allowed-packet=512M避免封包過小錯誤

九、驗證備份的完整性

備份不僅要能「產生」,更要能「還原」。

gunzip -t /backup/nuface_2025-09-16.sql.gz  # 驗證 gzip 檔案
head /backup/nuface_2025-09-16.sql.gz       # 確認檔案開頭

若要進一步驗證可還原性,可在測試環境匯入:

docker exec -i testdb \
  mariadb -u root -p'abcd123' testdb < /backup/nuface_2025-09-16.sql

十、最佳實務總結

項目建議
匯出方式使用 mysqldump + gzip
自動化以 cron 執行每日自動備份
保留週期最近 7~30 天
還原測試每月在測試環境驗證一次
安全性使用 MYSQL_PWD 環境變數避免密碼外洩
資料一致性InnoDB 使用 --single-transaction
壓縮格式.sql.gz 或 .tar.gz 皆可

十一、完整自動化備份架構範例

/backup/
├── backup.sh
├── nuface_2025-09-16.sql.gz
├── nuface_2025-09-17.sql.gz
└── logs/
    └── mariadb_backup.log

備份腳本每日執行後會:

  1. 匯出當前資料庫
  2. 自動壓縮
  3. 刪除超過 7 天的備份
  4. 寫入日誌供追蹤

十二、結語

在 Docker 化環境中,資料持久化與備份策略 是維運中最重要的一環。
無論你使用哪種方式,只要遵循以下三原則,就能有效避免災難:

  1. 備份自動化:不依賴人工操作
  2. 定期驗證:確保備份可成功還原
  3. 版本一致性:還原環境與匯出版本相同

只要做到這三點,即使容器或主機意外損毀,也能快速恢復服務。


📎 延伸閱讀

  • 🧱 mysqldump Export Syntax Notes (MySQL / MariaDB 5.5)
  • 🐬 Importing MariaDB SQL Files Inside Docker Containers — Practical Notes
  • MariaDB 官方文件:Backup and Restore

Recent Posts

  • Postfix + Let’s Encrypt + BIND9 + DANE Fully Automated TLSA Update Guide
  • Postfix + Let’s Encrypt + BIND9 + DANE TLSA 指紋自動更新完整教學
  • Deploying DANE in Postfix
  • 如何在 Postfix 中部署 DANE
  • DANE: DNSSEC-Based TLS Protection

Recent Comments

  1. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on High Availability Architecture, Failover, GeoDNS, Monitoring, and Email Abuse Automation (SOAR)
  2. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on MariaDB + PostfixAdmin: The Core of Virtual Domain & Mailbox Management
  3. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on Daily Operations, Monitoring, and Performance Tuning for an Enterprise Mail System
  4. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on Final Chapter: Complete Troubleshooting Guide & Frequently Asked Questions (FAQ)
  5. Building a Complete Enterprise-Grade Mail System (Overview) - Nuface Blog on Network Architecture, DNS Configuration, TLS Design, and Postfix/Dovecot SNI Explained

Archives

  • December 2025
  • November 2025
  • October 2025

Categories

  • AI
  • Apache
  • Cybersecurity
  • Database
  • DNS
  • Docker
  • Fail2Ban
  • FileSystem
  • Firewall
  • Linux
  • LLM
  • Mail
  • N8N
  • OpenLdap
  • OPNsense
  • PHP
  • QoS
  • Samba
  • Switch
  • Virtualization
  • VPN
  • WordPress
© 2025 Nuface Blog | Powered by Superbs Personal Blog theme