首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Linux Shell 腳本實現 MySQL 定時備份並壓縮

     編輯:MySQL 綜合教學

場景需求

對於數據一致性要求不極高(可容忍分鐘級數據丟失)的業務,使用 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-transactionInnoDB 表一致性備份不加鎖✅ 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) 備份結束 =========="

部署步驟

  1. 創建備份專用賬號(最小權限原則):
    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;
  2. 測試腳本:
    chmod +x /path/mysql_backup_pro.sh
    /path/mysql_backup_pro.sh
    cat /var/log/mysql_backup.log
  3. 配置 crontab:
    crontab -e
    # 每天凌晨 2:30 執行(業務低峰期)
    30 2 * * * /path/mysql_backup_pro.sh
  4. 驗證備份可恢復性(定期演練):
    # 解壓並導入測試庫
    gunzip -c /data/backup/mysql/2024-01/15/orders-023000.sql.gz | mysql -uroot -p test_db

局限性說明

⚠️ 僅適用「數據一致性要求不高」場景

  • mysqldump 是邏輯備份,恢復慢(需重建索引、解析 SQL)
  • 大表(>10GB)備份時間長、壓縮佔 CPU
  • 無法實現秒級 RPO(恢復點目標)

高一致性/大數據量場景請使用:Percona XtraBackup(物理熱備份)、MySQL Enterprise Backup、或雲廠商快照備份。

總結

Shell + mysqldump + gzip + crontab 是輕量級 MySQL 自動備份的經典組合。關鍵點:使用 --single-transaction 保證一致性不阻塞、專用備份賬號最小權限、按日期分目錄管理、定期演練恢復。對於核心業務,請升級為物理備份方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved