對於數據一致性要求不極高(可容忍分鐘級數據丟失)的業務,使用 mysqldump 邏輯備份配合 gzip 壓縮,通過 Shell 腳本 + crontab 實現定時自動化備份,是低成本、易維護的方案。
#!/bin/bash
# mysql_auto_backup.sh
# 定時備份指定表,gzip 壓縮,按日期分目錄存放
# ========== 配置區 ==========
MYSQL_PWD="your_password" # MySQL 密碼
MYSQL_DUMP="/usr/local/mysql/bin/mysqldump" # mysqldump 路徑
DB_NAME="mydb" # 目標數據庫
# 需備份的表列表(空格分隔,或改為數組)
TABLES=("table_1" "table_2" "table_3")
BACKUP_ROOT="/usr/backup/mysql" # 備份根目錄
# ============================
# 1. 構建日期目錄:/usr/backup/mysql/2024-01/15
CUR_YEAR=$(date +"%Y")
CUR_MONTH=$(date +"%m")
CUR_DAY=$(date +"%d")
DUMP_PATH="$BACKUP_ROOT/$CUR_YEAR-$CUR_MONTH/$CUR_DAY"
# 2. 創建目錄
if [ ! -d "$DUMP_PATH" ]; then
mkdir -p "$DUMP_PATH"
fi
# 3. 遍歷表進行備份
for TABLE in "${TABLES[@]}"; do
echo "[$(date)] 開始備份 $TABLE ..."
$MYSQL_DUMP -uroot -p$MYSQL_PWD --opt $DB_NAME $TABLE | gzip > "$DUMP_PATH/$TABLE.sql.gz"
if [ $? -eq 0 ]; then
echo "[$(date)] $TABLE 備份成功:$DUMP_PATH/$TABLE.sql.gz"
else
echo "[$(date)] $TABLE 備份失敗!" >&2
fi
done
# 4. 可選:刪除 30 天前的舊備份
find $BACKUP_ROOT -type f -name "*.sql.gz" -mtime +30 -delete
find $BACKUP_ROOT -type d -empty -delete
| 參數 | 含義 | 建議 |
|---|---|---|
| --opt | 啟用一組優化選項(--add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick, --set-charset) | ✅ 默認開啟,保持 |
| --single-transaction | InnoDB 表一致性備份不加鎖 | ✅ InnoDB 必加,避免阻塞寫入 |
| --master-data=2 | 記錄 binlog 位置(CHANGE MASTER TO 註釋形式) | ✅ 主從架構必加,便於搭建從庫 |
| --routines --triggers --events | 備份存儲過程/觸發器/事件 | 按需開啟 |
| --hex-blob | 二進制列用十六進制導出 | 含 BLOB/二進制列必加 |
#!/bin/bash
# mysql_backup_pro.sh - 生產環境推薦配置
MYSQL_USER="backup_user" # 專用備份賬號,權限:SELECT, LOCK TABLES, SHOW VIEW, RELOAD, PROCESS
MYSQL_PWD="strong_password"
MYSQL_DUMP="/usr/bin/mysqldump"
DB_NAME="prod_db"
TABLES=("orders" "users" "products" "logs")
BACKUP_ROOT="/data/backup/mysql"
RETENTION_DAYS=7
LOG_FILE="/var/log/mysql_backup.log"
exec >> $LOG_FILE 2>&1 # 所有輸出重定向到日志
echo "========== $(date) 備份開始 =========="
DUMP_PATH="$BACKUP_ROOT/$(date +%Y-%m)/$(date +%d)"
mkdir -p "$DUMP_PATH"
for TABLE in "${TABLES[@]}"; do
FILE="$DUMP_PATH/$TABLE-$(date +%H%M%S).sql.gz"
$MYSQL_DUMP -u$MYSQL_USER -p$MYSQL_PWD \
--single-transaction \
--master-data=2 \
--routines --triggers --events \
--hex-blob \
--quick \
--compress \
$DB_NAME $TABLE | gzip -c > "$FILE"
if [ $? -eq 0 ]; then
SIZE=$(du -h "$FILE" | cut -f1)
echo "✅ $TABLE 備份成功 ($SIZE)"
else
echo "❌ $TABLE 備份失敗"
# 可接入告警:發送郵件/釘釘/企微
fi
done
# 清理舊備份
find $BACKUP_ROOT -type f -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_ROOT -type d -empty -delete
echo "========== $(date) 備份結束 =========="
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, LOCK TABLES, SHOW VIEW, RELOAD, PROCESS ON prod_db.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
chmod +x /path/mysql_backup_pro.sh
/path/mysql_backup_pro.sh
cat /var/log/mysql_backup.log
crontab -e
# 每天凌晨 2:30 執行(業務低峰期)
30 2 * * * /path/mysql_backup_pro.sh
# 解壓並導入測試庫
gunzip -c /data/backup/mysql/2024-01/15/orders-023000.sql.gz | mysql -uroot -p test_db
mysqldump 是邏輯備份,恢復慢(需重建索引、解析 SQL)高一致性/大數據量場景請使用:Percona XtraBackup(物理熱備份)、MySQL Enterprise Backup、或雲廠商快照備份。
Shell + mysqldump + gzip + crontab 是輕量級 MySQL 自動備份的經典組合。關鍵點:使用 --single-transaction 保證一致性不阻塞、專用備份賬號最小權限、按日期分目錄管理、定期演練恢復。對於核心業務,請升級為物理備份方案。