1.首先是bat脚本的固定框架
@echo off
setlocal
endlocal
- @echo off 其中@抑制当前命令的回显,echo off关闭命令回显
- setlocal 和 endlocal 是 Windows 命令行脚本中用于限定本地环境变量作用范围的命令
2.然后设置下要备份的数据库的信息
rem 目标MySQL数据库信息
set DB_HOST=数据库ip
set DB_PORT=端口
set DB_USER=用户名
set DB_PASSWORD=密码
set DB_NAME=数据库名
set DB_LIST_FRONT_NAME=数据表名
- 由于bat的for循环中的变量调用搞得头痛我就没搞遍历数据表名列表
3.设置日志以及sql文件的保存位置
rem 设置日志文件路径
set LOG_FILE=Z:\demo\DataBaseBackup\execution_log.txt
rem 备份文件保存路径
set BACKUP_DIR=Z:\demo\DataBaseBackup\sql
4.定义动态的完整数据sql文件路径
rem 获取当前日期作为备份文件名的一部分
set CURRENT_YEAR=%DATE:~0,4%
set CURRENT_MONTH=%DATE:~5,2%
rem 减去 1,使用 ! 扩展变量,并加上括号
set /a PREVIOUS_MONTH=!CURRENT_MONTH! - 1
rem 处理跨年的情况
if !PREVIOUS_MONTH! lss 1 (
set PREVIOUS_MONTH=12
)
set CURRENT_DATE=%DATE:~8,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
rem 格式化年份和月份(月份不足两位前面补零)
set FORMATTED_YEAR=%CURRENT_YEAR%
if !PREVIOUS_MONTH! lss 10 set PREVIOUS_MONTH=0!PREVIOUS_MONTH! else set PREVIOUS_MONTH=!PREVIOUS_MONTH!
set DB_LIST_NAME=%DB_LIST_FRONT_NAME%_%FORMATTED_YEAR%_%PREVIOUS_MONTH%
rem 完整的备份文件路径
set BACKUP_FILE=%BACKUP_DIR%\%DB_LIST_NAME%.sql
- 当要用到 ! 的时候就需要在前面启用延迟扩展了,bat获取实时更新的变量就要用!
rem 启用延迟扩展
setlocal enabledelayedexpansion
5.使用mysqldump开始备份
rem 使用 mysqldump 命令进行备份
mysqldump -h %DB_HOST% -P %DB_PORT% -u %DB_USER% -p%DB_PASSWORD% %DB_NAME% --tables %DB_LIST_NAME% > %BACKUP_FILE% 2> %LOG_FILE%
- 我这还将数据库出错的内容重映射到了日志文件中
- 如果出现'mysqldump' 不是内部或外部命令,也不是可运行的程序,可以将mysqldump加入环境变量
6.打印日志
rem 设置执行语句对象
set RUNNER=mysqldump -h %DB_HOST% -P %DB_PORT% -u %DB_USER% -p%DB_PASSWORD% %DB_NAME% --tables %DB_LIST_NAME% ^> %BACKUP_FILE%
rem 检查备份是否成功
if !ERRORLEVEL! equ 0 (
echo %DATE:~0,10% %TIME%:MySQL备份成功,备份文件保存在: %BACKUP_FILE%,执行语句为: !RUNNER! >> %LOG_FILE%
) else (
echo %DATE:~0,10% %TIME%:MySQL备份失败,执行语句为: !RUNNER! >> %LOG_FILE%
echo 错误级别: !ERRORLEVEL! >> %LOG_FILE%
)
7.写一个脚本启动多个脚本
@echo off
setlocal
rem 启用延迟扩展
setlocal enabledelayedexpansion
rem 设置日志文件路径
set LOG_FILE=Z:\demo\DataBaseBackup\log\execution_log.txt
echo 备份开始 Time:%TIME% >> %LOG_FILE%
set DB_NAME=d1
start "Backup %DB_NAME%" call Z:\demo\DataBaseBackup\%DB_NAME%.bat
echo %DB_NAME%备份已启动 Time:%TIME% >> %LOG_FILE%
set DB_NAME=d2
start "Backup %DB_NAME%" call Z:\demo\DataBaseBackup\%DB_NAME%.bat
echo %DB_NAME%备份已启动 Time:%TIME% >> %LOG_FILE%
set DB_NAME=d3
start "Backup %DB_NAME%" call Z:\demo\DataBaseBackup\%DB_NAME%.bat
echo %DB_NAME%备份已启动 Time:%TIME% >> %LOG_FILE%
set DB_NAME=d4
start "Backup %DB_NAME%" call Z:\demo\DataBaseBackup\%DB_NAME%.bat
echo %DB_NAME%备份已启动 Time:%TIME% >> %LOG_FILE%
endlocal
-
这里注意其他bat脚本的路径要写全,因为用windows的schtasks命令定时启动bat的时候需要