資料庫備份是系統維護中最關鍵的環節之一。本文將詳細介紹如何在 Linux 環境下,透過 Shell 腳本結合 crontab 實現 MySQL 資料庫的自動化定時備份,並包含舊備份自動清理與特定日期備份保留的進階策略。
建立一個名為 mysql_bak.sh 的 Shell 腳本,內容如下:
#!/bin/bash
# MySQL 資料庫自動備份腳本
# 設定資料庫連線參數
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/home/bak/db"
# 產生帶日期的備份檔名
DATE_SUFFIX=$(date +%y%m%d)
BACKUP_FILE="${BACKUP_DIR}/sql_${DB_NAME}_${DATE_SUFFIX}.sql"
# 執行備份(使用 mysqldump)
/usr/local/mysql/bin/mysqldump -u${DB_USER} -p${DB_PASS} \
-c --hex-blob --quick --default-character-set=utf8mb4 \
-B ${DB_NAME} > ${BACKUP_FILE}
# 檢查備份是否成功
if [ $? -eq 0 ]; then
echo "[$(date)] 備份成功: ${BACKUP_FILE}"
else
echo "[$(date)] 備份失敗!" >&2
exit 1
fi
# 保留策略:保留最近 7 天備份,且保留每月 1 號的備份
DAY_OF_MONTH=$(date -d '-7 day' +'%d')
if [ "${DAY_OF_MONTH}" != "01" ]; then
OLD_FILE="${BACKUP_DIR}/sql_${DB_NAME}_$(date -d '-7 day' +'%y%m%d').sql"
if [ -f "${OLD_FILE}" ]; then
rm -f "${OLD_FILE}"
echo "[$(date)] 已刪除 7 天前備份: ${OLD_FILE}"
fi
fi
編輯 crontab:
crontab -e
加入以下行,每天凌晨 2:30 執行備份:
30 2 * * * /path/to/mysql_bak.sh >> /var/log/mysql_backup.log 2>&1
chmod +x /path/to/mysql_bak.sh
scp 或 rsync 將備份檔同步至異地伺服器gzip ${BACKUP_FILE} 節省空間| 問題 | 可能原因 | 解決方向 |
|---|---|---|
| 備份檔為空 | 權限不足、密碼錯誤 | 檢查帳號權限、密碼特殊字元轉義 |
| 中文亂碼 | 字元集不匹配 | 統一使用 utf8mb4,避免 GB2312 |
| 大表備份超時 | 鎖表時間過長 | 考慮使用 Percona XtraBackup 熱備份 |