根据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 特定配置
- 默认安装路径 :
C:\Program Files\MySQL\MySQL Server 5.7\bin - 字符集设置 :MySQL 5.7 默认使用
utf8,建议备份时指定--default-character-set=utf8mb4 - 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
备份优化建议
- 使用
--single-transaction进行一致性备份 - 使用
--routines备份存储过程和函数 - 使用
--events备份事件 - 使用
--triggers备份触发器 - 大型数据库可以分割备份文件
运行前请确保:
- MySQL 5.7 服务正在运行
- 备份目录有写入权限
- 防火墙允许MySQL连接
- 密码正确无误