😱 救命!硬碟又被吃光了!用 Python 打造「自動刪除備份檔」

你是否有過這種經歷?

某個平靜的清晨,你正端著咖啡準備開啟美好的一天,突然監報系統傳來刺眼的紅字警告:

[CRITICAL] Server Disk Space Usage: 99.8% !!!

你心裡一驚,打開伺服器一查,罪魁禍首不出所料——又是那些默默囤積、永無止境的 DB 備份檔(.bak)!

為了防止「伺服器暴斃」與「半夜被叫醒維護」的悲劇發生,今天我們就來聊聊怎麼用 Python 寫出一個聰明、安全又省心的 「.bak 檔案自動清理神器」

💣 備份檔的「膨脹魔咒」:為什麼硬碟總是不夠用?

在 IT 與開發者的日常裡,資料庫備份是我們的生命線。「每天備份一次」是基本常識,甚至有些高頻系統每小時都在備份。

一個每日 1GB 的 DB 備份檔,聽起來好像還好對吧?

  • 1 天 = 1 GB
  • 1 個月 = 30 GB
  • 半年 = 180 GB!
  • 1 年 = 365 GB!

如果你有好幾個資料庫,再加上歷史累積,硬碟空間很快就會像連假期間的高速公路一樣——卡到爆!

最可怕的是,許多系統管理者往往都是在硬碟被塞爆、服務掛掉的那一刻,才驚覺原來半年前的備份檔還躺在那裡吸血。

🦸‍♂️ 拯救硬碟!「備份檔終結者」腳本上陣

為了避免「手動刪檔刪到手軟」或是「誤刪最新備份直接準備提頭來見」,我們需要一個具備以下特性的自動化腳本:

  1. 預設安全機制(Dry-Run):先預覽「會刪哪些檔」,確認無誤再真的動手,安全感滿分!
  2. 彈性門檻設定:預設保留 180 天,但也支援隨時調整成 30 天或 90 天。
  3. 明確的視覺回饋:清楚標示每個檔案過期了多久(例如:185.2 天前),不再瞎猜。

💻 靈魂核心程式碼

來看看這個輕巧又強大的 Python 腳本(clean_bak.py):

import argparse
import sys
import time
from pathlib import Path


def cleanup_bak_files(
    target_dir: str, days: int = 180, execute_delete: bool = False
) -> None:
    target_path = Path(target_dir).resolve()

    if not target_path.exists() or not target_path.is_dir():
        print(f"❌ 錯誤:目標目錄 '{target_path}' 不存在。")
        sys.exit(1)

    now = time.time()
    files_found = 0
    files_matched = 0

    mode_label = (
        "🔥【實際刪除模式】" if execute_delete else "🛡️【模擬預覽模式 (Dry-Run)】"
    )
    print(f"🎯 目標目錄: {target_path}")
    print(f"⏳ 保留天數門檻: {days} 天")
    print(f"⚙️ 執行模式: {mode_label}\n" + "-" * 60)

    # 搜尋目錄下的所有 .bak 檔案
    for file_path in target_path.glob("*.bak"):
        files_found += 1
        mtime = file_path.stat().st_mtime
        file_age_days = (now - mtime) / 86400

        if file_age_days > days:
            files_matched += 1
            age_formatted = f"{file_age_days:.1f} 天前"

            if execute_delete:
                try:
                    file_path.unlink()
                    print(
                        f"🗑️ [已刪除]     {file_path.name} (修改時間: {age_formatted})"
                    )
                except Exception as e:
                    print(f"⚠️ [刪除失敗]   無法刪除 {file_path.name}: {e}")
            else:
                print(
                    f"👀 [將會刪除]   {file_path.name} (修改時間: {age_formatted})"
                )

    print("-" * 60)
    if not execute_delete:
        print(
            f"💡 預覽結束:在 {files_found} 個 `.bak` 檔案中,發現 {files_matched} 個超過 {days} 天老舊檔案。"
        )
        if files_matched > 0:
            print("👉 若要真正刪除這些檔案,請加上 `--delete` 參數重新執行!")
    else:
        print(
            f"🎉 清理完成:已成功釋放空間!刪除了 {files_matched} 個過期檔案。"
        )


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="預覽或刪除超過指定天數的 .bak 備份檔案。"
    )
    parser.add_argument(
        "directory",
        nargs="?",
        default=".",
        help="備份檔案所在的目錄路徑(預設為目前目錄)",
    )
    parser.add_argument(
        "--days",
        type=int,
        default=180,
        help="檔案保留天數上限(預設:180 天)",
    )
    parser.add_argument(
        "--delete",
        action="store_true",
        help="加入此參數以進行「實際刪除」操作",
    )

    args = parser.parse_args()
    cleanup_bak_files(args.directory, days=args.days, execute_delete=args.delete)

🛠️ 實戰演練:三步驟教你輕鬆上手

1️⃣ 第一步:演習比實戰重要!先來個「預覽演練」

預設狀態下,腳本只會「看」不會「刪」。直接執行腳本,看看有哪些老古董檔案準備該下架:

python clean_bak.py /var/backups/portal

輸出結果超清晰:

🎯 目標目錄: /var/backups/portal
⏳ 保留天數門檻: 180 天
⚙️ 執行模式: 🛡️【模擬預覽模式 (Dry-Run)】
------------------------------------------------------------
👀 [將會刪除]   portal_backup_2026_01_01_000000.bak (修改時間: 220.4 天前)
------------------------------------------------------------
💡 預覽結束:在 25 個 `.bak` 檔案中,發現 1 個超過 180 天老舊檔案。
👉 若要真正刪除這些檔案,請加上 `--delete` 參數重新執行!

2️⃣ 第二步:確定無誤,開火刪除!

確認過清單後,加上 --delete 參數,給過期檔案來個大掃除:

python clean_bak.py /var/backups/portal --delete

瞬間,硬碟空間就回歸綠色健康狀態,空氣都變得新鮮了!

3️⃣ 第三步:交給排程工具,一勞永逸!

工程師的終極目標就是「能自動化就絕不手動」。設定好 Linux CrontabWindows 工作排程器,讓伺服器每天半夜自動執行清理:

  • Linux (Crontab):
    0 2 * * * /usr/bin/python3 /path/to/clean_bak.py /var/backups/portal --delete >> /var/log/clean_bak.log 2>&1
    每天凌晨 02:00 自動掃描並清理,還會把紀錄寫進 log 檔,安心度 100%!

💡 經驗談:備份維護的黃金法則

  1. 離線/異地備份才是真愛:本地端只保留近 30~180 天的快取備份,更久遠的歷史資料請定期同步至 AWS S3、Google Cloud Storage 或冷儲存(Glacier)。
  2. 權限控管要做好:確保執行清理腳本的系統帳號只有該目錄的權限,避免權限過大衍生安全風險。
  3. 定期測試還原能還原的備份才叫備份,不能還原的只是佔空間的垃圾! 記得定期做備份還原演練喔!

結語

別再讓爆掉的硬碟毀了你的週末!快把這套 Python 腳本部署上線,讓伺服器自動保持清爽健康吧!

你平時是用什麼方式管理資料庫備份的呢?歡迎在下方留言交流你的「硬碟省空間妙招」! 👇

直接編輯或用 Gemini 編輯

點選任一處即可直接輸入及編輯,或選取文字,提示 Gemini 進行修改。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *