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

背景

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

7612ebc206161fc23c4c8c99e12c34d5.png

上图中,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=

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% 

)

)

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 脚本。运行结果如下:

4e04f42b56663ace5bb1147b4c4b4a64.png

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

4dfa9df286bfdc83ef1dce3fbe617aac.png

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐