Windows 環境下無 cron,但可結合批處理(.bat)與「任務計劃程序」實現 MySQL 定時自動備份。本文提供完整備份腳本、增量備份配置、物理文件備份替代方案,並解決路徑空格、編碼、服務依賴等 Windows 特有坑點。
@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 一致性不鎖表cmd.exe,參數:/c "D:\scripts\backup_db.bat"mysqldump 為全量備份,恢復到任意時間點需配合 Binlog。
[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
backup_20240115.sql.gzmysql -u root -p dbname < backup_20240115.sqlmysqlbinlog --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
優點:備份/恢復極快(文件級複製)、完整性高(含索引、權限、配置)。
缺點:需停機、跨版本/架構遷移不支援、佔用空間大(無壓縮)。
| 問題 | 原因 | 解決 |
|---|---|---|
| 路徑空格導致命令失敗 | 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 采集在 Windows 上落地可靠的 MySQL 備份體系,關鍵在於:標準化腳本參數化、任務計劃高可用配置、全量+增量組合、定期恢復演練。