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                # 备份操作日志文件
posted @ 2025-09-23 14:37  Rix^._.^  阅读(85)  评论(0)    收藏  举报