当前位置: 代码网 > it编程>数据库>Mysql > windows服务器下备份mysql数据库的脚本分享

windows服务器下备份mysql数据库的脚本分享

2025年12月05日 Mysql 我要评论
根据mysql 5.7版本,我为您提供专门优化的备份脚本:1. mysql 5.7专用备份脚本创建 mysql57_backup.bat:@echo offchcp 65001 >nulclse

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

1. mysql 5.7专用备份脚本

创建 mysql57_backup.bat

@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

@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

@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

@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

常见问题解决

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连接
  • 密码正确无误

以上就是windows服务器下备份mysql数据库的脚本分享的详细内容,更多关于mysql数据库备份的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com