windows服务器mysql数据库备份脚本

根据MySQL 5.7版本,我为您提供专门优化的备份脚本:

1. MySQL 5.7专用备份脚本

创建 mysql57_backup.bat

perl 复制代码
@echo off
chcp 65001 >nul
cls
echo ============================================
echo    MySQL 5.7 数据库备份工具
echo    Database: jfdzyl
echo ============================================
echo.

REM ============ 配置区域 ============
REM 1. MySQL 5.7 路径(默认安装路径)
set "MYSQL_PATH=C:\Program Files\MySQL\MySQL Server 5.7\bin"
if not exist "%MYSQL_PATH%\mysqldump.exe" (
    echo [错误] 未找到 MySQL 5.7
    echo 请修改 MYSQL_PATH 为正确的安装路径
    pause
    exit /b 1
)

REM 2. 数据库连接信息
set DB_HOST=localhost
set DB_PORT=3306
set DB_USER=root
set DB_PASS=mysql
set DB_NAME=xxxx

REM 3. 备份设置
set BACKUP_ROOT="D:\MySQL_Backups\MySQL5.7"
set KEEP_DAYS=7           REM 保留最近7天备份
set MAX_BACKUPS=20        REM 最大保留备份文件数
set COMPRESS=true         REM 是否启用压缩

echo [信息] MySQL 5.7 路径: %MYSQL_PATH%
echo [信息] 数据库: %DB_NAME%@%DB_HOST%:%DB_PORT%

REM ============ 创建备份目录 ============
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do (
    set YEAR=%%c
    set MONTH=%%a
    set DAY=%%b
)

REM 处理日期格式(如果日期是yyyy/MM/dd格式)
if "%YEAR:~0,2%"=="20" (
    set DATE_STRING=%YEAR%%MONTH%%DAY%
) else (
    set DATE_STRING=%DAY%%MONTH%%YEAR%
    set YEAR=%DATE_STRING:~4,4%
    set MONTH=%DATE_STRING:~2,2%
    set DAY=%DATE_STRING:~0,2%
)

set TIMESTAMP=%TIME: =0%
set TIMESTAMP=%TIMESTAMP::=-%
set BACKUP_DIR=%BACKUP_ROOT%%YEAR%-%MONTH%-%DAY%
set LOG_FILE=%BACKUP_DIR%%DB_NAME%_backup.log

if not exist %BACKUP_ROOT% (
    mkdir %BACKUP_ROOT%
    echo [信息] 创建备份根目录: %BACKUP_ROOT%
)

if not exist "%BACKUP_DIR%" (
    mkdir "%BACKUP_DIR%"
    echo [信息] 创建备份目录: %BACKUP_DIR%
)

echo ============================================
echo 开始备份时间: %DATE% %TIME%
echo 备份目录: %BACKUP_DIR%
echo ============================================
echo.

REM ============ 执行备份 ============
set BACKUP_FILE=%DB_NAME%_%DATE_STRING%_%TIMESTAMP%.sql
set BACKUP_FILE_FULL=%BACKUP_DIR%%BACKUP_FILE%

echo [步骤1] 检查MySQL连接...
cd /d "%MYSQL_PATH%"
mysql.exe -h%DB_HOST% -P%DB_PORT% -u%DB_USER% -p%DB_PASS% -e "SELECT 1" >nul 2>&1
if errorlevel 1 (
    echo [错误] MySQL连接失败!
    echo 请检查:
    echo 1. MySQL 5.7服务是否运行
    echo 2. 用户名/密码是否正确
    echo 3. 端口号是否正确(默认:3306)
    pause
    exit /b 1
)
echo [成功] MySQL连接正常

echo.
echo [步骤2] 获取数据库信息...
mysql.exe -h%DB_HOST% -P%DB_PORT% -u%DB_USER% -p%DB_PASS% -N -B -e "SELECT table_schema 'Database', ROUND(SUM(data_length+index_length)/1024/1024,2) 'Size_MB' FROM information_schema.tables WHERE table_schema='%DB_NAME%' GROUP BY table_schema" 2>nul

echo.
echo [步骤3] 执行备份...
echo 开始时间: %TIME%
echo 备份文件: %BACKUP_FILE%

REM MySQL 5.7 优化备份参数
mysqldump.exe ^
    -h%DB_HOST% ^
    -P%DB_PORT% ^
    -u%DB_USER% ^
    -p%DB_PASS% ^
    --databases %DB_NAME% ^
    --default-character-set=utf8mb4 ^
    --single-transaction ^
    --routines ^
    --triggers ^
    --events ^
    --hex-blob ^
    --complete-insert ^
    --add-drop-database ^
    --add-drop-table ^
    --result-file="%BACKUP_FILE_FULL%" ^
    --log-error="%BACKUP_DIR%%DB_NAME%_dump_error.log"

if errorlevel 1 (
    echo [错误] 备份失败!
    if exist "%BACKUP_DIR%%DB_NAME%_dump_error.log" (
        echo 错误日志:
        type "%BACKUP_DIR%%DB_NAME%_dump_error.log"
    )
    pause
    exit /b 1
)

echo 结束时间: %TIME%
echo [成功] 数据库备份完成!

REM 获取文件大小
for %%F in ("%BACKUP_FILE_FULL%") do (
    set "FILE_SIZE=%%~zF"
    set "SIZE_MB=!FILE_SIZE:/1024/1024=!"
    set /a SIZE_MB=!FILE_SIZE!/1024/1024
    echo 文件大小: !FILE_SIZE! 字节 (!SIZE_MB! MB)
)

echo.
echo [步骤4] 验证备份文件...
REM 检查备份文件是否包含正确的结束标记
findstr /i "Dump completed" "%BACKUP_FILE_FULL%" >nul
if errorlevel 1 (
    findstr /i "-- Dump completed" "%BACKUP_FILE_FULL%" >nul
    if errorlevel 0 (
        echo [验证] 备份文件完整性检查通过
    ) else (
        echo [警告] 未找到标准结束标记,但文件已生成
    )
) else (
    echo [验证] 备份文件完整性检查通过
)

REM ============ 可选:压缩备份 ============
if "%COMPRESS%"=="true" (
    echo.
    echo [步骤5] 压缩备份文件...
    
    REM 检查7-Zip
    set "ZIP_PATH=C:\Program Files\7-Zip\7z.exe"
    if not exist "%ZIP_PATH%" (
        set "ZIP_PATH=%ProgramFiles%\7-Zip\7z.exe"
    )
    
    if exist "%ZIP_PATH%" (
        "%ZIP_PATH%" a -tzip -mx5 "%BACKUP_FILE_FULL%.zip" "%BACKUP_FILE_FULL%" >nul
        if errorlevel 0 (
            del "%BACKUP_FILE_FULL%"
            echo [成功] 压缩完成: %BACKUP_FILE%.zip
            set BACKUP_FILE_FINAL=%BACKUP_FILE_FULL%.zip
        ) else (
            echo [警告] 压缩失败,保留原文件
            set BACKUP_FILE_FINAL=%BACKUP_FILE_FULL%
        )
    ) else (
        echo [信息] 未找到7-Zip,使用未压缩备份
        set "COMPRESS=false"
        set BACKUP_FILE_FINAL=%BACKUP_FILE_FULL%
    )
) else (
    set BACKUP_FILE_FINAL=%BACKUP_FILE_FULL%
)

REM ============ 清理旧备份 ============
echo.
echo [步骤6] 清理旧备份...

REM 方法1:按天数清理
echo 清理超过%KEEP_DAYS%天的备份...
forfiles /p %BACKUP_ROOT% /s /m *.sql /d -%KEEP_DAYS% /c "cmd /c echo 删除: @path && del @path" 2>nul
forfiles /p %BACKUP_ROOT% /s /m *.zip /d -%KEEP_DAYS% /c "cmd /c echo 删除: @path && del @path" 2>nul

REM 方法2:按文件数量清理
echo 检查备份文件数量...
cd /d %BACKUP_ROOT%
for /f %%i in ('dir /b /s *.sql *.zip ^| find /c /v ""') do set COUNT=%%i
echo 当前备份文件总数: %COUNT%

if %COUNT% GTR %MAX_BACKUPS% (
    echo 超出最大限制(%MAX_BACKUPS%),清理最旧的文件...
    dir /b /s *.sql *.zip /o-d /t:c > "%BACKUP_ROOT%\backup_list.txt"
    
    setlocal enabledelayedexpansion
    set /a DEL_COUNT=%COUNT%-%MAX_BACKUPS%
    echo 需要删除!DEL_COUNT!个文件
    
    for /f "skip=%MAX_BACKUPS% delims=" %%F in ('dir /b /s *.sql *.zip /o-d /t:c') do (
        if exist "%%F" (
            echo 删除: %%F
            del "%%F"
        )
    )
    endlocal
)

REM 清理空目录
for /f "delims=" %%D in ('dir %BACKUP_ROOT% /ad /b /s ^| sort /r') do (
    dir "%%D" 2>nul | findstr "^[0-9]" >nul || (
        rmdir "%%D" 2>nul && echo 清理空目录: %%D
    )
)

echo.
echo ============================================
echo           备份摘要
echo ============================================
echo 数据库: %DB_NAME%
echo 备份时间: %DATE% %TIME%
echo 备份文件: %BACKUP_FILE_FINAL%
for %%F in ("%BACKUP_FILE_FINAL%") do (
    echo 文件大小: %%~zF 字节
)
echo 备份位置: %BACKUP_DIR%
echo 压缩状态: %COMPRESS%
echo ============================================
echo.

REM 记录日志
echo %DATE% %TIME% - 备份完成: %BACKUP_FILE_FINAL% >> "%LOG_FILE%"
for %%F in ("%BACKUP_FILE_FINAL%") do (
    echo 文件大小: %%~zF 字节 >> "%LOG_FILE%"
)

pause

2. 简易版备份脚本(快速使用)

创建 backup_simple.bat

bash 复制代码
@echo off
chcp 65001 >nul
title MySQL 5.7 备份工具

REM MySQL 5.7 默认安装路径
set MYSQL_PATH="C:\Program Files\MySQL\MySQL Server 5.7\bin"
set BACKUP_DIR="D:\MySQL_Backup"

REM 数据库配置
set DB_HOST=localhost
set DB_USER=root
set DB_PASS=mysql
set DB_NAME=jfdzyl

REM 创建备份目录
if not exist %BACKUP_DIR% mkdir %BACKUP_DIR%

REM 生成备份文件名
set DATESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%
set TIMESTAMP=%time:~0,2%%time:~3,2%%time:~6,2%
set TIMESTAMP=%TIMESTAMP: =0%
set BACKUP_FILE=%BACKUP_DIR%%DB_NAME%_%DATESTAMP%_%TIMESTAMP%.sql

echo 正在备份数据库 %DB_NAME% ...
echo 请稍候...

cd /d %MYSQL_PATH%
mysqldump -h%DB_HOST% -u%DB_USER% -p%DB_PASS% %DB_NAME% > "%BACKUP_FILE%"

if errorlevel 1 (
    echo 备份失败!
    pause
    exit /b 1
)

echo 备份成功!
echo 备份文件: %BACKUP_FILE%
for %%F in ("%BACKUP_FILE%") do (
    echo 文件大小: %%~zF 字节
)

REM 自动打开备份目录
explorer %BACKUP_DIR%
pause

3. 带验证的备份脚本

创建 backup_with_verify.bat

ini 复制代码
@echo off
chcp 65001 >nul
cls

echo MySQL 5.7 数据库备份验证工具
echo ==============================
echo.

set MYSQL_PATH="C:\Program Files\MySQL\MySQL Server 5.7\bin"
set BACKUP_DIR="D:\MySQL_Backup"
set DB_USER=root
set DB_PASS=mysql
set DB_NAME=jfdzyl

REM 生成备份文件
set TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%
set TIMESTAMP=%TIMESTAMP: =0%
set TIMESTAMP=%TIMESTAMP::=%
set BACKUP_FILE=%BACKUP_DIR%%DB_NAME%_%TIMESTAMP%.sql

echo 步骤1: 执行备份...
cd /d %MYSQL_PATH%
mysqldump -u%DB_USER% -p%DB_PASS^
    --databases %DB_NAME%^
    --single-transaction^
    --routines^
    --triggers^
    --events^
    --set-gtid-purged=OFF^
    --result-file="%BACKUP_FILE%"

if errorlevel 1 (
    echo [错误] 备份失败
    pause
    exit /b 1
)

echo 步骤2: 验证备份文件...
REM 检查文件大小
for %%F in ("%BACKUP_FILE%") do set FILESIZE=%%~zF
if %FILESIZE% LSS 1024 (
    echo [警告] 备份文件可能不完整 (大小: %FILESIZE% 字节)
) else (
    echo [通过] 文件大小: %FILESIZE% 字节
)

REM 检查文件内容
findstr /i "CREATE TABLE" "%BACKUP_FILE%" >nul
if errorlevel 1 (
    echo [错误] 备份文件不包含表结构
) else (
    echo [通过] 包含表结构定义
)

findstr /i "INSERT INTO" "%BACKUP_FILE%" >nul
if errorlevel 1 (
    echo [警告] 备份文件不包含数据插入语句
) else (
    echo [通过] 包含数据插入语句
)

REM 快速恢复测试(可选)
echo.
echo 步骤3: 快速完整性测试...
echo 测试表结构语法...
REM 这里可以添加更多验证逻辑

echo.
echo 备份验证完成!
echo 文件: %BACKUP_FILE%
echo 大小: %FILESIZE% 字节
echo.

pause

4. 任务计划配置脚本

创建 setup_scheduled_backup.bat

bash 复制代码
@echo off
chcp 65001 >nul
title 设置MySQL 5.7定时备份

echo 正在创建MySQL 5.7自动备份任务...
echo.

REM 创建备份脚本
(
echo @echo off
echo chcp 65001 ^>nul
echo set MYSQL_PATH="C:\Program Files\MySQL\MySQL Server 5.7\bin"
echo set BACKUP_DIR="D:\MySQL_Backup"
echo.
echo set DB_USER=root
echo set DB_PASS=mysql
echo set DB_NAME=jfdzyl
echo.
echo REM 生成带日期的文件名
echo for /f "tokens=1-3 delims=/ " %%a in ('date /t'^) do set DATE=%%a-%%b-%%c
echo set DATE=%%DATE:/=-%%
echo set BACKUP_FILE=%%BACKUP_DIR%%%%DB_NAME%%_%%DATE%%.sql
echo.
echo cd /d %%MYSQL_PATH%%
echo mysqldump -u%%DB_USER%% -p%%DB_PASS%% --databases %%DB_NAME%% --routines --triggers --events --single-transaction ^> "%%BACKUP_FILE%%"
echo.
echo echo 备份完成: %%DATE%% ^>^> "%%BACKUP_DIR%%\backup.log"
) > "%TEMP%\mysql_backup_task.bat"

REM 创建任务计划
schtasks /create /tn "MySQL5.7_Backup_%DB_NAME%" ^
    /tr "%TEMP%\mysql_backup_task.bat" ^
    /sc daily /st 02:00 ^
    /ru "SYSTEM" ^
    /rl HIGHEST ^
    /f

if errorlevel 1 (
    echo 任务创建失败,尝试使用管理员权限...
    echo 请右键以管理员身份重新运行此脚本
) else (
    echo 定时备份任务创建成功!
    echo 任务名称: MySQL5.7_Backup_%DB_NAME%
    echo 执行时间: 每天 02:00
    echo 备份目录: D:\MySQL_Backup
)

echo.
pause

5. 使用注意事项

MySQL 5.7 特定配置

  1. 默认安装路径C:\Program Files\MySQL\MySQL Server 5.7\bin
  2. 字符集设置 :MySQL 5.7 默认使用 utf8,建议备份时指定 --default-character-set=utf8mb4
  3. GTID特性 :如果启用了GTID,需要添加 --set-gtid-purged=OFF

常见问题解决

ini 复制代码
REM 如果遇到权限问题,可以尝试以下方法:

REM 1. 使用MySQL配置文件存储密码
echo [client] > my.cnf
echo host=localhost >> my.cnf
echo user=root >> my.cnf
echo password=mysql >> my.cnf

REM 2. 然后使用
mysqldump --defaults-file=my.cnf jfdzyl > backup.sql

REM 3. 删除配置文件(安全)
del my.cnf

备份优化建议

  1. 使用 --single-transaction进行一致性备份
  2. 使用 --routines备份存储过程和函数
  3. 使用 --events备份事件
  4. 使用 --triggers备份触发器
  5. 大型数据库可以分割备份文件

运行前请确保:

  1. MySQL 5.7 服务正在运行
  2. 备份目录有写入权限
  3. 防火墙允许MySQL连接
  4. 密码正确无误
相关推荐
Wenzar_18 分钟前
**零信任架构下的微服务权限控制:用Go实现基于JWT的动态访问策略**在现代云原生环境中,
java·python·微服务·云原生·架构
lUie INGA7 小时前
在2023idea中如何创建SpringBoot
java·spring boot·后端
极客on之路7 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家7 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE7 小时前
开启mysql的binlog日志
数据库·mysql
geBR OTTE7 小时前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
Porunarufu7 小时前
博客系统UI自动化测试报告
java
NineData8 小时前
NineData 新增支持 GaussDB 到 StarRocks 实时数据复制能力
后端
sghuter8 小时前
数字资源分发架构解密
后端·架构·dubbo