iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0

在開發圖書管理系統的過程中,除了處理功能開發、併發交易控制與 Web 資安防護外,資料安全性與維運也是不可或缺的一環。

無論是因硬體故障、程式 Bug 導致資料異常,或是人為操作失誤,資料庫一旦損毀或遺失,對系統都是致命打擊。因此,建立完善的備份與還原,是確保專案穩定運行的基本功。

今天介紹如何在 Linux/WSL2 環境下,使用 MySQL 官方工具進行資料庫的備份與復原,並透過 Bash 腳本實作自動化排程。

一、 核心工具:mysqldump 原理介紹

mysqldump 屬於邏輯備份工具。執行時,它會讀取資料庫中的結構與資料,並將其轉化為一系列可重新執行的 SQL 語法檔案(.sql)。這個檔案包含了:

  • DDL (Data Definition Language):例如 CREATE TABLE,用於重建資料表結構。
  • DML (Data Manipulation Language):例如 INSERT INTO,用於重新填入原始資料。

手動備份指令:

sudo mysqldump -u root -p library_system > library_system_backup.sql
  • -u root:指定資料庫管理員帳號。
  • -p:提示輸入密碼。
  • library_system:欲備份的目標資料庫名稱。
  • library_system_backup.sql:將匯出的 SQL 內容重導向至指定的檔案。

二、 資料復原流程

當系統發生資料異常或需要將資料庫轉移至新環境時,可以透過先前備份的 .sql 檔進行完整還原。

復原流程分為兩個步驟:

步驟 1:刪除/清理舊資料庫

模擬資料庫遺失或欲進行全量覆蓋:

sudo mysql -u root -e "DROP DATABASE IF EXISTS library_system;"

步驟 2:建立同名空白資料庫

由於 mysqldump 預設匯出的 SQL 檔中不包含建立資料庫的指令(CREATE DATABASE),因此需要手動建立一個同名的空白資料庫:

sudo mysql -u root -e "CREATE DATABASE library_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

步驟 3:匯入 SQL 備份檔

使用 < 符號將 .sql 檔案中的指令輸入至指定的資料庫中:

sudo mysql -u root library_system < library_system_backup.sql

執行完畢後,mysql 會依序執行檔案中的 SQL 語法,重新建立表結構並還原所有書籍、會員及借閱資料。

三、 自動化維運:寫一個 Bash 備份腳本

手動執行備份容易遺忘,在實際生產環境或開發維運中,通常會撰寫自動化腳本配合排程工具來定期執行。

1. 撰寫 Bash 腳本 (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"

2. 設定 Linux 排程:crontab

利用 Linux 內建的 cron 服務,設定每天凌晨 3 點自動觸發備份腳本:

crontab -e

在編輯頁面中加入以下排程設定:

0 3 * * * /bin/bash /home/ubuntu/scripts/backup.sh >> /home/ubuntu/db_backups/backup.log 2>&1

四、 實作中出現的錯誤

  1. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
    • 解法:在指令最前面加上 sudo
  2. 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 設定每日定時備份,為專案的上線運行打下了堅實的後盾。


上一篇
Day 23 XSS 與輸入驗證
系列文
從零打造圖書管理系統:WSL2 × MySQL × Claude Code 的整合實作 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言