用 Bash 寫一個資料庫備份腳本 文章首圖

用 Bash 寫一個資料庫備份腳本

用 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 管理員邁向專業的重要一步。