在開發圖書管理系統的過程中,除了處理功能開發、併發交易控制與 Web 資安防護外,資料安全性與維運也是不可或缺的一環。
無論是因硬體故障、程式 Bug 導致資料異常,或是人為操作失誤,資料庫一旦損毀或遺失,對系統都是致命打擊。因此,建立完善的備份與還原,是確保專案穩定運行的基本功。
今天介紹如何在 Linux/WSL2 環境下,使用 MySQL 官方工具進行資料庫的備份與復原,並透過 Bash 腳本實作自動化排程。
mysqldump 原理介紹mysqldump 屬於邏輯備份工具。執行時,它會讀取資料庫中的結構與資料,並將其轉化為一系列可重新執行的 SQL 語法檔案(.sql)。這個檔案包含了:
手動備份指令:
sudo mysqldump -u root -p library_system > library_system_backup.sql
-u root:指定資料庫管理員帳號。-p:提示輸入密碼。library_system:欲備份的目標資料庫名稱。library_system_backup.sql:將匯出的 SQL 內容重導向至指定的檔案。當系統發生資料異常或需要將資料庫轉移至新環境時,可以透過先前備份的 .sql 檔進行完整還原。
復原流程分為兩個步驟:
模擬資料庫遺失或欲進行全量覆蓋:
sudo mysql -u root -e "DROP DATABASE IF EXISTS library_system;"
由於 mysqldump 預設匯出的 SQL 檔中不包含建立資料庫的指令(CREATE DATABASE),因此需要手動建立一個同名的空白資料庫:
sudo mysql -u root -e "CREATE DATABASE library_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
使用 < 符號將 .sql 檔案中的指令輸入至指定的資料庫中:
sudo mysql -u root library_system < library_system_backup.sql
執行完畢後,mysql 會依序執行檔案中的 SQL 語法,重新建立表結構並還原所有書籍、會員及借閱資料。
手動執行備份容易遺忘,在實際生產環境或開發維運中,通常會撰寫自動化腳本配合排程工具來定期執行。
backup.sh)此腳本除了執行 mysqldump 外,更加入 壓縮(gzip) 與 自動清理過期備份 的功能,以節省伺服器儲存空間:
#!/bin/bash
# 設定參數
DB_USER="root"
DB_NAME="library_system"
BACKUP_DIR="/home/ubuntu/db_backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql"
# 建立備份目錄(若不存在)
mkdir -p $BACKUP_DIR
# 執行備份並透過管道進行 gzip 壓縮
sudo mysqldump -u $DB_USER $DB_NAME | gzip > "${BACKUP_FILE}.gz"
# 自動刪除超過 7 天的舊備份檔
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +7 -delete
echo "[$DATE] 資料庫自動備份完成:${BACKUP_FILE}.gz"
利用 Linux 內建的 cron 服務,設定每天凌晨 3 點自動觸發備份腳本:
crontab -e
在編輯頁面中加入以下排程設定:
0 3 * * * /bin/bash /home/ubuntu/scripts/backup.sh >> /home/ubuntu/db_backups/backup.log 2>&1
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
sudo
ERROR 1007 (HY000): Can't create database 'library_system'; database exists
CREATE DATABASE library_system; 時,MySQL 發現系統裡已經有一個同名的資料庫了。DROP DATABASE library_system; 刪除舊庫,再重新建立。CREATE DATABASE IF NOT EXISTS library_system;
今天實作了資料庫維運機制,為了提升維運效率,撰寫自動化 Bash 腳本,結合 gzip 串流壓縮與自動清理過期檔案的機制,並透過 Linux 的 crontab 設定每日定時備份,為專案的上線運行打下了堅實的後盾。