用 Bash 寫一個資料庫備份腳本
在日常的系統維護工作中,數據的安全性永遠是第一位的。對於許多 Linux 伺服器管理員來說,手動登入資料庫伺服器執行備份指令不僅效率低落,還容易因遺忘而導致災難發生。今天,我們將透過 Bash 腳本自動化這個過程,打造一個既安全又高效的資料庫備份方案。本範例將以 MySQL/MariaDB 為例,但邏輯同樣適用於 PostgreSQL 等其他支援命令列工具的資料庫。
腳本設計思路
一個完善的備份腳本需要考慮幾個核心要素:時間戳記、壓縮格式、錯誤處理以及舊檔案的清理。我們將使用 mysqldump 進行邏輯備份,並結合 gzip 進行壓縮以節省磁碟空間。此外,為了避免磁碟被塞滿,我們還需要設定一個保留策略,例如只保留最近 7 天的備份檔。
實作步驟
首先,請在您的伺服器上建立一個專門存放備份腳本的目錄,並創建腳本檔案。
sudo mkdir -p /opt/scripts
sudo nano /opt/scripts/db_backup.sh
將以下程式碼貼入檔案中。這段腳本包含了詳細的註解,方便您理解每一行的作用:
#!/bin/bash
# ==========================================
# 資料庫備份腳本
# 適用於 Ubuntu 22.04 / Debian 12
# ==========================================
# --- 設定區 ---
DB_USER="root" # 資料庫使用者
DB_PASS="your_secure_password" # 資料庫密碼
DB_HOST="localhost" # 資料庫主機位址
BACKUP_DIR="/var/backups/mysql" # 備份檔案存放路徑
RETENTION_DAYS=7 # 備份檔案保留天數
DATE=$(date +%Y%m%d_%H%M%S) # 產生時間戳記
# --- 前置檢查 ---
# 確保備份目錄存在
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
fi
# 檢查 mysqldump 是否存在
if ! command -v mysqldump &> /dev/null; then
echo "錯誤:找不到 mysqldump 指令,請先安裝 mariadb-client 或 mysql-client。"
exit 1
fi
# --- 執行備份 ---
echo "開始備份資料庫... ($DATE)"
# 列出所有資料庫名稱
DBS=$(mysql -u "$DB_USER" -p"$DB_PASS" -h "$DB_HOST" -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)")
for db in $DBS; do
# 排除系統資料庫
if [ "$db" == "information_schema" ] || [ "$db" == "performance_schema" ] || [ "$db" == "mysql" ]; then
continue
fi
FILENAME="${db}_${DATE}.sql.gz"
# 執行備份並壓縮
mysqldump -u "$DB_USER" -p"$DB_PASS" -h "$DB_HOST" --single-transaction "$db" | gzip > "$BACKUP_DIR/$FILENAME"
if [ $? -eq 0 ]; then
echo "成功備份: $db -> $FILENAME"
else
echo "備份失敗: $db"
fi
done
# --- 清理舊備份 ---
echo "正在清理超過 $RETENTION_DAYS 天的舊備份..."
find "$BACKUP_DIR" -name "*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete
echo "備份作業完成。"
儲存檔案後,請賦予執行權限:
sudo chmod +x /opt/scripts/db_backup.sh
自動化設定
為了讓備份自動執行,我們利用 Linux 的 cron 服務。建議每天凌晨 2 點執行一次,這個時段系統負載通常較低。
sudo crontab -e
在開啟的編輯器中加入以下行:
0 2 * * * /opt/scripts/db_backup.sh >> /var/log/db_backup.log 2>&1
這行設定表示每天凌晨 2 點執行腳本,並將輸出紀錄寫入 /var/log/db_backup.log,方便日後除錯。
常見問題與解決方案
1. 密碼輸入問題
在腳本中直接使用 -pPASSWORD 的方式雖然方便,但安全性較低,因為其他使用者可以透過 ps 指令看到明文密碼。在生產環境中,建議使用 MySQL 的權限檔案(~/.my.cnf)來儲存憑證,或在腳本中讀取環境變數。
2. 備份檔案過大
如果資料庫容量龐大,單一檔案可能會導致磁碟空間不足。此時可以考慮將備份策略改為「增量備份」或「每日全備 + 每小時 binlog 備份」的混合模式,或者將備份檔案透過 rsync 同步到遠端物件儲存空間(如 AWS S3 或 MinIO)。
小結
透過這個簡單的 Bash 腳本,我們成功建立了自動化、壓縮且具備自動清理功能的資料庫備份機制。這不僅節省了手動操作的時間,更確保了數據恢復的可靠性。記住,備份的最後一步是「還原測試」,建議定期嘗試從備份檔還原資料庫,以驗證備份的有效性。掌握基礎的自動化腳本,是每一位 Linux 管理員邁向專業的重要一步。