| 方式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 物理複製 (xtrabackup/cp) | 速度快、不阻塞寫入 | 需停庫或加全局鎖、跨版本遷移麻煩 | 大數據量、主從搭建 |
| 邏輯導出 | 跨版本兼容、可編輯 SQL、無需停庫 | 單線程、大表慢、恢復慢 | 中小數據量、異構遷移、定時備份 |
本文針對「數據量不大、需定時自動備份」場景,採用 mysqldump + .bat + Windows 任務計劃程序方案。
mysql_backup.bat 完整代碼@echo off
REM ===== 配置區 =====
set MYSQL_BIN="D:\Program Files\phpStudy\MySQL\bin"
set BACKUP_DIR=D:\bat
set DB_USER=root
set DB_PASS=root
set DB_LIST=scx scxdb
REM ===================
echo -------------------------
echo MySQL 定時備份 %date% %time%
echo -------------------------
REM 獲取日期戳 YYYYMMDD
set YYYY=%date:~0,4%
set MM=%date:~5,2%
set DD=%date:~8,2%
set DATE_STAMP=%YYYY%%MM%%DD%
cd /d %MYSQL_BIN%
for %%D in (%DB_LIST%) do (
set OUT_FILE=%BACKUP_DIR%\%%D_%DATE_STAMP%.sql
echo 正在備份 %%D -> %OUT_FILE% ...
mysqldump -u%DB_USER% -p%DB_PASS% %%D > %OUT_FILE%
if errorlevel 1 (
echo [ERROR] %%D 備份失敗!
) else (
echo [OK] %%D 備份完成。
)
)
echo 全部備份任務結束。
REM pause <-- 計劃任務運行時請註釋掉 pause
mysqldump -u -p db > file.sql:單庫導出,輸出重定向到文件。--single-transaction(InnoDB 必加):啟動一致性快照,不加表鎖,備份期間業務可正常讀寫。--routines --triggers --events:導出存儲過程/觸發器/事件,避免遺漏。--master-data=2:在輸出文件頭部以註釋形式記錄 binlog 位點,便於基於時間點恢復 (PITR)。gzip 壓縮:mysqldump ... | gzip > file.sql.gz 節省 70%+ 磁盤空間。cmd.exe,參數:/c D:\scripts\mysql_backup.bat。REM 在 bat 末尾添加:保留最近 7 天,刪除更舊文件
forfiles /p %BACKUP_DIR% /m *.sql /d -7 /c "cmd /c del @path"
forfiles /p %BACKUP_DIR% /m *.sql.gz /d -7 /c "cmd /c del @path"
建議異地同步:將 BACKUP_DIR 掛載到網絡共享或使用 rclone 上傳至對象存儲 (S3/OSS/COS)。
| 現象 | 原因 | 解決 |
|---|---|---|
| 備份文件 0 字節 | 密碼含特殊字符未轉義 | 用 --defaults-extra-file 指定配置文件傳遞密碼 |
| 任務計劃「運行中」卡住 | bat 末尾有 pause | 刪除或註釋 pause |
| 中文亂碼 | 字符集不一致 | 加 --default-character-set=utf8mb4 |