萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Windows 下 MySQL 定時備份實戰:批處理腳本 + 計劃任務 + 增量日誌方案

Windows 環境下無 cron,但可結合批處理(.bat)與「任務計劃程序」實現 MySQL 定時自動備份。本文提供完整備份腳本、增量備份配置、物理文件備份替代方案,並解決路徑空格、編碼、服務依賴等 Windows 特有坑點。

方案一:邏輯備份(mysqldump + 批處理 + 計劃任務)

1. 備份腳本 backup_db.bat

@echo off
REM ===== 配置區 =====
set MYSQL_HOME=D:\MySQL\bin
set HOST=localhost
set USER=root
set PASS=your_password
set DATABASE=weihe
set BACKUP_DIR=D:\db_backup
set DATE_FMT=%date:~0,4%%date:~5,2%%date:~8,2%
REM ====================

echo "MySQL Backup started at %time% ..."
"%MYSQL_HOME%\mysqldump.exe" -h%HOST% -u%USER% -p%PASS% --skip-lock-tables --single-transaction --routines --triggers --events %DATABASE% ^> "%BACKUP_DIR%\%DATABASE%_%DATE_FMT%.sql"

if errorlevel 1 (
    echo "Backup FAILED at %time%" ^>> "%BACKUP_DIR%\backup.log"
) else (
    echo "Backup SUCCESS at %time%" ^>> "%BACKUP_DIR%\backup.log"
    REM 可選:壓縮
    "%MYSQL_HOME%\..\..\bin\7z.exe" a -tgzip "%BACKUP_DIR%\%DATABASE%_%DATE_FMT%.sql.gz" "%BACKUP_DIR%\%DATABASE%_%DATE_FMT%.sql" ^> nul
    del "%BACKUP_DIR%\%DATABASE%_%DATE_FMT%.sql"
)
echo "MySQL Backup finished."

關鍵點:

  • 路徑含空格**必須雙引號包裹
  • %date:~0,4% 等切片依賴系統日期格式,建議用 wmic os get localdatetime 獲取標準格式
  • --single-transaction 保證 InnoDB 一致性不鎖表
  • 日誌記錄成敗,便於監控告警

2. 創建計劃任務

  1. 打開「任務計劃程序」→「創建基本任務」
  2. 觸發器:每日 / 每周 / 每月(建議凌晨 2-4 點低峰期)
  3. 操作:「啟動程序」→ 程式:cmd.exe,參數:/c "D:\scripts\backup_db.bat"
  4. 勾選「無論用戶是否登錄都要運行」、「使用最高權限運行」
  5. 條件/設置:取消「僅在網絡可用時啟動」,允許按需運行

方案二:增量備份(Binlog 歸檔)

mysqldump 為全量備份,恢復到任意時間點需配合 Binlog。

啟用 Binlog(my.ini)

[mysqld]
log-bin = D:/mysql_logs/binlog/binlog
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M
sync_binlog = 1

# 同步啟用錯誤/慢查詢日誌
log-error = D:/mysql_logs/error.log
slow_query_log = 1
slow_query_log_file = D:/mysql_logs/slow.log
long_query_time = 2

重啟服務:net stop mysql && net start mysql

恢復到任意時間點

  1. 找到最近一次全量備份文件 backup_20240115.sql.gz
  2. 解壓並導入:mysql -u root -p dbname < backup_20240115.sql
  3. 應用 Binlog 到目標時間:
    mysqlbinlog --start-datetime="2024-01-15 02:00:00" --stop-datetime="2024-01-15 14:30:00" \
      D:/mysql_logs/binlog/binlog.000001 | mysql -u root -p dbname

方案三:物理文件冷備份(停機備份、極速恢復)

@echo off
net stop mysql
xcopy "C:\mysql\data\bbs\*.*" "C:\db_bak\bbs\%date:~0,4%%date:~5,2%%date:~8,2%\" /S /E /I /Y /H /K
net start mysql

優點:備份/恢復極快(文件級複製)、完整性高(含索引、權限、配置)。
缺點:需停機、跨版本/架構遷移不支援、佔用空間大(無壓縮)。

Windows 特有坑點與解決

問題原因解決
路徑空格導致命令失敗Program Files 等目錄含空格所有路徑雙引號包裹,或用短路徑 PROGRA~1
日期格式切片失效地區設置不同(yyyy/MM/dd vs yyyy-MM-dd)用 for /f "tokens=2 delims==" %a in ('wmic os get localdatetime /value') do set DT=%a 取標準格式
服務依賴導致啟動失敗MySQL 依賴其他服務未就緒任務設置「僅在網絡可用時」或延遲啟動腳本 timeout /t 30
權限不足無法寫入備份目錄任務運行用戶無寫入權限指定具體用戶運行、授予目錄寫入權限
mysqldump 閃退無輸出密碼特殊字符(%、!、^、&)在 bat 中需轉義密碼寫獨立配置文件 --defaults-file=,或雙重轉義 ^^^%

監控與告警

  • 腳本寫入 backup.log,配合 Zabbix/Promtail 采集
  • 關鍵指標:備份耗時、文件大小、成功/失敗狀態、磁碟剩餘空間
  • 定期演練恢復:每季度至少一次全量+增量恢復演練,驗證 RPO/RTO

在 Windows 上落地可靠的 MySQL 備份體系,關鍵在於:標準化腳本參數化、任務計劃高可用配置、全量+增量組合、定期恢復演練。

copyright © 萬盛學電腦網 all rights reserved