萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Linux 下使用 Shell 腳本實現 MySQL 定時自動備份完整指南

資料庫備份是維護數據安全的核心環節,其中最常見且高效的方式莫過於配合排程實現自動化備份。本文將詳細介紹如何在 Linux 環境下,編寫 Shell 腳本並搭配 Crontab,實現 MySQL 資料庫的每日定時備份。

核心備份腳本

首先,建立一個 Shell 腳本檔案(例如 DataBackup.sh),內容如下:

#!/bin/bash
# MySQL 每日自動備份腳本
# 作者:Carlos Wong
# 日期:2010-08-24

# ========== 參數配置區 ==========
USER=root                     # 資料庫用戶名
PASSWORD=*****                # 資料庫密碼(建議使用 .my.cnf 或環境變數替代明文)
DATABASE=TIENIUZAI            # 目標資料庫名稱
WEBMASTER=admin@example.com   # 管理員郵箱,用於接收失敗通知
BACKUP_DIR=/var/www/Data_Backup/topons/  # 備份檔案儲存路徑
LOGFILE=/var/www/Data_Backup/topons/data_backup.log  # 日誌檔案路徑
DATE=$(date '+%Y%m%d-%H%M')   # 日期格式,作為檔案名一部分
DUMPFILE=$DATE.sql            # 臨時 SQL 備份檔名
ARCHIVE=$DATE.sql.tgz         # 最終壓縮包檔名
OPTIONS="-u$USER -p$PASSWORD --opt --extended-insert=false --triggers=false -R --hex-blob --flush-logs --delete-master-logs -B $DATABASE"
# mysqldump 參數說明:
# --opt            : 開啟快速導出、鎖表、擴展插入等優化選項
# --extended-insert=false : 使用單行 INSERT,便於差異比對
# --triggers=false : 不導出觸發器(視需求調整)
# -R               : 導出存儲過程與函數
# --hex-blob       : 二進位欄位以十六進位導出
# --flush-logs     : 刷新二進位日誌
# --delete-master-logs : 備份後刪除主庫二進位日誌(謹慎使用)
# -B               : 導出完整資料庫結構(含 CREATE DATABASE)

# ========== 建立備份目錄 ==========
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi

# ========== 寫入日誌標頭 ==========
echo "" >> "$LOGFILE"
echo "" >> "$LOGFILE"
echo "--------------------------------------------------" >> "$LOGFILE"
echo "BACKUP DATE: $(date +'%y-%m-%d %H:%M:%S')" >> "$LOGFILE"
echo "--------------------------------------------------" >> "$LOGFILE"

# ========== 切換至備份目錄並執行備份 ==========
cd "$BACKUP_DIR"
mysqldump $OPTIONS > "$DUMPFILE"

# ========== 判斷備份結果並後續處理 ==========
if [[ $? == 0 ]]; then
    # 備份成功:壓縮、記錄、清理臨時檔
    tar czvf "$ARCHIVE" "$DUMPFILE" >> "$LOGFILE" 2>&1
    echo "[$ARCHIVE] Backup Successful!" >> "$LOGFILE"
    rm -f "$DUMPFILE"
else
    # 備份失敗:記錄日誌、發送郵件通知(需安裝 mailutils 等工具)
    echo "Database Backup Fail!" >> "$LOGFILE"
    # mail -s "Database:$DATABASE Daily Backup Fail" $WEBMASTER
fi

echo "Backup Process Done"

部署與排程步驟

  1. 儲存腳本:將上述代碼保存至 /usr/sbin/DataBackup(或任意可執行路徑),檔名勿與系統命令衝突。
  2. 賦予執行權限:sudo chmod +x /usr/sbin/DataBackup
  3. 測試執行:sudo DataBackup,檢查備份目錄與日誌輸出。
  4. 配置 Crontab 定時任務:編輯 /etc/crontab,新增一行:
    01 3 * * * root /usr/sbin/DataBackup
    表示每天凌晨 3:01 自動執行備份。

關鍵注意事項

  • 變量賦值無空格:Shell 中 KEY=VALUE 等號兩側不能有空格。
  • 反引號與單引號區別:date '+%Y%m%d' 中的引號是反引號(鍵盤 ESC 下方鍵),非單引號。
  • 適用場景:此腳本採用全量備份,適合中小型站點。大型資料庫建議採用增量備份或 Percona XtraBackup 等工具。

常見問題:Socket 路徑不匹配導致連線失敗

若遇到錯誤 Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock',原因通常是 MySQL 配置文件(my.cnf)中的 socket 參數指向 /tmp/mysql.sock,而 mysqldump 預設尋找 /var/lib/mysql/mysql.sock。

解決方案(推薦):建立軟連結,無需重啟服務:

ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

或修改 my.cnf 統一 socket 路徑後重啟 MySQL(影響較大,不建議頻繁操作)。

copyright © 萬盛學電腦網 all rights reserved