生產環境 MySQL 備份標準化流程:mysqldump 邏輯備份 → gzip 壓縮 → 時間戳命名 → crontab 定時執行 → 保留策略清理。
mkdir -p /var/backup/mysql cd /var/backup mysqldump -u root -p'YourPass' db_name > mysql/db_name.sql ls -lh mysql/db_name.sql # 確認產出
#!/bin/bash
# 設定區
DB_USER="root"
DB_PASS="YourPass"
DB_NAME="db_name"
BACKUP_DIR="/var/backup/mysql"
RETENTION_DAYS=7 # 保留天數
# 時間戳檔名
FILE_NAME="${DB_NAME}-$(date +%Y%m%d%H%M%S)"
# 進入備份目錄
cd "${BACKUP_DIR}"
# 邏輯備份
mysqldump -u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" > "${FILE_NAME}.sql"
# 壓縮 (gzip 預設等級 6,平衡速度/壓縮比)
gzip "${FILE_NAME}.sql"
# 清理舊備份 (保留最近 N 天)
find "${BACKUP_DIR}" -type f -name "${DB_NAME}-*.sql.gz" -mtime +${RETENTION_DAYS} -delete
echo "$(date '+%F %T') Backup completed: ${FILE_NAME}.sql.gz" >> /var/log/mysql-backup.log
賦予執行權限:
chmod +x /var/backup/mysql-backup.sh
/var/backup/mysql-backup.sh ls -lh /var/backup/mysql/ tail /var/log/mysql-backup.log
# 編輯 root 的 crontab crontab -e # 每天凌晨 3:00 執行 (低峰期) 0 3 * * * /var/backup/mysql-backup.sh > /dev/null 2>&1 # 或每 6 小時 (高頻業務) 0 */6 * * * /var/backup/mysql-backup.sh > /dev/null 2>&1
* * * * * command 分 時 日 月 周 # 範例 30 2 * * * /path/script.sh # 每天 02:30 0 3 * * 0 /path/script.sh # 每週日 03:00 */15 * * * * /path/script.sh # 每 15 分鐘 0 0 1 * * /path/script.sh # 每月 1 號 00:00 0 22 * * 1-5 /path/script.sh # 週一至五 22:00
| 指令 | 說明 |
|---|---|
crontab -l | 列出當前排程 |
crontab -e | 編輯排程 (vi 編輯器) |
crontab -r | 移除所有排程 (慎用!) |
crontab /path/file | 從檔案載入排程 |
# 腳本末尾加入
# 1. 校驗壓縮檔完整性
gzip -t "${FILE_NAME}.sql.gz" || { echo "Corrupt backup!" | mail -s "MySQL Backup Failed" admin@company.com; exit 1; }
# 2. 上傳至遠端備份伺服器 (rsync over SSH)
rsync -avz "${BACKUP_DIR}/${FILE_NAME}.sql.gz" backup-user@backup-server:/remote/backup/mysql/
# 3. 推送成功指標至 Prometheus Pushgateway
curl --data-binary "mysql_backup_success 1" https://pushgateway:9091/metrics/job/mysql_backup