資料庫備份是維護數據安全的核心環節,其中最常見且高效的方式莫過於配合排程實現自動化備份。本文將詳細介紹如何在 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"
/usr/sbin/DataBackup(或任意可執行路徑),檔名勿與系統命令衝突。sudo chmod +x /usr/sbin/DataBackupsudo DataBackup,檢查備份目錄與日誌輸出。/etc/crontab,新增一行:01 3 * * * root /usr/sbin/DataBackupKEY=VALUE 等號兩側不能有空格。date '+%Y%m%d' 中的引號是反引號(鍵盤 ESC 下方鍵),非單引號。若遇到錯誤 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(影響較大,不建議頻繁操作)。