
# 用 Docker Compose 部署 MySQL 備份自動化:cron + mysqldump 一步搞掂
好多 IT 人一講到數據庫備份就頭痕,尤其係 MySQL 喺 Docker 環境入面跑,成日唔知點樣定時自動 backup。今日小 T 就同大家拆解一個超簡單嘅做法:用 Docker Compose 加 cron,將 mysqldump 備份流程完全自動化,仲要識得自動清理舊檔,等磁碟唔會爆。
## 點解要用 cron 做 MySQL 備份自動化?
生產環境最忌就係「人手記得先做備份」。你今日記得,聽日一忙就漏。用 cron 排程,等系統每日準時幫你 dump 一次,先至係真正嘅安全感。而且 MySQL 備份自動化仲有個好處:可以做到全自動、零人手介入、仲可以留多個時間點俾你回溯。
## 環境準備
假設你已經有個 MySQL 容器行緊,個 Compose 檔大概係咁:
version: '3.8'
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: change_me
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
## Step 1:寫備份 script
整一個 `backup.sh`,放喺宿主機上面:
#!/bin/bash
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backup/mysql
RETENTION_DAYS=7
mkdir -p "$BACKUP_DIR"
docker exec db mysqldump \
-uroot -pchange_me \
--single-transaction \
--routines \
--triggers \
myapp > "$BACKUP_DIR/myapp_$TIMESTAMP.sql"
# 清理 7 日前嘅舊備份
find "$BACKUP_DIR" -name "myapp_*.sql" -mtime +$RETENTION_DAYS -delete
echo "Backup done: $TIMESTAMP"
呢個 script 會用 `mysqldump` 做邏輯備份,`–single-transaction` 令 InnoDB 表唔會鎖表,適合線上環境。
## Step 2:加落 crontab
編輯 crontab:
crontab -e
加入一行,每日凌晨 2 點自動跑:
0 2 * * * /home/user/backup.sh >> /var/log/mysql_backup.log 2>&1
咁就完成晒,每日自動備份 MySQL,仲會自動刪走 7 日前嘅舊檔。
## Step 3:驗證備份檔可以用
千祈唔好只係「有 backup」就算,一定要定期試還原。可以開個測試容器:
docker run -d --name db_test -e MYSQL_ROOT_PASSWORD=test mysql:8.0
docker exec -i db_test mysql -uroot -ptest myapp < /backup/mysql/myapp_20260913_020000.sql
仲原到先至叫成功。
## 進階:加密 + 上雲
如果數據敏感,可以加多步用 gpg 加密,再 sync 上 S3 或者另一部機做異地備份。總之記住一個原則:備份要 3-2-1(3 份拷貝、2 種媒介、1 份異地)。
## 總結
🔗 參考資料:NVD NIST 漏洞資料庫
MySQL 備份自動化其實一啲都唔難,用 cron 加 mysqldump 十零分鐘就搞掂。最緊要係:排好程、寫好清理邏輯、定期試還原。咁你嘅數據先至真正安全。



