Windows 環境使用 BAT 腳本配合任務排程器實現 MySQL 定時備份。本文提供經過實測的健壯腳本,解決日期變數解析、檔名空格、密碼特殊字元等常見坑。
REM 1. 停止服務
net stop mysql
REM 2. 跳過授權表啟動 (新視窗保持開啟)
mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server 5.1\my.ini" --console --skip-grant-tables
REM 3. 新視窗無密登入修改密碼
mysql -u root -p
REM 直接 Enter
UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;
QUIT
REM 4. 關閉跳過授權視窗,正常啟動
net start mysql
@echo off
setlocal ENABLEDELAYEDEXPANSION
REM ===== 使用者配置區 =====
set BACKUP_ROOT=D:\Backup\MySQL
set DATABASES=hoomsun_credit
set DB_USER=root
set DB_PASS=root
set MYSQL_BIN=D:\mysql-5.6.21-winx64\bin
set WINRAR_PATH="C:\Program Files\WinRAR\WinRAR.exe"
REM =========================
REM --- 產生無空格時間戳檔名 (核心避坑) ---
set HH=%time:~0,2%
set HH=%HH: =0% REM 修正上午單位數小時前導空格
set TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%%HH%%time:~3,2%%time:~6,2%
set BACKUP_FILE=%DATABASES%_%TIMESTAMP%.sql
REM --- 建立日期分層目錄 ---
set YEAR=%date:~0,4%
set MONTH=%date:~5,2%
set DAY=%date:~8,2%
set BACKUP_DIR=%BACKUP_ROOT%\%YEAR%\%MONTH%\%DAY%
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"
cd /d "%BACKUP_DIR%"
echo 開始備份 %DATABASES% ...
echo 輸出檔案: %BACKUP_FILE%
REM --- 執行備份 ---
"%MYSQL_BIN%\mysqldump.exe" -u%DB_USER% -p%DB_PASS% %DATABASES% > "%BACKUP_FILE%" 2>nul
if errorlevel 1 (
echo [ERROR] mysqldump 失敗,錯誤碼 %errorlevel%
goto END
)
REM --- 可選壓縮 (需安裝 WinRAR) ---
if exist %WINRAR_PATH% (
echo 壓縮中...
%WINRAR_PATH% a -k -r -s -m1 -ep1 "%BACKUP_FILE:.sql=.rar%" "%BACKUP_FILE%" 2>nul
if not errorlevel 1 (
del /f /q "%BACKUP_FILE%"
echo 已壓縮並刪除原始 SQL
)
)
echo 備份完成: %BACKUP_DIR%\%BACKUP_FILE:.sql=.rar%
:END
endlocal
| 坑點 | 現象 | 根因 | 修正 |
|---|---|---|---|
| 日期變數前導空格 | 檔名含空格 `20240101 93045.sql` | `%time:~0,2%` 上午 9 點為 `" 9"` | `set HH=%HH: =0%` 替換空格為 0 |
| 編碼格式不一致 | 複製網路腳本執行亂碼/語法錯 | BAT 需 ANSI 編碼 (中文系統) | 記事本另存為 ANSI / Notepad++ 轉碼 |
| 密碼特殊字元 | 含 `&` `|` `>` `<` `^` `%` 失敗 | BAT 特殊字元需轉義 | 用 `^&` `^|` `^>` `^^` `%%` 或改用配置檔 |
| mysqldump 警告 | `Warning: Using a password on the command line...` | 命令列明文密碼不安全 | 生產環境用 `--defaults-extra-file` 指定加密配置檔 |
| 長路徑含空格 | 執行失敗/截斷 | 路徑未加雙引號 | 所有路徑變數用 `"%VAR%"` 包裹 |
REM my_backup.cnf (放在腳本同目錄,權限 600)
[client]
user=root
password="your&complex^pass"
host=127.0.0.1
port=3306
REM 腳本中調用
"%MYSQL_BIN%\mysqldump.exe" --defaults-extra-file=my_backup.cnf %DATABASES% > "%BACKUP_FILE%"
REM 還原測試腳本 (restore_test.bat)
mysql -u root -p test_db < D:\Backup\MySQL\2024\01\15\hoomsun_credit_20240115093045.sql
REM 或解壓後
WinRAR.exe x backup.rar
mysql -u root -p test_db < backup.sql