本文整理在 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
備份腳本每日執行後會:
- 匯出當前資料庫
- 自動壓縮
- 刪除超過 7 天的備份
- 寫入日誌供追蹤
十二、結語
在 Docker 化環境中,資料持久化與備份策略 是維運中最重要的一環。
無論你使用哪種方式,只要遵循以下三原則,就能有效避免災難:
- 備份自動化:不依賴人工操作
- 定期驗證:確保備份可成功還原
- 版本一致性:還原環境與匯出版本相同
只要做到這三點,即使容器或主機意外損毀,也能快速恢復服務。
📎 延伸閱讀