數據庫是核心資產,備份必須自動化、異地化、可驗證。WordPress 插件僅覆蓋單站點,多站點、非 WP 系統需通用方案。
automysqlbackup.sh#!/bin/bash
# 配置區
DB_USER="backup_user"
DB_PASS="strong_password"
DB_NAMES="db1 db2 db3" # 多庫空格分隔
BACKUP_DIR="/home/website/backups"
MAIL_TO="admin@example.com"
DATE_TAG=$(date +%F_%H-%M-%S)
SQL_FILE="${BACKUP_DIR}/db_backup_${DATE_TAG}.sql"
TAR_FILE="${BACKUP_DIR}/db_backup_${DATE_TAG}.tar.gz"
# 1. 邏輯備份(需 RELOAD, LOCK TABLES, SHOW VIEW 權限)
mysqldump -u${DB_USER} -p${DB_PASS} --databases ${DB_NAMES} \
--single-transaction --routines --triggers --events \
> ${SQL_FILE}
# 2. 壓縮減小體積
tar -zcf ${TAR_FILE} -C ${BACKUP_DIR} $(basename ${SQL_FILE})
# 3. 郵件發送(需配置 mutt/msmtp + SMTP)
echo "MySQL 備份 ${DATE_TAG}" | mutt -s "【自動備份】MySQL 數據庫 ${DATE_TAG}" \
-a ${TAR_FILE} -- ${MAIL_TO}
# 4. 清理本地臨時文件(保留壓縮包按策略清理)
rm -f ${SQL_FILE}
# 可選:find ${BACKUP_DIR} -name "*.tar.gz" -mtime +7 -delete # 保留 7 天
exit 0
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, RELOAD, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER
ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
無需 root 權限,遵循最小權限原則。若無 LOCK TABLES,去掉 --single-transaction 會導致 MyISAM 表鎖表。
# 編輯 crontab
crontab -e
# 每天凌晨 2:30 執行(低峰期)
30 2 * * * /home/website/automysqlbackup.sh >> /home/website/logs/backup.log 2>&1
| 需求 | 實現方案 |
|---|---|
| 大庫分表並行備份 | mysqldump --tab 導出 TSV + 並行壓縮,或用 mydumper 多線程工具 |
| 增量備份 | 開啟 log_bin,配合 mysqlbinlog 定時同步 binlog 到異地 |
| 備份驗證 | 定期在測試環境 mysql < backup.sql 恢復驗證,校驗 CHECKSUM TABLE |
| 異地存儲 | 上傳至 S3/OSS/COS,或 rsync 到異地服務器 |
| 監控告警 | 腳本返回碼非 0 觸發釘釘/企微/郵件告警,Prometheus 采集備份耗時/大小指標 |
mysqldump.exe + 7z.exe 壓縮Send-MailMessage 或 Blat.exe備份未恢復等於沒備份。建立「備份→壓縮→異地→驗證→監控」閉環,定期演練恢復流程(RTO/RPO 量化)。