批处理调用MySql执行SQL脚本

本节将介绍怎样利用批处理脚本去调用 mysql 执行 sql 脚本。

背景

假如你现在正在开发一个系统,而系统版本迭代很快。每个版本都有对应的数据库SQL脚本,而我们将每个版本的数据库脚本使用名为“版本-日期.sql”的文件进行保存。当我们版本变多时,sql文件也就将变多。如下图:

上图中,1.0.0-*.sql ~ 1.2.0-*.sql 为每个版本的数据库 SQL 脚本。version.txt 文件中保存当前软件数据库版本;run.bat 保存批处理脚本;

需求

每次初始化/更新数据库时我们只需要执行 run.bat 脚本,然后根据 version.txt 中保存的当前软件版本信息,动态选择需要执行那些 sql。例如:当前版本为 1.1.2,当我们执行 run.bat 时,将数据库从 1.1.2 版本升级到最新版本(即 1.2.0);

实现

run.bat 脚本内容如下:

@echo off
if "%OS%" == "Windows_NT" setlocal enabledelayedexpansion
set "CURRENT_DIR=%cd%"

rem 数据库名称
set dbName=test
rem 数据库用户名
set dbUsername=root
rem 数据库密码
set dbPassword=XM_zm2019

rem 进入到批处理文件所在的目录
cd /d %~dp0
if not "%MYSQL_HOME%" == "" goto gotHome
rem 如果没有定义 MYSQL_HOME 环境变量,则将当前目录设置为 MySQL 主目录
set "MYSQL_HOME=%CURRENT_DIR%"
rem 判断 mysql.exe 和 mysqldump.exe 是否存在
if exist %MYSQL_HOME%\bin\mysql.exe (
    if exist %MYSQL_HOME%\bin\mysqldump.exe goto okExec
)
rem 如果还是没有找到 mysql.exe 和 mysqldump.exe
rem 则将 MYSQL_HOME 设置为默认目录 D:\mysql-5.7.24-winx64
set "MYSQL_HOME=D:\mysql-5.7.24-winx64"

:gotHome
rem 判断 mysql.exe 和 mysqldump.exe 是否存在
if exist %MYSQL_HOME%\bin\mysql.exe (
    if exist %MYSQL_HOME%\bin\mysqldump.exe goto okExec
)
echo mysql.exe 和 mysqldump.exe 不存在
goto END

:okExec
set "exe_mysql=%MYSQL_HOME%\bin\mysql.exe"
set "exe_mysqldump=%MYSQL_HOME%\bin\mysqldump.exe"

echo exe_mysql        %exe_mysql%
echo exe_mysqldump    %exe_mysqldump%

rem 检查 MySql 服务是否启动,如果没有启动直接退出
tasklist /NH | findstr /i "mysqld.exe" > nul && goto okScript
echo 检测到 MySql 服务未启动,请先启动 MySql 服务
goto END

:okScript
rem 提示用户是否备份
cd /d %~dp0
set /p is_bk=是否备份数据库(Y/N):
if "%is_bk%"=="Y" goto okBackup
if "%is_bk%"=="y" goto okBackup
goto oKImport

:okBackup
echo 数据库备份开始......
set last_script_name=%date:~0,10%
if not exist %cd%\db_bak (
    mkdir %cd%\db_bak
)
%exe_mysqldump% -u%dbUsername% -p%dbPassword% -R test > "%cd%\db_bak\bk_%last_script_name:/=-%_%time:~0,2%%time:~3,2%%time:~6,2%.sql"
if not "%errorlevel%"=="0" (
    echo ERROR: 备份数据库失败, CODE=%errorlevel%
    goto END
)
echo 脚本备份完成,文件:bk_%last_script_name:/=-%.sql

rem 开始导入数据库脚本
:oKImport
set /p version=<version.txt
if "%version%" equ "" (
    set version=0.0.0
    set continueInfo=全新安装数据库脚本
    goto continueConfirm
)
set continueInfo=从%version%版本升级到最新版数据库脚本

:continueConfirm
set /p continueFlag=%continueInfo%。确定要继续吗(Y/N):
if "%continueFlag%" equ "Y" goto startRun
if "%continueFlag%" equ "y" goto startRun
echo 不进行数据库脚本升级
goto END

:startRun
set currentVersion=%version:.=%
echo mysql脚本初始化开始......
for %%i in (*.sql) do (
    set "fileName=%%i"
    set "filePrefix=!fileName:.=!"
    set "prefixNum=!filePrefix:~0,3!"
    if !prefixNum! gtr %currentVersion% (
        echo 初始化脚本 -------- %%i
        %exe_mysql% -u%dbUsername% -p%dbPassword% < %%i
    )
)
echo mysql脚本初始化结束,时间:%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%

:END
pause

运行

(1)将 version.txt 文件的内容清空,然后执行 run.bat 脚本。运行结果如下:

(2)将 version.txt 文件的内容设置为 1.1.2,然后执行 run.bat 脚本。运行结果如下:

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号