Windows 環境下利用批處理 + 任務計劃實現 MySQL 每日自動備份,保留 6 代歸檔,含服務狀態檢測與自動啟動邏輯。
dbBackup.bat
@echo off
REM ===== 配置區 =====
SET MYSQL_BIN="C:\Program Files\MySQL\MySQL Server 5.7\bin"
SET BACKUP_DIR=D:\MySQL_Backup
SET DB_USER=root
SET DB_PASS=your_password
SET RETENTION_DAYS=6
REM ===================
cd /d %BACKUP_DIR%
REM 1. 檢測 MySQL 服務狀態 (3306 端口監聽)
netstat -na | find "0.0.0.0:3306" | find "LISTENING" > server.log
fc server.log nul >nul
IF ERRORLEVEL 1 (
ECHO [INFO] MySQL 服務未運行,嘗試啟動...
net start MySQL57
IF ERRORLEVEL 1 (
ECHO [ERROR] MySQL 啟動失敗,備份中止
GOTO END
)
)
REM 2. 執行備份 (帶日期時間戳)
SET DATE_STAMP=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
SET TIME_STAMP=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
SET BACKUP_FILE=%BACKUP_DIR%\backup_%DATE_STAMP%_%TIME_STAMP%.sql
%MYSQL_BIN%\mysqldump.exe -u%DB_USER% -p%DB_PASS% --all-databases --single-transaction --routines --triggers --events > %BACKUP_FILE%
REM 3. 壓縮備份文件
"C:\Program Files\7-Zip\7z.exe" a -tzip %BACKUP_FILE%.zip %BACKUP_FILE%
DEL %BACKUP_FILE%
REM 4. 清理舊備份 (保留最近 %RETENTION_DAYS% 天)
FORFILES /P %BACKUP_DIR% /M backup_*.zip /D -%RETENTION_DAYS% /C "cmd /c DEL @path"
:END
ECHO [INFO] 備份任務結束 %DATE% %TIME%
| 模塊 | 技術要點 |
|---|---|
| 服務檢測 | netstat + find 組合判斷 3306 端口 LISTENING 狀態,fc 比較文件差異決定 ERRORLEVEL |
| 日期時間戳 | %DATE:~0,4% 等切片提取年月日,避免地區格式差異建議用 wmic os get localdatetime 更穩健 |
| mysqldump 參數 | --single-transaction (InnoDB 熱備)、--routines/triggers/events (完整對象) |
| 壓縮工具 | 7-Zip 命令行版,壓縮率高、免費、支持命令行 |
| 舊文件清理 | FORFILES /D -N 按修改時間刪除 N 天前文件 |