MySQL批处理备份脚本

ECHO OFF
COLOR 0A
CLS
REM ========================================
REM ====  2009-12-12  由 ClowLido 创建  ====
REM ====  2018-11-22  由 ClowLido 修改  ====
REM ========================================
REM 简介:
REM 本脚本可导出一个MySQL数据库中多个数据库实例,并在备份路径下记录日志。
REM 数据备份将被压缩,并打包成一个以“指定前缀_日期时间”命名的文件。
REM 打包成功后,用来压缩的数据备份将被自动删除以节约空间。
REM 可指定多个备份路径,自动删除备份路径下指定日期以前的过期文件。
REM 依赖文件:1.较新版本7-Zip压缩软件根目录下的7z.exe和7z.dll。
REM           2.对应版本MySQL数据库MySQL\bin下的mysqldump.exe。
REM 主要修改位置:本脚本偏上位置的====== 变量区域 ======
REM 可选修改位置:本脚本最末位置的==== 多地备份调用 ====
REM
REM 其他说明:
REM 请注意,在备份路径下,尽量不要防止其他文件。
REM 例如,最后修改时间在备份保留日期以前,且文件名开头与打包前缀相同的其他文件也可能被删除。
REM 修改某一备份文件的打包前缀部分,可避免被脚本自动删除。
REM 但是强烈建议将需要长期保存的备份文件复制到其他文件夹,以确保不会脚本错误删除。
REM 备份路径虽然支持带空格,但是不建议使用带空格的路径。
REM 多个数据库将被导出为独立的sql文件,格式为:数据名称_日期时间.sql,例如clowlido_20091212085111.sql。
REM 最后打包成一个压缩包,格式为:数据名称_日期时间.7z,例如clowlidocom_20091212085111.7z。
REM 建议将7z.exe、7z.dll、mysqldump.exe放在这个批处理所在目录下,
REM 否则请在下方变量区域为对应文件指定其所在目录。
REM 请注意,MySQL 8.0的mysqldump.exe用于旧版MySQL会报错
REM ===========================
SETLOCAL ENABLEDELAYEDEXPANSION
SET HOUR=%TIME:~0,2%
IF "%TIME:~0,1%"==" " SET HOUR=0%TIME:~1,1%
IF "%DATE:~2,1%"=="/" (
    REM 英文日期
    SET NOW=%DATE:~6,4%%DATE:~0,2%%DATE:~3,2%%HOUR%%TIME:~3,2%%TIME:~6,2%
    SET LOGNOW=%DATE:~6,4%-%DATE:~0,2%-%DATE:~3,2% %HOUR%:%TIME:~3,2%:%TIME:~6,2%
) ELSE (
    REM 中文日期
    SET NOW=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%HOUR%%TIME:~3,2%%TIME:~6,2%
    SET LOGNOW=%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2% %HOUR%:%TIME:~3,2%:%TIME:~6,2%
)
REM ===========================
REM ====== 变量区域 开始 ======
REM 数据库服务器IP地址
SET "HOST=127.0.0.1"
REM
REM 数据库开放端口
SET "PORT=3306"
REM
REM 数据库备份用户名称(确保该用户有对应数据库的相应权限)
SET "USERNAME=clowlido"
REM
REM 数据库备份用户密码
SET "PASSWORD=clowlidocom"
REM
REM 要备份数据库的名称,如果有多个库请用空格分隔
REM 每个数据库导出独立的sql文件,格式为:数据名称_日期时间
REM 例如:clowlido_20091212085111.sql、database_20091212085111.sql
SET "DATABASENAME=clowlido database"
REM
REM mysqldump.exe所在路径(例如:D:\MySQL\bin,默认是当前批处理所在目录)
SET "MYSQL=%~dp0"
REM
REM 7z.exe、7z.dll所在路径(例如:D:\7-Zip,默认是当前批处理所在目录)
SET "ZIP=%~dp0"
REM
REM 数据备份文件的主要存放路径
REM 这个路径十分重要,必须正确配置
SET "DSTPATH=D:\backup"
REM
REM -- 多地备份路径 开始 --
REM 此为可选配置
REM 多地备份路径,数据备份文件的其他存放路径
REM 需要同时修改此文件最下方的“多地备份调用”区域
REM 与最下方“多地备份调用”的命令成对使用
REM 使用方法:修改下方DSTPATH后面的数字即可,数字不可重复,不够用可自行复制添加,使用前去掉下方命令最前面“::”
::SET "DSTPATH1=E:\backup"
::SET "DSTPATH2=F:\backup"
REM -- 多地备份路径 结束 --
REM
REM 打包前缀名称,数据备份压缩后文件的前缀名称
REM 在备份路径下,超过指定日期,与打包前缀相同的文件也可能会被删除
SET "DATNAME=clowlidocom"
REM
REM 备份保留天数
SET "SAVEDAY=60"
REM
REM 本次备份文件名,格式为:打包名称_日期时间 clowlidocom_20091212085111
SET "FILENAME=%DATNAME%_%NOW%"
REM
REM 日志文件名,日志保存在备份路径下,主要存放路径
SET "LOGFILE=dbbackup.log"
REM ====== 变量区域 结束 ======
REM ===========================
REM ====== 校验参数 开始 ======
IF NOT EXIST "%DSTPATH%" (
    ECHO %LOGNOW% 未能发现数据备份路径,尝试创建目录 %DSTPATH%
    ECHO %LOGNOW% 未能发现数据备份路径,尝试创建目录 %DSTPATH%>> "%DSTPATH%\%LOGFILE%"
    MD "%DSTPATH%" >NUL 2>NUL
    IF EXIST "%DSTPATH%" (
        ECHO %LOGNOW% 数据备份路径创建成功,数据备份目录 %DSTPATH%
        ECHO %LOGNOW% 数据备份路径创建成功,数据备份目录 %DSTPATH%>> "%DSTPATH%\%LOGFILE%"
    ) ELSE (
        ECHO %LOGNOW% 数据备份路径创建失败,建议检查变量 %DSTPATH%
        GOTO :EOF
    )
) 2>NUL
IF NOT EXIST "%MYSQL%\mysqldump.exe" (
    ECHO %LOGNOW% 依赖程序路径配置错误,建议检查变量 mysqldump.exe
    ECHO %LOGNOW% 依赖程序路径配置错误,建议检查变量 mysqldump.exe>> "%DSTPATH%\%LOGFILE%"
    GOTO :EOF
) 2>NUL
IF NOT EXIST "%ZIP%\7z.exe" (
    ECHO %LOGNOW% 依赖程序路径配置错误,建议检查变量 7z.exe
    ECHO %LOGNOW% 依赖程序路径配置错误,建议检查变量 7z.exe>> "%DSTPATH%\%LOGFILE%"
    GOTO :EOF
) 2>NUL
IF NOT EXIST "%ZIP%\7z.dll" (
    ECHO %LOGNOW% 依赖程序路径配置错误,建议检查变量 7z.dll
    ECHO %LOGNOW% 依赖程序路径配置错误,建议检查变量 7z.dll>> "%DSTPATH%\%LOGFILE%"
    GOTO :EOF
) 2>NUL
REM ====== 校验参数 结束 ======
REM ===========================
REM 备份数据库到主路径
FOR %%N IN (%DATABASENAME%) DO (
    CALL :DBBACKUP %%N
)
REM ===========================
REM ====== 打包备份 开始 ======
REM 打包数据备份到主路径
IF EXIST "%DSTPATH%\*%NOW%.sql" (
    "%ZIP%\7z.exe" a -aoa -sdel -t7z -mx=9 -mmt -slp "%DSTPATH%\%FILENAME%.7z" "%DSTPATH%\*%NOW%.sql">NUL 2>NUL
) ELSE (
    "%ZIP%\7z.exe" a -aoa -sdel -t7z -mx=9 -mmt -slp "%DSTPATH%\ERROR_%FILENAME%.7z" "%DSTPATH%\*%NOW%.err">NUL 2>NUL
    ECHO %LOGNOW% 备份失败!!!错误日志文件 %DSTPATH%\ERROR_%FILENAME%.7z
    ECHO %LOGNOW% 备份失败!!!错误日志文件 %DSTPATH%\ERROR_%FILENAME%.7z>> "%DSTPATH%\%LOGFILE%"
    GOTO :EOF
)
FOR /F "TOKENS=*" %%M IN ('FORFILES -P "%DSTPATH%" /M "%FILENAME%.7z" /C "CMD /C ECHO @fsize"^ 2^>NUL') DO (
    IF %%~M GTR 0 (
        ECHO %LOGNOW% 打包压缩数据备份成功,目标压缩文件 %DSTPATH%\%FILENAME%.7z
        ECHO %LOGNOW% 打包压缩数据备份成功,目标压缩文件 %DSTPATH%\%FILENAME%.7z>> "%DSTPATH%\%LOGFILE%"
    ) ELSE (
        ECHO %LOGNOW% 打包压缩数据备份失败,目标压缩文件 %DSTPATH%\%FILENAME%.7z
        ECHO %LOGNOW% 打包压缩数据备份失败,目标压缩文件 %DSTPATH%\%FILENAME%.7z>> "%DSTPATH%\%LOGFILE%"
        GOTO :EOF
    ) 2>NUL
)
REM ====== 打包备份 结束 ======
REM ===========================
CALL :EXPIRED "%DSTPATH%"
GOTO :MULTIDIR
:DBBACKUP
REM ===========================
REM ====== 备份数据 开始 ======
"%MYSQL%\mysqldump.exe" -h%HOST% -P%PORT% -u%USERNAME% -p%PASSWORD% --log-error="%DSTPATH%\%1_%NOW%.err" %1 > "%DSTPATH%\%1_%NOW%.sql"
FOR /F "TOKENS=*" %%B IN ('FORFILES -P "%DSTPATH%" /M "%1_%NOW%.err" /C "CMD /C ECHO @fsize"^ 2^>NUL') DO (
    IF %%~B GTR 0 (
        ECHO %LOGNOW% 生成数据备份文件失败,目标备份文件 %DSTPATH%\%1_%NOW%.sql
        ECHO %LOGNOW% 生成数据备份文件失败,目标备份文件 %DSTPATH%\%1_%NOW%.sql>> "%DSTPATH%\%LOGFILE%"
        DEL /A /F "%DSTPATH%\%1_%NOW%.sql" >NUL 2>NUL
        GOTO :EOF
    ) ELSE (
        ECHO %LOGNOW% 生成数据备份文件成功,目标备份文件 %DSTPATH%\%1_%NOW%.sql
        ECHO %LOGNOW% 生成数据备份文件成功,目标备份文件 %DSTPATH%\%1_%NOW%.sql>> "%DSTPATH%\%LOGFILE%"
        DEL /A /F "%DSTPATH%\%1_%NOW%.err" >NUL 2>NUL
    ) 2>NUL
)
REM ====== 备份数据 结束 ======
REM ===========================
GOTO :END
:MULTIBKUP
REM ===========================
REM ==== 多地备份数据 结束 ====
IF "%~1"=="" (
    ECHO %LOGNOW% 多地备份路径配置错误,建议检查修正
    ECHO %LOGNOW% 多地备份路径配置错误,建议检查修正>> "%DSTPATH%\%LOGFILE%"
    GOTO :END
)
IF NOT EXIST "%~1" (
    ECHO %LOGNOW% 未能发现多地备份路径,尝试创建目录 %~1
    ECHO %LOGNOW% 未能发现多地备份路径,尝试创建目录 %~1>> "%DSTPATH%\%LOGFILE%"
    MD "%~1" >NUL 2>NUL
    IF EXIST "%~1" (
        ECHO %LOGNOW% 多地备份路径创建成功,数据备份目录 %~1
        ECHO %LOGNOW% 多地备份路径创建成功,数据备份目录 %~1>> "%DSTPATH%\%LOGFILE%"
    ) ELSE (
        ECHO %LOGNOW% 多地备份路径创建失败,建议检查变量 %~1
        GOTO :EOF
    )
) 2>NUL
COPY /Y "%DSTPATH%\%FILENAME%.7z" "%~1\%FILENAME%.7z" >NUL 2>NUL
FOR /F "TOKENS=*" %%N IN ('FORFILES -P "%~1" /M "%FILENAME%.7z" /C "CMD /C ECHO @fsize"^ 2^>NUL') DO (
    IF %%~N GTR 0 (
        ECHO %LOGNOW% 生成多地备份文件成功,目标备份文件 %~1\%FILENAME%.7z
        ECHO %LOGNOW% 生成多地备份文件成功,目标备份文件 %~1\%FILENAME%.7z>> "%DSTPATH%\%LOGFILE%"
        ECHO %LOGNOW% 生成多地备份文件成功,目标备份文件 %~1\%FILENAME%.7z>> "%~1\%LOGFILE%"
    ) ELSE (
        ECHO %LOGNOW% 生成多地备份文件失败,目标备份文件 %~1\%FILENAME%.7z
        ECHO %LOGNOW% 生成多地备份文件失败,目标备份文件 %~1\%FILENAME%.7z>> "%DSTPATH%\%LOGFILE%"
        ECHO %LOGNOW% 生成多地备份文件失败,目标备份文件 %~1\%FILENAME%.7z>> "%1\%LOGFILE%"
        GOTO :END
    ) 2>NUL
)
REM ==== 多地备份数据 结束 ====
REM ===========================
CALL :EXPIRED "%~1"
GOTO :END
:EXPIRED
REM ===========================
REM ====== 过期清理 开始 ======
REM 删除保留天数以前的备份
FOR /F "TOKENS=*" %%I IN ('FORFILES /D -%SAVEDAY% -P "%~1" /M *.* /C "CMD /C IF @isdir==FALSE ECHO @file"^ 2^>NUL') DO (
    FOR /F "TOKENS=1 delims=_" %%D IN ("%%~I") DO (
        IF "%DATNAME%"=="%%~D" (
            IF "%~1"=="%DSTPATH%" (
                DEL /A /F "%~1\%%~I" >NUL 2>NUL && ECHO %LOGNOW% 删除过期数据备份成功,过期备份文件 %~1\%%~I && ECHO %LOGNOW% 删除过期数据备份成功,过期备份文件 %~1\%%~I>> "%DSTPATH%\%LOGFILE%"
            ) ELSE (
                DEL /A /F "%~1\%%~I" >NUL 2>NUL && ECHO %LOGNOW% 删除多地过期备份成功,过期备份文件 %~1\%%~I && ECHO %LOGNOW% 删除多地过期备份成功,过期备份文件 %~1\%%~I>> "%DSTPATH%\%LOGFILE%" && ECHO %LOGNOW% 删除多地过期备份成功,过期备份文件 %~1\%%~I>> "%~1\%LOGFILE%"
            )
        )
    )
)
REM ====== 过期清理 结束 ======
REM ===========================
GOTO :END
:MULTIDIR
REM ===========================
REM ==== 多地备份调用 开始 ====
REM 与“变量区域”中“多地备份路径”配套使用
REM 使用方法:修改下方DSTPATH后面的数字即可,数字不可重复,不够用可自行复制添加,使用前去掉下方命令最前面“::”
::CALL :MULTIBKUP "%DSTPATH1%"
::CALL :MULTIBKUP "%DSTPATH2%"
REM ==== 多地备份调用 结束 ====
REM ===========================
GOTO :EOF
:END

发表评论

电子邮件地址不会被公开。 必填项已用*标注