Windows 系统上 MySQL 数据库自动备份
以Windows10系统上MySQL8.4为例:
目标:
每周日进行一次全量备份
周一至周六每天进行一次增量备份
备份文件保留一定期限
📜 备份脚本
备份控制脚本backup_controller.bat
@echo off
REM 将命令行活动代码页设置为UTF-8编码
chcp 65001 > nul
REM 备份控制脚本 - 根据星期几执行全量或增量备份
setlocal
REM 获取当前星期几(0=周日,1=周一,...,6=周六)
for /f "tokens=2 delims==" %%i in ('wmic path win32_localtime get dayofweek /value') do set DAY=%%i
set /a DAY=%DAY%-1
REM 删除可能的多余空格
set DAY=%DAY: =%
echo [%date% %time%] 开始执行备份,今天是星期:%DAY%
REM 根据星期几执行不同的备份
if "%DAY%"=="0" (
echo [%date% %time%] 周日执行全量备份
call "full_backup.bat"
) else (
echo [%date% %time%] 周%DAY%执行增量备份
call "incr_backup.bat"
)
echo [%date% %time%] 备份控制脚本执行完成
endlocal
全量备份full_backup.bat
@echo off
chcp 65001 > nul
REM 全量备份脚本 (使用 --databases 参数)
setlocal enabledelayedexpansion
REM 设置数据库参数
set MYSQL_PATH=D:\Programs\MySQL\MySQL Server 8.4\bin
set BACKUP_ROOT=D:\MySQL_Backups
set DB_NAME=test-db
set DB_USER=root
set DB_PASSWORD=1234abcd
set DB_PORT=3306
REM 使用WMIC获取标准化的日期时间(YYYYMMDD格式)[7](@ref)
for /f "tokens=2 delims==" %%i in ('wmic os get localdatetime /value 2^>nul') do set datetime=%%i
set BACKUP_DATE=%datetime:~0,8%
REM 设置备份目录和文件
set FULL_BACKUP_DIR=%BACKUP_ROOT%\full
set BACKUP_FILE=%FULL_BACKUP_DIR%\%DB_NAME%_full_%BACKUP_DATE%.sql
set LOG_FILE=%BACKUP_ROOT%\backup.log
REM 创建备份目录
if not exist "%FULL_BACKUP_DIR%" mkdir "%FULL_BACKUP_DIR%"
echo [%date% %time%] 开始全量备份数据库: %DB_NAME% >> "%LOG_FILE%"
REM 执行全量备份
"%MYSQL_PATH%\mysqldump" -u%DB_USER% -p%DB_PASSWORD% -P%DB_PORT% --databases %DB_NAME% --single-transaction --routines --triggers --events --flush-logs --master-data=2 --default-character-set=utf8mb4 > "%BACKUP_FILE%"
REM 检查备份是否成功
if %errorlevel% equ 0 (
echo [%date% %time%] 全量备份成功: %BACKUP_FILE% >> "%LOG_FILE%"
REM 清理30天前的全量备份
forfiles /p "%FULL_BACKUP_DIR%" /m "*.sql" /d -30 /c "cmd /c del @path"
echo [%date% %time%] 已清理30天前的备份文件 >> "%LOG_FILE%"
) else (
echo [%date% %time%] 全量备份失败! 错误代码: %errorlevel% >> "%LOG_FILE%"
exit /b 1
)
echo [%date% %time%] 全量备份完成 >> "%LOG_FILE%"
endlocal
增量备份incr_backup.bat
@echo off
chcp 65001 > nul
REM 增量备份脚本 - 基于二进制日志
setlocal enabledelayedexpansion
REM 设置数据库参数
set MYSQL_PATH=D:\Programs\MySQL\MySQL Server 8.4\bin
set BACKUP_ROOT=D:\MySQL_Backups
set DB_NAME=test-db
set DB_USER=root
set DB_PASSWORD=1234abcd
set DB_PORT=3306
set BINLOG_SOURCE=D:\ProgramData\MySQL\MySQL Server 8.4\Data
REM 使用WMIC获取标准化的日期时间(YYYYMMDD格式)
for /f "tokens=2 delims==" %%i in ('wmic os get localdatetime /value 2^>nul') do set datetime=%%i
set BACKUP_DATE=%datetime:~0,8%
REM 设置增量备份目录和文件
set INCR_BACKUP_DIR=%BACKUP_ROOT%\incremental
set LOG_FILE=%BACKUP_ROOT%\backup.log
REM 创建备份目录
if not exist "%INCR_BACKUP_DIR%" mkdir "%INCR_BACKUP_DIR%"
echo [%date% %time%] 开始增量备份数据库: %DB_NAME% >> "%LOG_FILE%"
REM 刷新日志,生成新的二进制日志文件
"%MYSQL_PATH%\mysqladmin" -u%DB_USER% -p%DB_PASSWORD% -P%DB_PORT% flush-logs
REM 获取当前的二进制日志文件
"%MYSQL_PATH%\mysql" -u%DB_USER% -p%DB_PASSWORD% -P%DB_PORT% -N -s -e "SHOW BINARY LOG STATUS" > "%INCR_BACKUP_DIR%\current_binlog.txt"
REM 备份除了当前正在使用的二进制日志之外的所有日志文件
for /f "tokens=1 delims= " %%i in ('type "%INCR_BACKUP_DIR%\current_binlog.txt"') do (
set CURRENT_BINLOG=%%i
goto :break_loop
)
:break_loop
REM 复制所有已完成的二进制日志文件(排除当前正在使用的)
for %%f in ("%BINLOG_SOURCE%\mysql-bin.0*") do (
if "%%~nxf" lss "!CURRENT_BINLOG!" (
copy "%%f" "%INCR_BACKUP_DIR%\%BACKUP_DATE%_%%~nxf" >nul
echo [%date% %time%] 备份二进制日志: %%~nxf >> "%LOG_FILE%"
)
)
REM 清理7天前的增量备份
forfiles /p "%INCR_BACKUP_DIR%" /m "*.0*" /d -7 /c "cmd /c del @path"
echo [%date% %time%] 增量备份完成 >> "%LOG_FILE%"
endlocal

⚙️ 修改MySQL配置文件
打开MySQL配置文件 D:\ProgramData\MySQL\MySQL Server 8.4\my.ini
[mysqld]
log-bin=mysql-bin
server-id=1
# 这里的 2592000秒等于 30 天(30 * 24 * 60 * 60 秒)
binlog_expire_logs_seconds=2592000
binlog_format=ROW
保存并重启MySQL
# net stop MySQL80
net stop MySQL84
net start MySQL84
🗓️ 配置 Windows 任务计划程序
- 按 Win + R键,输入
taskschd.msc打开"任务计划程序" - 右键"任务计划程序库",选择"创建基本任务"
- 命名为"MySQL Daily Backup",点击"下一步"
- 选择"每天"触发器,设置开始时间为15:00,点击"下一步"
- 选择"启动程序",点击"下一步"
- 在"程序或脚本"框中选择备份控制脚本:






完成
验证备份完整性
手动备份恢复(示例)
:: 恢复全量备份(无需指定数据库,备份文件会自动处理)
mysql -uroot -p --default-character-set=utf8mb4 < "D:\MySQL_Backups\full\test-db_full_20250926.sql"
:: 按顺序应用增量备份
mysqlbinlog "D:\MySQL_Backups\incremental\20250926_mysql-bin.000001" | mysql -uroot -p --default-character-set=utf8mb4
mysqlbinlog "D:\MySQL_Backups\incremental\20250926_mysql-bin.000002" | mysql -uroot -p --default-character-set=utf8mb4
mysqlbinlog "D:\MySQL_Backups\incremental\20250926_mysql-bin.000003" | mysql -uroot -p --default-character-set=utf8mb4
...
脚本备份恢复(示例)
@echo off
chcp 65001 > nul
REM 设置基本参数
set MYSQL_PATH=D:\Programs\MySQL\MySQL Server 8.4\bin
set BACKUP_ROOT=D:\MySQL_Backups
set DB_NAME=test-db
set DB_USER=root
set DB_PASSWORD=1234abcd
REM 指定备份日期
set FULL_BACKUP_DATE=20250921
set TARGET_DATE=20250925
echo 开始恢复数据库到日期: %TARGET_DATE%
REM 恢复全量备份
echo 恢复全量备份...
"%MYSQL_PATH%\mysql" -u%DB_USER% -p%DB_PASSWORD% --default-character-set=utf8mb4 < "%BACKUP_ROOT%\full\%DB_NAME%_full_%FULL_BACKUP_DATE%.sql"
REM 恢复增量备份(按文件名字典序)
echo 恢复增量备份...
for /f "delims=" %%f in ('dir /b /on "%BACKUP_ROOT%\incremental\*_mysql-bin.*"') do (
echo 正在恢复: %%f
"%MYSQL_PATH%\mysqlbinlog" "%BACKUP_ROOT%\incremental\%%f" | "%MYSQL_PATH%\mysql" -u%DB_USER% -p%DB_PASSWORD% --default-character-set=utf8mb4
)
echo 数据库恢复完成!
文件结构示例:
D:\MySQL_Backups\
├── full\ # 全量备份目录
│ ├── test-db_full_20250914.sql
│ ├── test-db_full_20250921.sql
│ └── ...
├── incremental\ # 增量备份目录
│ ├── 20250922_mysql-bin.000001
│ ├── 20250922_mysql-bin.000002
│ ├── 20250922_mysql-bin.000003
│ ├── 20250923_mysql-bin.000001
│ ├── 20250923_mysql-bin.000002
│ ├── 20250924_mysql-bin.000001
│ ├── 20250925_mysql-bin.000001
│ ├── 20250926_mysql-bin.000001
│ ├── 20250926_mysql-bin.000002
│ ├── 20250926_mysql-bin.000003
| ├── ...
│ └── current_binlog.txt # 当前二进制日志状态文件
├── restore\ # 备份恢复目录
│ └── restore.bat
├── scripts\ # 备份脚本目录
│ ├── backup_controller.bat
│ ├── full_backup.bat
│ └── incr_backup.bat
└── backup.log # 备份操作日志文件

浙公网安备 33010602011771号