Windows 環境下 MySQL 定時備份是中小企業常見需求。本文提供基於批處理 + WinRAR + 計劃任務的生產可用全量/增量備份方案。
rar.exe)、MySQL Client (mysqldump, mysqladmin)
E:\mysql_bak\
├── data\ # 臨時導出目錄
├── full\ # 全量備份存放
│ └── db_20240115.rar
└── diff\ # 增量備份存放
└── mysql-bin_20240115.rar
@echo off
REM ===== 配置區 =====
set MYSQL_PATH="C:\Program Files\MySQL\MySQL Server 5.7\bin"
set BAK_PATH=E:\mysql_bak
set USER=root
set PASS=123456
set DBS=spirit_beast quartz_event
set RAR_PATH="C:\Program Files\WinRAR\rar.exe"
REM ===================
echo ###################################################################
echo # MySQL Full Backup - %date% %time%
echo ###################################################################
mkdir %BAK_PATH%\data 2>nul
REM 導出每個數據庫
for %%D in (%DBS%) do (
echo 正在備份 %%D ...
%MYSQL_PATH%\mysqldump -u%USER% -p%PASS% ^
--single-transaction ^
--default-character-set=utf8mb4 ^
--flush-logs ^
--master-data=2 ^
--delete-master-logs ^
--routines --triggers --events ^
%%D > %BAK_PATH%\data\%%D_%date:~0,4%%date:~5,2%%date:~6,2%.sql
if errorlevel 1 (
echo %%D 備份失敗!
exit /b 1
)
)
REM 壓縮打包
echo 正在壓縮...
%RAR_PATH% a -ag+YYYYMMDD -m5 %BAK_PATH%\full\ %BAK_PATH%\data\*.sql
if errorlevel 1 (
echo 壓縮失敗!
exit /b 1
)
REM 清理臨時文件
rmdir /s /q %BAK_PATH%\data
echo %date% %time% Full backup completed >> %BAK_PATH%\backup.log
echo ###################################################################
@echo off
REM ===== 配置區 =====
set MYSQL_PATH="C:\Program Files\MySQL\MySQL Server 5.7\bin"
set BAK_PATH=E:\mysql_bak
set USER=root
set PASS=123456
set RAR_PATH="C:\Program Files\WinRAR\rar.exe"
REM ===================
echo ###################################################################
echo # MySQL Incremental Backup - %date% %time%
echo ###################################################################
mkdir %BAK_PATH%\data 2>nul
REM 1. 刷新日志 (切換 Binlog,標記增量起點)
echo 刷新 Binlog...
%MYSQL_PATH%\mysqladmin -u%USER% -p%PASS% flush-logs
if errorlevel 1 (
echo flush-logs 失敗!
exit /b 1
)
REM 2. 複製新生成的 Binlog 文件
echo 複製 Binlog...
xcopy /e /c /h /y %MYSQL_PATH%\..\data\mysql-bin.* %BAK_PATH%\data\
REM 3. 壓縮打包
echo 正在壓縮...
%RAR_PATH% a -ag+YYYYMMDD -m5 %BAK_PATH%\diff\ %BAK_PATH%\data\mysql-bin.*
if errorlevel 1 (
echo 壓縮失敗!
exit /b 1
)
REM 4. 清理臨時文件
rmdir /s /q %BAK_PATH%\data
echo %date% %time% Incremental backup completed >> %BAK_PATH%\backup.log
echo ###################################################################
| 技術點 | 說明 | 注意事項 |
|---|---|---|
| --single-transaction | InnoDB 一致性快照,無鎖導出 | 僅適用 InnoDB,MyISAM 需鎖表 |
| --master-data=2 | 註釋記錄 Binlog 位置 | 便於從庫搭建、時間點恢復 |
| --flush-logs | 切換 Binlog 文件 | 全量備份後、增量備份前必須執行 |
| --delete-master-logs | 備份後刪除舊 Binlog | 慎用!需確認從庫已同步,建議手動清理 |
| flush-logs (增量) | 標記增量邊界 | 配合 xcopy 複製新 Binlog |
| Binlog 格式 | 必須 ROW 格式 | binlog_format=ROW,Statement 不安全 |
taskschd.mscMySQL_Full_Backup02:00 (業務低峰)cmd.exe,參數 /c E:\scripts\full_backup.batMySQL_Incr_Backup,每 1 小時 執行一次最高權限
REM 腳本末尾添加 - 上傳到 FTP 服務器
ftp -s:ftp_upload.txt
REM ftp_upload.txt 內容
open ftp.backup.server
user backup_user
password
binary
cd /mysql_backup/full
put %BAK_PATH%\full\db_%date:~0,4%%date:~5,2%%date:~6,2%.rar
bye
rar x db_20240115.rarmysql -uroot -p db < db_20240115.sqlmysqlbinlog mysql-bin.0000xx | mysql -uroot -p db
REM 路徑含空格必須雙引號包裹
set MYSQL_PATH="C:\Program Files\MySQL\MySQL Server 5.7\bin"
set RAR_PATH="C:\Program Files\WinRAR\rar.exe"
REM 日期格式化 (地域相關,建議 WMIC)
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value') do set datetime=%%I
set YYYYMMDD=%datetime:~0,8%
Windows 批處理備份方案雖不如 Linux Shell 靈活,但通過標準化腳本、計劃任務、定期演練,同樣能構建可靠的備份體系。核心原則:自動化、壓縮傳輸、異地存儲、定期驗證。